Kafka02-集群选主
Kafka知识点
文章目录
- Kafka知识点
- @[toc]
- 1-Kafka02-集群选主
- 1-kafka为什么抛弃zookeeper?
- 一、Zookeeper 的“重”体现在哪里?
- 二、Kafka 的替代方案:KRaft(Kafka Raft)
- KRaft 的核心机制:
- 三、为什么 KRaft 更“轻”?
- 四、总结一句话
- 2-RAFT的的实现机制
- 3-RAFT的的实现机制-故事理解
- 4-kafka如何借助zookeeper进行选举的?
- 5-ZooKeeper 的选举机制如何保证公平性?
- 6-kafka是如何选取leader和follow?
- 1. 先给出技术答案(供你随时“查表”)
- 2. 小故事:蜂巢里选“蜂王”(Kafka 版)
- 2.1 三个工蜂候选人
- 2.2 蜂王登记处
- 2.3 日常采蜜
- 2.4 蜂王意外
- 2.5 故事寓意
- 3. 一句话总结
- 7-kafka如何选取controller?
- 🏰 第一章:权杖的诞生
- ⚔️ 第二章:权杖的失落
- 🧠 第三章:纪元的力量
- 🏁 尾声:永恒的守护
文章目录
- Kafka知识点
- @[toc]
- 1-Kafka02-集群选主
- 1-kafka为什么抛弃zookeeper?
- 一、Zookeeper 的“重”体现在哪里?
- 二、Kafka 的替代方案:KRaft(Kafka Raft)
- KRaft 的核心机制:
- 三、为什么 KRaft 更“轻”?
- 四、总结一句话
- 2-RAFT的的实现机制
- 3-RAFT的的实现机制-故事理解
- 4-kafka如何借助zookeeper进行选举的?
- 5-ZooKeeper 的选举机制如何保证公平性?
- 6-kafka是如何选取leader和follow?
- 1. 先给出技术答案(供你随时“查表”)
- 2. 小故事:蜂巢里选“蜂王”(Kafka 版)
- 2.1 三个工蜂候选人
- 2.2 蜂王登记处
- 2.3 日常采蜜
- 2.4 蜂王意外
- 2.5 故事寓意
- 3. 一句话总结
- 7-kafka如何选取controller?
- 🏰 第一章:权杖的诞生
- ⚔️ 第二章:权杖的失落
- 🧠 第三章:纪元的力量
- 🏁 尾声:永恒的守护
1-Kafka02-集群选主
1-kafka为什么抛弃zookeeper?
Kafka 抛弃 Zookeeper 的核心原因可以归结为一句话:Zookeeper 太重,Kafka 想轻装上阵。这个“重”主要体现在以下几个方面:
一、Zookeeper 的“重”体现在哪里?
维度 | 具体表现 |
---|---|
部署复杂 | Zookeeper 是一个独立于 Kafka 的分布式系统,部署 Kafka 时必须先部署并维护一个高可用的 Zookeeper 集群。 |
运维成本高 | Zookeeper 有自己的配置、监控、升级和安全策略,管理员需要同时掌握和维护两套系统。 |
性能瓶颈 | Zookeeper 的写性能有限,Kafka 在 broker 数量或分区数增长时,Zookeeper 会成为扩展瓶颈。 |
一致性风险 | Zookeeper 与 Kafka 的元数据同步是异步的,可能出现状态不一致或延迟,导致 leader 选举失败或脑裂。 |
安全模型割裂 | Zookeeper 的安全机制(如 ACL、TLS)与 Kafka 不完全兼容,配置复杂且容易出错。 |
二、Kafka 的替代方案:KRaft(Kafka Raft)
Kafka 从 2.8 开始引入 KRaft 模式(Kafka Raft Metadata mode),并在 3.3.1 起正式生产可用。
KRaft 的核心机制:
- Raft 协议:Kafka 自己实现了一个基于 Raft 的共识协议,用于在多个 controller 节点之间同步元数据。
- 事件溯源(Event Sourcing):所有集群状态变更(如 topic 创建、分区 leader 变更)都作为事件写入一个内置的 Kafka topic(
__cluster_metadata
)。 - Quorum Controller:Kafka 集群中的一部分 broker 充当 controller,组成一个 quorum(多数派)来管理元数据,不再依赖外部系统。
三、为什么 KRaft 更“轻”?
维度 | Zookeeper 模式 | KRaft 模式 |
---|---|---|
部署 | 需额外部署 Zookeeper 集群 | 仅需 Kafka 本身 |
启动 | 多进程(Kafka + ZK) | 单进程即可启动 Kafka |
一致性 | 异步同步,滞后风险 | 基于 Raft 的强一致性 |
扩展性 | 分区上限约 20 万 | 可支持数百万分区 |
故障恢复 | 需从 Zookeeper 加载状态 | 内存中已有最新状态,恢复更快 |
安全模型 | 两套系统,配置复杂 | 统一安全模型,简化配置 |
四、总结一句话
Kafka 抛弃 Zookeeper,是因为它太重:部署重、运维重、性能瓶颈重、一致性风险重。
用 KRaft 替代后,Kafka 变成了“自我管理”的系统——轻部署、轻运维、强一致、高扩展。
2-RAFT的的实现机制
Raft 把共识问题拆成 3 个独立子问题,用一套“日志复制”机制解决:
-
Leader 选举
每个节点维护一个递增的“任期号”;超时没收到 Leader 心跳就自增任期、投自己一票并拉票,先得多数票的成为新 Leader,其余节点自动降为 Follower。 -
日志复制
所有客户端写请求只发给 Leader。Leader 把命令追加到自己的日志,并行地发给所有 Follower;当这条日志在多数节点落盘后,Leader 提交(commit)它并应用到状态机,再通知 Follower 提交。 -
安全性
• 投票限制:只有日志比自己“新”的候选者才能拿到票,防止旧 Leader 重新当选。
• 任期检查:节点只接受来自当前或更高任期 Leader 的日志;过期消息会被拒绝。
• 已提交日志不可被覆盖,保证状态机一致性。
实现上就是:心跳保活、日志条目顺序复制、多数派确认、任期号+投票规则防脑裂。
3-RAFT的的实现机制-故事理解
小村庄里有三位记帐先生:阿福、阿寿、阿喜。
他们共用一本“神奇账本”,必须保证三人的账页完全一致。
1️⃣ 选“大当家”(Leader 选举)
每天太阳一升,谁先敲锣喊“我活得好好的”,谁就当大当家。
如果锣声停了(心跳超时),其余两人就各自敲一下“竞选锣”,喊“任期+1!给我投票!”
谁先得到两张选票(多数),谁立刻变成新大当家,其他人自动收摊当跟班。
2️⃣ 一起抄账(日志复制)
只有大当家能接客。
客人来借钱,大当家先写在自己的账页上,然后立刻把这一行抄给两位跟班。
当至少两人(含大当家共多数)都写完并盖章,大当家当众大喊“这一页生效!”
跟班们也跟着喊“生效!”——整本账同步完成。
3️⃣ 防捣乱(安全性)
• 投票规矩:谁的账页最新、任期最高,才配当大当家,旧人别抢。
• 任期印章:每页账都盖当天“任期章”,过期章立即作废。
• 一旦某一页当众宣布生效,就永远不许涂改,确保三人的账本永远一致。
从此,三位先生靠“锣声保活、抄账同步、任期防乱”,把全村账目管得清清楚楚,人人记得住、用得来。
4-kafka如何借助zookeeper进行选举的?
从前,在一个叫“卡夫卡”的大蜂巢里,住着成千上万只勤劳的小蜜蜂(Broker)。它们每天嗡嗡地搬运花粉、酿蜜、存蜜,忙得不可开交。可是蜂巢里必须有一位“蜂王”(Controller),负责发号施令:哪块蜂蜡该挪走、哪间蜂房归谁用、哪只蜜蜂突然失联了要赶快补缺……没有蜂王,整个蜂巢就会乱成一锅粥。
可蜂王不能世袭,也不能打架抢位,得“民主”选出来。于是,蜜蜂们把家安在一棵巨大的“决策树”(ZooKeeper)上。这棵树有三样法宝:
- 魔法便签(ZNode):谁都能在上面贴小纸条。
- 一次只能看一张的“放大镜”(ephemeral sequential):保证同一时间只有一只蜜蜂能看清便签内容。
- 树精灵(Watcher):一旦有人贴了纸条或撕了纸条,树精灵立刻放声大喊,通知所有蜜蜂。
选举日到了——
-
贴竞选宣言
每只想当蜂王的蜜蜂,都扑棱着翅膀飞到决策树前,在同一条树枝上贴一张“竞选宣言”(创建一个名为/kafka/controller
的 ephemeral 节点),并在背面写上自己的“蜂号”(broker id)。因为放大镜一次只能看一张,先到的蜜蜂会成功贴上,后到的只能看到“已被占用”,遗憾落选。 -
宣布当选
贴成功的蜜蜂立刻化身为蜂王,开始统筹蜂巢事务;落选的蜜蜂也不闲着,它们当“备胎”,死死盯着那张竞选宣言,耳朵竖得比兔耳朵还直——只要树精灵喊一声“宣言被撕了”(节点消失),备胎们就再次蜂拥而上,重新贴宣言、重新抢位。 -
蜂王驾崩与再选
万一现任蜂王太累、生病、或者被熊孩子捅了一棍(进程崩溃或网络分区),它贴的宣言就会自动被树精灵撕掉(ephemeral 节点随会话消失)。树精灵一声吼,所有备胎蜜蜂瞬间得知“蜂王没了”,于是新一轮贴宣言大赛开始,最快的那只再次加冕。 -
日常管理
新蜂王上任后,会把自己的“通讯录”(集群元数据:分区 leader、ISR、配置等)写进决策树的另一片枝桠,让每只蜜蜂随时查看;同时继续监听树精灵的声音,保证一旦又有蜜蜂失联,自己能第一时间调整“岗位分工”,维持蜂巢秩序。
就这样,卡夫卡蜂巢靠着“决策树”公平、快速、无血雨腥风地选出一任又一任蜂王,年年花蜜满仓,秩序井然。
——这就是 Kafka 借助 ZooKeeper 进行 Controller 选举的小故事。
5-ZooKeeper 的选举机制如何保证公平性?
把 ZooKeeper 的“领导选举”想象成一次“抢凳子”游戏,就能一眼看出它怎样把“公平”写进了 DNA:
-
同一把椅子:
所有参与者(机器/进程)只能去抢同一把“虚拟椅子”(同一个 znode,比如/election
)。没有第二把椅子可选,这就天然杜绝了“暗箱分票”。 -
先来后到,编号写死:
抢椅子时必须贴一张“临时顺序便签”(ephemeral sequential)。ZooKeeper 会按到达时间自动在便签后面追加一串递增数字,例如
/election/n_0000000001
、/election/n_0000000002
……
数字一旦生成就不能改,相当于给每个人发了一张“时间戳身份证”。谁最小谁当选,规则公开透明,谁也抬不了杠。 -
原子写:
创建便签是原子操作,ZooKeeper 同一时刻只处理一个请求,保证不会出现“两个人拿到同一编号”的乌龙。 -
只看前一位,不插队:
没抢到椅子的节点不用盲等,只需 watch 比自己编号小 1 的那个节点。一旦前一位“挂掉”便签消失,事件立刻触发,下一位补位。
整个过程没有“主持人”可偏心,也没有“加塞”空间。 -
会话失效自动出局:
临时节点绑定会话;机器宕机或网络分区,会话超时节点自动删除,椅子自然空出。既防止“死节点占坑”,也避免了“人工踢人”的争议。
一句话:同一把椅子 + 顺序编号 + 原子写 + 仅 watch 前驱,让 ZooKeeper 的选举机制变成了“阳光下的抢凳子”,谁先到谁先坐,谁挂了谁让座——公平性被锁进了协议里,谁也改不了。
6-kafka是如何选取leader和follow?
1. 先给出技术答案(供你随时“查表”)
在 Apache Kafka 里,“选老大”这件事由 ZooKeeper(旧版)或 KRaft 自己(新版)负责。核心规则只有一句话:
“谁的数据最全,谁先注册成功,谁就是 Leader;剩下的都是 Follower。”
具体流程
- 每个 broker 启动后,先在 ZooKeeper / KRaft 里抢注一把“临时锁”(
/brokers/ids/xxx
)。 - Controller(总管家)发现某个分区没有 Leader,就把所有活着的副本(ISR)按“数据完整度”排序。
- 排在第一的副本被任命为 Leader,其余副本变成 Follower,并向新 Leader 发送“FETCH”请求去追赶数据。
- 如果 Leader 挂了,重复第 2 步,重新选举。
2. 小故事:蜂巢里选“蜂王”(Kafka 版)
在一片叫 Cluster 森林 的地方,有一个巨大的蜂巢——Topic 蜂巢。蜂巢里有很多六角形的小格子,每个小格子就是一个 Partition。蜜蜂们每天辛勤地把花蜜(消息)搬进这些小格子。
2.1 三个工蜂候选人
蜂巢里有三只工蜂,名字分别叫 Lily、Frank、Ivy。它们都守在同一个格子(Partition 0)旁边,谁都想当这个格子的 蜂王(Leader),因为只有蜂王才能决定花蜜放进格子的顺序。
2.2 蜂王登记处
蜂巢门口有一个魔法板(ZooKeeper / KRaft),魔法板上写着一条规矩:
“想成为蜂王?先把你的翅膀贴在这儿,谁先来、谁翅膀最完整,谁就当蜂王!”
三只工蜂一拥而上:
- Lily 动作最快,翅膀也最完整(数据最全),她“啪”一声把翅膀印先盖在了魔法板上。
- Frank 慢了一步,发现 Lily 已经是蜂王了,只好退到旁边,默默当 护卫蜂(Follower)。
- Ivy 那天感冒,翅膀缺了一小块(数据落后),魔法板直接把她标记为“候补护卫蜂”,也当 Follower。
2.3 日常采蜜
每天,外面的花朵把花蜜交给蜂王 Lily。Lily 先在格子口大声宣布:“第 1 滴花蜜放这儿!第 2 滴放那儿!” 护卫蜂 Frank 和 Ivy 就拿着小本子,飞快地抄下来,保证自己和蜂王记录一模一样(副本同步)。
2.4 蜂王意外
有一天,一阵狂风把 Lily 卷走了!格子口没了蜂王,花蜜们急得团团转。
魔法板立刻感知到“蜂王缺席”,它大喊:“紧急选举!”
- Frank 和 Ivy 再次跑到魔法板前比翅膀。
- 这次 Frank 翅膀比 Ivy 更完整,于是他“啪”一下盖章,成了 新蜂王。
- Ivy 继续当护卫蜂,格子又恢复了秩序,花蜜们继续有序地排队。
2.5 故事寓意
蜂巢里的魔法板就是 Kafka 的 Controller;
工蜂们的翅膀就是 副本的数据进度(LEO、HW);
蜂王更替的过程,就是 Kafka Leader 选举。
3. 一句话总结
Kafka 选 Leader 就像蜂巢选蜂王:
“数据最全、动作最快”的副本永远优先当蜂王,剩下的乖乖做护卫,蜂王一旦失踪,再比一次翅膀就行啦!
7-kafka如何选取controller?
故事标题:《国王的权杖:Kafka王国的Controller选举传奇》
在遥远的分布式大陆上,有一个叫做 Kafka 的消息王国。王国里住着许多忠诚的 Broker骑士,他们日夜不停地传递消息,确保每一条数据都能安全送达。
但王国不能没有国王。国王手握权杖,掌管整个王国的秩序:谁负责哪个分区、谁该成为新的队长、谁失职了要被替换……这个国王,就是传说中的 Controller。
🏰 第一章:权杖的诞生
在王国建立之初,Zookeeper长老在广场中央立起了一根 金色权杖(/controller
节点),并宣布:
“谁能第一个拔出这把权杖,谁就是国王!”
于是,所有Broker骑士一拥而上:
- Broker-0 动作最快,一把拔出了权杖,金光四射,众骑士齐声高呼:“新王登基!”
- 其他骑士(Broker-1、Broker-2)虽然慢了半拍,但他们并不气馁,而是默默地站在一旁,目不转睛地盯着权杖(注册Watcher),一旦权杖落地,他们立刻冲上去再抢。
⚔️ 第二章:权杖的失落
日子一天天过去,Broker-0国王勤勤恳恳,管理着王国的每一个角落。
可有一天,灾难降临——国王突然昏倒了(宕机),权杖从他手中滑落,瞬间化为光点消失(Zookeeper临时节点消失)。
几乎在同一瞬间,所有骑士都感知到了权杖的消失:
- Broker-1大喊:“权杖无主,我来称王!”
- Broker-2也不甘示弱:“我才是天命所归!”
他们再次冲向广场中央,展开一场无声却激烈的争夺。
最终,Broker-2 手快一步,再次拔出了权杖,成为了新的国王。Broker-1虽然遗憾落败,但他依旧忠诚地站在一旁,继续守护王国。
🧠 第三章:纪元的力量
为了防止“伪王”篡位,Zookeeper长老还为权杖设下了 纪元编号(epoch number):
每一次权杖易主,纪元编号都会+1。
- 如果前任国王Broker-0苏醒后,还以为自己仍是国王,试图发号施令,其他骑士只需看一眼他的纪元编号(比如1),再对比现任国王的编号(比如2),就会冷冷地说:
“你的时代已经过去了。”
于是,伪王自动退位,王国秩序依旧井然。
🏁 尾声:永恒的守护
从此以后,Kafka王国在 权杖机制 的守护下,无论国王如何更替,王国始终运转如常。
每一位Broker骑士都知道:
不是谁最强,而是谁最先;
不是谁永远为王,而是谁随时准备接棒。
这就是Kafka王国Controller选举的故事——
一场关于速度、忠诚与秩序的传奇。
📌 技术彩蛋:
- Controller是Zookeeper临时节点
/controller
,创建成功者即为Controller。 - 其他Broker监听该节点,一旦失效即触发重新选举。
- 通过epoch number防止“脑裂”问题。