参考:极客时间-Kafka核心技术与实战
内容:kafka副本机制、消费者重平衡、kafka控制器、消息可见性(高水位)。
1. kafka副本机制
副本机制的好处:
- 提供数据冗余
- 提供高伸缩性
- 改善数据局部性
副本定义:
只能追加写消息的提交日志。
副本角色:
基于领导者(Leader-based)的副本机制。
- 副本分成两类:领导者副本(Leader Replica)和追随者副本(Follower Replica)。
- 领导者副本处理所有的请求,追随者副本从领导者副本异步拉取消息。
- 领导者副本挂了,追随者副本会被选举成新的领导者。
基于领导者副本机制的好处:
- 方便实现“Read-your-writes”
- 方便实现单调读(Monotonic Reads)
In-sync Replicas(ISR):
- Leader副本在ISR副本集合中
- Follower副本落后Leader副本的时间不超过replica.lag.time.max.ms。
Unclean领导者选举:
不在ISR集合中的存活副本可以参与领导者选举。
2. 消费者组重平衡
触发条件:
- 组成员数量发生变化
- 订阅主题数量发生变化
- 订阅主题的分区数发生变化
重平衡通知:
通过心跳线程。
消费者组状态机:
Empty/Dead/PreparingRebalance/CompletingRebalance/Stable
消费者端重平衡:
JoinGroup和SyncGroup。
Broker端重平衡场景剖析:
新成员加入组、组成员主动离组、组成员崩溃离组、组成员提交位移。
3. Kafka控制器
作用:
在Apache Zookeeper的帮助下管理和协调整个kafka集群。
选举方式:
第一个成功创建/controller节点的broker。
职责:
- 主题管理(创建、删除、增加分区)
- 分区重分配
- Preferred领导者选举
- 集群成员管理(新增Broker、Broker主动关闭、Broker宕机)
- 数据服务
故障转移:
当运行中的控制器突然宕机或意外终止,Kafka能够快速的感知到,并立即启用备用控制器来代替之前失败的控制器。
重建zookeeper的/controller节点。
4. 高水位
作用:
- 定义消息可见性,用来标识分区下哪些消息可以被消费者消费。
- 帮组kafka完成副本同步。
高水位更新机制:
currentHW = max{currentHW, min(RemoteReplica1-LEO, RemoteReplica2-LEO, ...)}
副本同步机制:
Leader副本和Follower副本对应的高水位如何更新。