Kafka学习之路 (三)Kafka的高可用
讨论QQ:1586558083
一、高可用的由来- 1.1 为何需要Replication
- 1.2 Leader Election
- 2.1 如何将所有Replica均匀分布到整个集群
- 2.2 Data Replication(副本策略)
- 3.1 admin
- 3.2 broker
- 3.3 controller
- 4.1 写入方式
- 4.2 消息路由
- 4.3 写入流程
- 5.1 存储方式
- 5.2 存储策略
- 6.1 创建topic
- 6.2 删除topic
正文
回到顶部回到顶部回到顶部回到顶部回到顶部回到顶部回到顶部回到顶部八、controller failover
当 controller 宕机时会触发 controller failover。每个 broker 都会在 zookeeper 的 "/controller" 节点注册 watcher,当 controller 宕机时 zookeeper 中的临时节点消失,所有存活的 broker 收到 fire 的通知,每个 broker 都尝试创建新的 controller path,只有一个竞选成功并当选为 controller。
当新的 controller 当选时,会触发 KafkaController.onControllerFailover 方法,在该方法中完成如下操作:
1、 读取并增加 Controller Epoch。 2、 在 reassignedPartitions Patch(/admin/reassign_partitions) 上注册 watcher。 3、 在 preferredReplicaElection Path(/admin/preferred_replica_election) 上注册 watcher。 4、 通过 partitionStateMachine 在 broker Topics Patch(/brokers/topics) 上注册 watcher。 5、 若 delete.topic.enable=true(默认值是 false),则 partitionStateMachine 在 Delete Topic Patch(/admin/delete_topics) 上注册 watcher。 6、 通过 replicaStateMachine在 Broker Ids Patch(/brokers/ids)上注册Watch。 7、 初始化 ControllerContext 对象,设置当前所有 topic,“活”着的 broker 列表,所有 partition 的 leader 及 ISR等。 8、 启动 replicaStateMachine 和 partitionStateMachine。 9、 将 brokerState 状态设置为 RunningAsController。 10、 将每个 partition 的 Leadership 信息发送给所有“活”着的 broker。 11、 若 auto.leader.rebalance.enable=true(默认值是true),则启动 partition-rebalance 线程。 12、 若 delete.topic.enable=true 且Delete Topic Patch(/admin/delete_topics)中有值,则删除相应的Topic。