从 Kafka 到 Pulsar的数据流演进之路笔记(一)| 青训营笔记
这是我参与「第四届青训营 -大数据场」笔记创作活动的第16天
一、消息队列概述
1. 消息队列应用场景
- MQ 消息通道
- EventBridge 事件总线
- Data Platform 数据流平台
1.1 MQ 消息通道
- 异步解耦(下游无需关注上游)
- 削峰填谷(MQ带缓存)
- 发布订阅(下游订阅即可消费)
- 高可用(各模块可用性独立)
1.2 EventBridge 事件总线
- 事件源:将云服务、自定义应用、SaaS应用等应用程序产生的事件消息发布到事件集
- 事件集:存储所接收的事件消息,根据事件规则将事件消息路由到事件目标
- 事件目标:消费事件消息
1.3 Data Platform 数据流平台
- 提供批/流数据处理能力
- 各类组件提供连接接口
- 提供 Streaming/Function 能力
- 根据数据 schema 灵活的进行数据预处理
2. 常见消息队列
二、Kafka 详解
1. Kafka 架构介绍
1.1 ZooKeeper
-
元数据存储
-
提供一致性(写入和读取)和可用性(一半以上节点存活即可读写)
-
提供功能:
- watch观察节点状态
- 持久/临时节点能力
1.2 Broker
- 若干个Broker节点组成Kafka节点,主节点负责数据写入,副节点负责数据备份
- 作为消息的接收模块:使用React网络模型进行消息数据的接收
- 作为消息的持久化模块,进行消息的副本复制以及持久化
- 作为高可用模块,通过副本间的Failover进行高可用保证
1.3 Controller
1.3.1 选举
- Broker启动会尝试去水中注册controller节点
- 注册上controller节点的 broker即为controller
- 其余 broker 会 watch controller节点,节点出现异常则进行重新注册
1.3.2 作用
- Broker重启/宕机时,负责副本的Failover切换
- Topic 创建/删除时,负责Topic meta 信息广播
- 集群扩缩容时,进行状态控制
- Partition/Replica状态机维护
1.4 Coordinator
-
负责topic-partition <-> consumer的负载均衡
-
根据不同的场景提供不同的分配策略
- Dynamic Membership Protocol
- Static Membership Protocol
- Incremental Cooperative Rebalance
2. Kafka 高可用
副本同步机制
- 提供lsr副本复制机制,提供热备机制
- 写入ack机制;1:leader写入成功就成功;0:produver发送后即成功;-1:所有副本都成功
副本切换机制
-
提供clean/unclean副本选举机制
- clean:优先选取isr中的副本作为leader;无可用,partition不可用(更注重数据一致性)
- unclean:优选选取isr中的副本作为leader,无可用选择其他存活副本(不能保证一致性,保证可用性)
3. Kafka 集群扩缩容
-
Topic维度
- partition在各个broker之间的分布是均匀的
- 同一个partition的replica不会分布在一台broker上
-
Broker维度
- Broker之间的replica的数量是均匀的
3.1 Kafka 集群缩容步骤
-
扩容Broker节点
- Leader 副本写入成功,Producer即认为写成功
-
计算均衡的Replica分布拓扑
- 保证Topic的partition在broker间分布均匀
- 保证Broker 之间Replica分布均匀
-
Controller负责新的副本分布元数据广播
- Controller将新的leader/follower信息广播给broker
-
Broker负责新副本的数据同步
- Broker上有需要同步数据的副本则进行数据同步
-
计算均衡的Replica分布拓扑
- 保证Topic的partition在 broker间分布均匀
- 保证Broker之间Replica分布均匀
-
Controller负责新的副本分布元数据广播
- Controller将新的leader/follower信息广播给broker
-
Broker负责新副本的数据同步
- Broker上有需要同步数据的副本则进行数据同步
-
下线缩容的 Broker节点
- 数据同步完毕之后下线缩容的 Broker节点
3.2 Kafka 扩集群缩容问题
-
扩缩容时间长
- 涉及到数据迁移,在生产环境中一次扩缩容可能要迁移TB甚至PB的数据
-
扩缩容期间集群不稳定
- 保证数据的完整性,往往会从最老的数据进行同步,这样会导致集群时刻处于从磁盘读取数据的状态,disk/netIcpu负载都会比较高
-
扩缩容期间无法执行其他操作
- 在一次扩缩容操作结束之前,无法进行其他运维操作(扩缩容)
4. Kafka 未来演进之路
- 去除zookeeper依赖
- 存储计算分离演进
- 使用KRaft作为元数据和数据存储介质
5. Kafka 运维/调优经验介绍
单机吞吐,参数配置,指标可视化,扩缩容优化