这是我参与「第四届青训营 」笔记创作活动的第5天
消息队列
消息队列在各个领域扮演的角色
消息队列的应用场景
- MQ消息通道(类比Queue的概念)
- 异步解耦
- 削峰填谷(消息可暂时缓存)
- 高可用(大模块解耦为小模块)
- 发布订阅(topic订阅)
- EventBridge事件总线
- 事件源:将云服务、自定义应用、SaaS应用等应用程序产生的事件消息发布到事件集
- 事件集:存储接收到的事件消息,根据事件规则路由到事件目标
- 事件目标:消费事件消息(云函数,MQ,Kafka,更多触发)
- Data Platform 数据流平台
- 提供批流数据处理能力
- 各类组件提供各类Connect
- 提供Streaming/Function能力
- 提供数据schema灵活的进行数据预处理
主流消息队列
- RabbitMQ(Erlang,主从)
- RocketMQ(java,主从)
- Kafka(java/Scala,分布式)
- Pulsar(java,分布式)
由于大数据的兴起,大数据生态组件都是由java开发,消息队列往往配合其他大数据组件使用,所以后面较新的消息队列都由java或scala开发
kafka详解
Kafka官网:kafka.apache.org/
Kafka 架构介绍
架构图:
Zookeeper
存储Kafka的一些元数据
- Broker Meta信息(临时节点)
- Controller 信息(临时节点)
- Topic 信息(持久节点)
- Config信息(持久节点)
zk的选举机制:Paxos机制
提供一致性:写入(强一致性);读取(会话一致性)
可用性:一半以上节点存活即可读写
功能:watch机制和持久/临时节点能力
Broker
kafka集群中包含的服务器,使用NIO模型
- 若干个Broker系欸但组成Kafka集群
- 作为消息接收模块,使用React网络模型进行消息数据的接收
- 作为消息持久化模块,进行消息的副本复制以及持久化
- 作为高可用模块,通过副本间的Failover进行高可用保证
Controller
特殊的broker
Broker启动尝试去zk中注册controller节点; 抢锁,抢到锁的为controller节点; 其余broker会watch controller节点,节点出现异常则重新进行注册
作用:
- 副本Failover切换
- Topic 创建/删除时,负责Topic信息广播
- 集群扩缩容时,进行状态控制
- Partition/Replica状态机维护
Coordinator
- 负责topic-partition与consumer的负载均衡
- 灵活调整分配策略
Kafka 高可用
可用性定义:服务的正常运行时间
副本ISR机制
- AR 已经分配的所有副本
- OSR 很久没有同步数据的副本
- ISR 一直在同步数据的副本,可作为热备切换
对于由三台broker组成的集群,一个leader,两个follower
- leader和follower统称为Replica
- leader+follower+follower = AR
- 正在进行数据同步的follower+leader = ISR
- 如果某个follower由于故障没有进行数据同步则为OSR
写入Ack机制
- Ack=1
- leader 副本写入成功,则Producer认为写入成功
- Ack=0
- OneWay模式
- Producer发送即为成功
- Ack=-1
- ISR 所有副本写入成功,则Producer认为写入成功
副本同步
两个概念:
- LEO:日志最末尾的数据
- HW:ISR中最小的LEO作为HW,HW的消息为Comsumer可见的消息
所以消费者只能消费HW也就是所有ISR中都已经同步的数据
副本选举
- Clean选举 更注重数据一致性
- Unclean选举 做出数据可用性和一致性的权衡
Kafka 集群扩缩容
为什么扩缩容?
- partition在各个broker之间的分布是均匀的
- 同一个partition的replica不会分布在一台broker上
- broker之间的replica的数据是均匀的
扩容步骤
- 扩容broker节点
- 计算均衡的Replica分布拓扑
- controller负责新的副本分布元数据广播
- broker负责新副本的数据同步
缩容和扩容大同小异
扩缩容问题:
- 时间长
- 扩缩容期间集群不稳定
- 扩缩容期间无法执行其他运维操作
Kafka 未来演进之路
- 去除zk的依赖
- 使用kRaft作为元数据和数据存储介质
- 存储计算分离演进
Kafka 运维/调优经验介绍
- 单机吞吐
- 参数配置
- 扩缩容优化
- 指标可视化
总结
本次课程介绍了大数据组件消息队列kafka,深入探讨了Kafka的基础架构,介绍了kafka的关于副本的一些重要机制,例如副本ISR机制、写入Ack机制、副本同步;有利于开发人员对kafka的底层原理的理解,也有助于后续kafka开发的学习。后续会进行另外一个消息队列Pulsar的课程笔记总结,关于kafka的运维调优可以参考官网和网上博客。