流程说明:
1、首先命令产看topic的详细信息:
这个topic的partition-0的 leader是副本1号(0,1两个副本),
partition-1的 leader是副本0号
partition-2的 leader是副本1号
2、producer 先从 zookeeper 的 "ls /brokers/topics/one_broker_topicsss/partitions/1/state" 节点找到该 partition 的 leader
3、prodcer将信息发送给leader
4、leader将信息写入到log里面,并且记录index位置信息。
5、follower从leader上面去pull数据,在完成的时候,follower会个leader发送ACK信息,
6、leader在收到来自ISR中的replica的ack信息,最后向producer发送ack信息。
ISR指的是:比如有三个副本 ,编号是① ② ③ ,其中② 是Leader ① ③是Follower。假设
在数据同步过程中,①跟上Leader,但是③出现故障或没有及时同步,则① ②是一个ISR,而
③不是ISR成员。后期在Leader选举时,会用到ISR机制。会优先从ISR中选择Leader
kafka的HA机制:
同一个partition将会有多个副本的,
如果是只有一个partition的话,当broker宕机的话,则partition则不能再提供读写服务了。
在引入副本replica机制之后,则在partition之间需要选出一份leader来进行和producer、consumer之间交互,而其他的replica则是从这个leader中去复制数据的。
leader Failover机制:
当leader宕机之后,默认是从follower中选举出leader,在新选举的leader满足的基本条件是:新的leader必须具有之前旧的leader commit的所有信息。
由写入流程可知 ISR 里面的所有 replica 都跟上了 leader,只有 ISR 里面的成员才能选为 leader。
对于 f+1 个 replica,一个 partition 可以在容忍 f 个 replica 失效的情况下保证消息不丢失。
比如 一个分区 有5个副本,挂了4个,剩一个副本,依然可以工作。
注意:kafka的选举不同于zookeeper,用的不是过半选举。
当所有 replica 都不工作时,有两种可行的方案:
1. 等待 ISR 中的任一个 replica 活过来,并选它作为 leader。可保障数据不丢失,但时间可能相对
较长。
2. 选择第一个活过来的 replica(不一定是 ISR 成员)作为 leader。无法保障数据不丢失,但相对不
可用时间较短。
kafka 0.8.* 使用第二种方式。此外, kafka 通过 Controller 来选举 leader。