《Kafka 设计解析(二):Kafka High Availability (上)》 和《Kafka 设计解析(三):Kafka High Availability (下)》学习笔记
数据传播: Producer在发布数据到某个Parititon时,首先通过ZK找到Partition Leader,然后将数据push到Partition Leader;Parittion Leader接收到数据后会将数据记录到本地Log;
然后Paritition Follwer从Leader pull数据,然后将其写入本地Log,当Follower写入成功后会发送ACK给Leader。一旦所有ISR都返回了Replica成功的ACK,则认为该消息
已经成功Produce到Kafka,Leader会向Producer返回ACK并增加HW(HW标记了已备份完成的数据,Consumer只能消费已经备份完成的数据)。
需要说明的是,一条消息只有被 ISR 里的所有 Follower 都从 Leader 复制过去才会被认为已提交。这样就避免了部分数据被写进了 Leader,还没来得及被任何 Follower 复制就宕机了,而造成数据丢失(Consumer 无法消费这些数据)。而对于 Producer 而言,它可以选择是否等待消息 commit,这可以通过request.required.acks
来设置。这种机制确保了只要 ISR 有一个或以上的 Follower,一条被 commit 的消息就不会丢失。
Partition Leader的选举:当原Partition Leader DOWN机时。Kafka Controller会从ISR中选取一个Follower作为新的Leader,如果没有在ISR中的Follower则任意选择一个Follower作为Leader,这样虽然会导致数据丢失但是保证了高可用行。
如果所有的Follower也都DOWN机了,则这个Partition就挂了(个人理解)
原文:https://www.cnblogs.com/ybonfire/p/11823240.html