这是我参与「第四届青训营 」笔记创作活动的第12天
消息队列概述
消息队列是在消息的传输过程中保存消息的容器。
消息队列的应用场景:
- MQ 消息通道:
- 异步解耦(下游无需关注上游)
- 削峰填谷(MQ带缓存)
- 发布订阅(下游订阅即可消费)
- 高可用(各模块可用性独立)
- EventBridge 事件总线:
- 事件源:将云服务、自定义应用、SaaS应用等应用程序产生的事件消息发布到事件集
- 事件集:存储所接收的事件消息,根据事件规则将事件消息路由到事件目标
- 事件目标:消费事件消息。
- Data Platform 流数据平台
- 提供批/流数据处理能力
- 各类组件提供连接接口
- 提供 Streaming/Function 能力
- 根据数据 schema 灵活的进行数据预处理
常见消息队列: RabbitMQ、RocketMQ、Kafka、Pulsar,单机吞吐量依次提高,前两者采用主从架构,后两者采用分布式架构。
Kafka 详解
-
Kafka 架构介绍
- ZooKeeper:元数据存储;提供一致性和可用性;提供功能: watch观察节点状态机制、持久/临时节点能力
- Broker:
- 若干个Broker节点组成Kafka节点,主节点负责数据写入,副节点负责数据备份
- 作为消息的接收模块:使用React网络模型进行消息数据的接收
- 作为消息的持久化模块,进行消息的副本复制以及持久化
- 作为高可用模块,通过副本间的Failover进行高可用保证
- Controller:掌控节点的变更和决策,特殊Broker
- 去zk注册上controller节点的broker即为controller,其他就是watch controller节点
- 节点出现异常则进行重新注册。
- Coordinator:
- 负责topic-partition <-> consumer的负载均衡(Partition<->Broker之间只是映射关系)
- 根据不同场景提供不同的分配策略
-
Kafka 高可用
- 副本同步机制
- 提供isr副本复制机制,提供热备机制
- 写入ack机制;1:leader写入成功就成功;0:produver发送后即成功;-1:所有副本都成功
- 副本切换机制
- 提供clean/unclean副本选举机制
- clean:优先选取isr中的副本作为leader,若isr中无可用副本则partition不可用(更注重数据一致性)
- unclean:优先选取isr中的副本作为leader,若isr中无可用副本则选择其他存活副本(不能保证一致性,保证可用性)
- 提供clean/unclean副本选举机制
- 副本同步机制
-
Kafka 集群扩缩容
- Topic维度
- partition在各个broker之间的分布是均匀的
- 同一个partition的replica不会分布在一台broker
- Broker维度
- Broker之间的replica的数量是均匀的
- Topic维度
-
Kafka 未来演进之路
- 去除zookeeper依赖
- 存储计算分离演进
- 使用KRaft作为元数据和数据存储介质
-
Kafka 运维/调优经验介绍
- 单机吞吐,参数配置,指标可视化,扩缩容优化
Pulsar 详解
-
Pulsar 架构介绍
- Proxy:提供类似GateWay代理能力,保障Broker安全
- Broker:数据层代理器;运行两个模块:http服务器,调度分发器
- Storage:Pulsar数据存储Segment在不同存储中的抽象
- 多级存储,L1(缓存);L2(Bookkeeper);L3(S3等冷存)
- IO连接器
-
Bookkeeper 介绍
-
BookKeeper是优化实时工作负载的存储服务。
-
架构设计:Bookies 在启动的时候向 ZooKeeper 注册节点,Client 通过 ZooKeeper 发现可用的 Bookie。
-
基本概念: Ledger:BK中的基本存储单元;Fragment:BK的最小分布单元;Entry:日志
-
新建Ledger:
- Ensemble:一个Ledger所涉及的Bookie集合,可以控制一个 Ledger 的读写带宽;
- Write Quorum:控制一条记录的副本数;
- Ack Quorum:写每条记录需要等待的副本 Ack 数 ,控制时延;
- 增加 Ensemble,可以增加读写带宽(增加了可写的机器数);
- 减少 Ack Quorum,可以减长尾时延。
-
读/写一致性
- 写:每条记录会被 writer 赋予一个严格递增的 id,写成功更新Last-Add-Confirm指针。LAC 与 LAP(Pushed)差值为正在写数据
- 读:所有的 Reader 都可以安全读取 Entry ID 小于或者等于 LAC 的记录
-
读写分离
- 写入优化:写入时,不但会写入到Journal中还会写入到缓存(memtable)中,定期会做刷盘(刷盘前会做排序,通过聚合+排序优化读取性能)
- 读取优化:先读Memtable,没命中再通过索引读磁盘;Ledger Device中会维护一个索引结构,存储在RocksDB中,它会将(Ledgerld, Entryld) 映射到(EntryLogld,文件中的偏移量)
-
可以发现:Partition<->Broker之间只是映射关系,Broker在扩缩容的过程中只需要更改映射即可
-
-
Pulsar 功能介绍
- 生产模式
- 消费模式
- 多租户能力
- Plugin
- GEO Replication(异地备份)