这是我参与「第四届青训营 」笔记创作活动的第10天
3. Pulsar详解
3.1 Pulsar架构介绍
3.1.1 Pulsar Proxy
Pulsar客户端连接集群的两种方式:
- Pulsar Client --> Broker
- Pulsar Client --> Proxy
Pulsar Proxy的作用及应用场景:
- 部分场景无法知道Broker地址,如云环境或者Kubernetes环境
- Proxy提供类似GateWay代理能力,解耦客户端和Broker,保障Broker安全
3.1.2 Pulsar Broker
Pulsar Broker无状态组件,负责运行两个模块
- HTTP服务器:暴露了restful接口,提供生产者和消费者topic查找api
- 调度分发器:异步的tcp服务器,通过自定义二进制协议进行数据传输
Pulsar Broker作为数据代理层
- Bookie通信:作为Ledger代理负责和Bookie进行通讯
- 流量代理:消息写入ledger存储到Bookie;消息存在堆外,负责快速响应
3.1.3 Pulsar Storage
Pulsar数据存储Segment在不同存储中的抽象
- 分布式Journal系统(Bookeeper)中为Journal/Ledger
- 分布式文件系统(GFS/HDFS)中的文件
- 普通磁盘中为文件
- 分布式Blob存储为Blob
- 分布式对象存储中为对象
定义好抽象以后,即可实现多介质存储
L1(缓存)
- Broker使用堆外内存短暂存储消息
- 适用于Tail-Read读场景
L2(Bookeeper)
- Bookeeper使用Qurom写,能有效较低长尾
- 适用于Catch-Up较短时间内的较热数据
L3(S3等冷存)
- 存储成本低,扩展性好
- 适用于Catch-Up长时间内的冷数据
3.1.4 Pulsar IO 连接器
Pulsar IO 分为输入和输出两个模块
- 通过source实现数据输入
- 通过sink实现数据输出
Pulsar IO (也称Pulsar Connector)用于解决Pulsar与周边系统的集成问题,帮助用户高效完成工作
目前Pulsar IO支持非常多的连接集成工作,如HDFS、Spark、Flink、ES等
3.1.5 Pulsar Functions (轻量级计算框架)
Pulsar Functions 是一个轻量级计算框架,提供一个部署简单、运维简单、API简单的FAAS平台
- 提供基于事件的服务,支持有状态与无状态的多语言计算,是对复杂的大数据处理框架的有力补充
- 用户可以轻松部署和管理Function,从Pulsar topic读取数据或者生产新数据到Pulsar topic.
3.2.1 Bookeeper架构
3.2.2 Bookeeper基本概念
- Ledger:BK的一个基本存储单元,BK Client的读写操作都是以Ledger为粒度的
- Fragment:BK的最小分布单元(实际上也是物理上的最小存储单元),也是Ledger的组成单位,默认下一个Ledger会对应的一个Fragment(一个Ledger也可能由多个Fragment组成)
- Entry:每条日志都是一个Entry,它代表一个record,每条record都会有一个对应的entry id
3.2.3 Bookeeper读一致性
所有的Reader都可以安全读取Entry ID小于或者等于LAC的记录,从而保证reader不会读取未确认的数据,保证reader之间的一致性
3.2.4 Bookeeper读写分离
写入优化:
写入时,不但会写入到Journal中还会写入到缓存中,定期会做刷盘
读取优化:
先读Memtable没命中再通过索引读磁盘,Ledger Device中会维护一个索引结构,存储在RocksDB中,它会将(LedgerID, EntryID)映射到(EntryLogID, 文件中的偏移量)
3.3 Pulsar功能介绍
3.3.1 Pulsar生产模式
| Access Mode | Describtion |
|---|---|
| Shared | 多个Producer可以同时往一个Topic中生产消息 |
| Exclusive | 独占模式生产,只有一个Producer可以connect并生产消息,其他producer可以启动成功,作为stand-by |
| ExcusiveWithFencing | 独占模式生产,只有一个Producer可以connect并生产消息,其他producer可以启动时,老的Producer会断开连接 |
| WaitForExclusive | 独占模式生产,只有一个Producer可以connect并生产消息,其他Producer会卡在创建Producer环节 |
3.3.2 Pulsar消费模式
- Exclusive
- Failover
- Shared
- Key_Shared
3.3.2.1 Pulsar消费模式——Exclusive消费模式
独占订阅(Stream流模型)
独占订阅中,在任何时间,一个消费者组中有且只有一个消费者来消费topic中的消息
3.3.2.2 Pulsar消费模式——Failover消费模式
故障切换(Stream流模型)
使用故障切换模式,多个消费者可以附加到同一订阅。但是,一个订阅中的所有消费者,只会有一个消费者被选为该订阅的主消费者,其他消费者被指定为故障转移消费者。
3.3.2.3 Pulsar消费模式——Shared消费模式
共享订阅(Queue队列模型)
使用共享订阅,在同一个订阅背后,用户按照应用的需求挂载任意多的消费者。订阅中的所有消息以循环分发形式发送给订阅背后的多个消费者,并且一个消息仅传递给一个消费者。
3.3.2.4 Pulsar消费模式——Key_Shared消费模式
按Key共享订阅(Queue队列模型)
使用共享订阅,在同一个订阅背后,用户按照应用的需求挂载任意多的消费者。订阅中的所有消息以key-hash发送给订阅背后的多个消费者,并且一个消息仅传递给一个消费者。
3.5.1 存算分离
分层架构优势:
- 流量代理和数据存储解耦
- 流量代理层无状态,可快速扩容(K8S等弹性平台)
- 流量代理层可以对接海量的客户段连接
- 存储层负责数据存储,可以使用多级存储
计算层:
- 对写入的数据可以做简单的ETL预处理
- 可以做数据缓存,应用高扇出度的场景
- 无状态,扩容后能快速完成负载均衡
存储层:
- 按照数据冷热进行存储介质区分,降低成本
- 历史数据可海量保存,数据无价
- 可直接通过存储层接口读取数据,批式计算