Pulsar系统架构和原理
一、Pulsar
1.1、基本概念
Broker
Http服务暴露REST API,提供adminer、producer、consumer相关api
调度器,包含异步TCP服务,通过自定义二进制协议进行数据传输
纯计算,无状态
1.2、系统架构
消息写入流程
1、Productor通过SDK发送消息到Broker
2、Broker把消息划分到某个topic-partition-xx,topic-partition-xx对应一个系列Legder
3、通过Bookkeeper Client写入Legder。(Legder的Entry写入流程见Bookkeeper IO模型)
消息读取流程
多级缓存
一次IO,多读,并设置到缓存
目的:减少IO,提高读取性能
二、Bookkeeper
2.1、基本概念
Entry
- 代表一个消息,一个记录(record)
- 存储在Ledger中的最小单位
Ledger(pulsar中的segment)
类似于写文件系统,写文件时先打开一个文件描述符;如果文件不存在,则新建一个文件
1 2 3
write写数据时,先打开一个Ledger openLedger(组内Bookie节点数目、并发写Bookie数目、至少写成功Bookie数目)
一个Ledger包含多个Entry,append-only
Stream
是无界、无限的数据记录系列
一个Stream由多个Ledger组成,每个Ledger基于时间或空间滚动策略循环
与Ledger不同,Ledger只能运行一次,Stream可以运行多次
Bookie
- BookerKeeper中的存储服务器
- 负责Entry的读、写、存、多副本复制
- 单个bookie上存储ledger段,而不是整个ledger
- entries(ledger段)写入bookies一个可用分组,而不是所有bookies
2.2、系统架构
2.3、数据读写
读写架构:
IO模型
写流程:
1、entries到达Journal,以append方式实时刷盘到Journal盘
2、异步发送entries到memory table进行数据整理,按topic排序划分,方便读操作
3、index disk保存entry索引,logger disk保存entry原数据
读流程:
1、读缓存;从memory table中读取
2、读磁盘;从index disk和logger disk中读取
写高可用、低延时
高可用: 并发写入x个台bookie,且有y个台bookie返回成功才ack。以roundrobin的方式写入bookie,充分利用每台bookie资源
1 2 3
故障恢复:当bookie组中的的某个节点发生故障,会触发以下动作 1、记录entry id,封装故障节点数据 2、关闭当前ledger,重新打开一个新的ledger,新ledger的bookie组不包含故障节点
低延时:append-only机制
读高可用
写阶段实现了副本冗余
并行读;同时向多个bookies发起读请求
自动故障转移;若某个bookies读取失败,自动尝试其他副本
读写分离
- 见IO模型
强一致性
写阶段:Quorum机制,多数bookies写入成功才ack
读阶段:依赖版本号LAC(Last Add Confirmed)机制,客户端维护一个LAC值,表示当前最新的可见Entry ID,客户端只能读取到LAC之前的数据
ZooKKeeper元数据管理:自动副本修复,副本对比一致性
三、Pulsar与Bookkeeper
四、线上问题和解决
pulsar-go内存高,
- 原因:为复用内存,每个partition持有一个大字节buf作为压测优化。直达Producer关闭,buf才释放
- 解决:协程扫描partition的buf活跃程度,超时则释放buf
五、参考
技术总览:https://juejin.cn/post/7213983057899946040
pulsar VS bookkeeper:https://www.51cto.com/article/670179.html
bookkeeper: https://matt33.com/2019/01/28/bk-store-realize/
5张图带你了解Pulsar的存储引擎BookKeeper:https://developer.aliyun.com/article/1110763