在 Kafka 集群中,当一个新的 Controller 当选之后,epoch number 会通过以下机制传递给其他 Broker。这个过程主要涉及 ZooKeeper 和新的 Controller 之间的交互。
1. 新的 Controller 更新 ZooKeeper 中的 epoch number:
- 当新的 Controller 被选举出来后,它会立即与 ZooKeeper 进行交互,更新 ZooKeeper 中的 /controller_epoch 节点,将 epoch number 增加,并将新的值写入这个节点。
- 这个 epoch number 是唯一的,表示这个 Controller 是最新的、合法的。
2. Controller 通过 LeaderAndIsr
请求通知其他 Broker:
- 新的 Controller 完成选举并更新了 ZooKeeper 后,会立即向所有其他 Broker 发送一个管理请求(通常是
LeaderAndIsr
请求),这个请求包含集群的最新元数据信息以及新的 epoch number。 - 这个 LeaderAndIsr 请求负责告知每个 Broker 最新的分区 Leader 信息、ISR(In-Sync Replica)列表,并且附带上最新的 epoch number。
3. 其他 Broker 收到最新的 epoch number:
- 当其他 Broker 收到 LeaderAndIsr 请求时,会检查该请求中的 epoch number。
- 如果请求中的 epoch number 比他们之前存储的 epoch number 更大,那么他们会更新本地存储的 epoch number,并接受来自这个新的 Controller 的指令。
- 如果请求中的 epoch number 小于或等于他们之前存储的值,意味着该请求来自一个已经过期的 Controller(例如,旧的 Controller 还没有意识到自己被替换),他们会忽略这个请求。
4. 谁负责传递 epoch number?
- 新的 Controller 是唯一负责将最新的 epoch number 通过请求传递给其他 Broker 的实体。
- 它通过向其他 Broker 发送管理请求(如
LeaderAndIsr
)来传递最新的 epoch number。其他 Broker 在收到这些请求时,就会自动获取并更新 epoch number。
5. ZooKeeper 的角色:
- ZooKeeper 主要用于存储最新的 epoch number,并确保集群中只有一个合法的 Controller。
- 它并不直接通知其他 Broker epoch number,只是作为一种全局存储机制,由新的 Controller 通过请求来主动通知其他 Broker。
6. 总结:
- Controller 选举结束后,新的 Controller 更新 ZooKeeper 中的 epoch number。
- 新的 Controller 通过
LeaderAndIsr
请求通知所有 Broker 最新的 epoch number,以及其他集群元数据信息。 - 其他 Broker 收到请求后,更新本地存储的 epoch number 并接受新的 Controller 的指令。如果收到的 epoch number 比本地的值小,则忽略该请求。
-
新皇登基(新的Controller Broker):当集群中的 Controller 发生变化时,新的 Controller 被选举出来,负责管理整个集群。
7. 比喻 :
就相當於,新皇登基(新的Controller Broker),昭告天下(通知所有普通Broker,附帶相關信息 例如年號(epoch number)),普通地方官(普通Broker) 更新地方官府的相關信息例如年號(epoch number)),後續皇帝向地方官發送命令 就要帶上年號,地方官對比發送過來的年號是否為符合條件(年號必須大於等於地方官手中的年號) ,大於當前的年號則跟新年號,知道是新皇登基了,如果等於,就執行皇帝的命令,如果小於手中的年號,就是老皇帝的,不能聼
-
昭告天下(通知所有普通Broker):新的 Controller 在登基后(被选为 Controller),会通过向所有普通 Broker 发送通知(如
LeaderAndIsr
请求),告知它们最新的 Controller 信息,并附带当前的“年号”(epoch number)。 -
普通地方官(普通Broker):每个 Broker 收到通知后,会更新本地存储的“年号”(epoch number),如果年号大于当前存储的年号,表示已经有新 Controller 上任。
-
后续皇帝下达命令要带上年号:当 Controller 继续向 Broker 发送管理指令时,都会携带 epoch number,确保这些指令来自合法的 Controller。
-
地方官对比年号:Broker 接收到命令时会对比命令中的年号与本地存储的年号。如果命令中的年号大于或等于本地存储的年号,意味着指令来自新 Controller,则可以执行;否则,忽略那些带有过期年号的指令。
这一流程确保了在 Controller Broker 发生变化时,集群能稳定运行,不会因为旧的 Controller 发出的指令造成数据不一致。