kafka中的高可用HA
1、replication副本
同一个partition会有一个leader和多个副本,这些副本存储的内容与leader相同,可以通过 server.properties 配置中的 default.replication.factor=N进行配置。producer只和Leader进行交互,replication作为follower复制leader中的数据。
kafka中分配replication的算法
1、将n个待分配的broker和partition排序。
2、将第i个partition分配到 i mod n个broker上。
3、将第i个partition的第j个replica分配到第(i+j)mod n 个broker上。
2、Leader的故障转移(Leader failover)
当partition的leader宕机后,会在所有的follower中选举出一个新的Leader,这个新的Leader必须有旧Leader commit的所有的消息。
kafka在zookeeper中的broker/.../state下维护了一个ISR(in-sync-replica),ISR中的所有replication的数据都与leader的数据是一致的。只有ISR中的replication才能选举成为Leader。对于一个partition有n+1个replication,并且n个replication失效的情况下保证消息不丢失。
3、broker failover
1、controller会在zookeeper的brokers/ids/brokerid下注册节点,如果broker宕机,zookeeper会fire watch。
2、controller从brokers/ids下读取所有可用的broker
3、controller从set_p读取宕机broker的所有的partition,set_p集合存储了宕机broker所有的partition。
4、对于读取到的每个partition,都做以下操作:
(1)从/brokers/topics/[topic]/partitions/[partition]/state 节点下读取ISR
(2)选举出该partition新的Leader
(3)将新 leader、ISR、controller_epoch 和 leader_epoch 等信息写入 state 节点
5、通过RPC向相关的broker发出leaderAndISRRequest 命令。
4、controller failover
每个broker都会在/controller节点下注册watch,当controller宕机,zookeeper中controller临时节点就会消失,所有存活的broker收到fire的通知后都会尝试创建controller path,但是只会有一个竞选成功。
当新的的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。