本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Kafka 中 broker 的 leader 选举机制
broker 中的 leader(controller leader):broker 启动时,都创建一个 kafka Controller 对象,但是集群中只能有一个 leader 对外提供服务,这些每个节点上的 kafka Controller 会在指定的 zookeeper 路径下创建临时节点,只有第一个成功创建的节点的 kafka Controller 才可以成为 leader,其余的都是 follower。当 leader 故障后,所有的 follower 会收到通知,再次竞争在该路径下创建节点从而选举新的 leader。
kafka 的 leader 选举是通过在 zookeeper 上创建 /controller 临时节点来实现 leader 选举,并在该节点中写入当前 broker 的信息{"version":1, "brokerid":1, "timestamp":"1512018424988"} 利用 zookeeper 的强一致性特性,一个节点只能被一个客户端创建成功,创建成功的 broker 即为 leader,即先到先得原则,leader 也就是集群中的 controller,负责集群中所有大小事务。当 leader 和 zookeeper 失去连接时,对应的 controller Path 会自动消失(因为它是 ephemeral Node),此时该 watch 被 fire,所有“活”着的 broker 都会去竞选成为新的 controller(创建新的 controller Path),但是只会有一个竞选成功(这点 zookeeper 保证)。竞选成功者即为新的 leader,竞选失败者则重新在新的 controller Path 上注册 watch。因为 zookeeper 的 watch是一次性的,被 fire 一次之后即失效,所以需要重新注册。
Kafka 中 partiton leader 的选举
partition leader:负责该分区数据的读写,leader 的选举由 controller leader 执行。具体的操作为:
1、从 zookeeper 中读取当前分区的所有 ISR(in-sync replicas)集合。(ISR 介绍注意一下)
2、调用配置的“分区选择算法”选择分区的 leader。
kafka 会在 zookeeper 上针对每个 topic 维护一个称为 ISR(in-sync replica,已同步的副本)的集合,该集合中是一些分区的副本。只有当这些副本都跟 leader 中的副本同步了之后,kafka 才会认为消息已提交,并反馈给消息的生产者。如果这个集合有增减,kafka 会更新 zookeeper 上的记录。如果某个分区的 leader 不可用,kafka 就会从 ISR 集合中选择一个副本作为新的 leader。显然通过 ISR,kafka 需要的冗余度较低,可以容忍的失败数比较高。假设某个 topic 有 f + 1 个副本,kafka 可以容忍 f 个服务器不可用。