kafka读写原理及ack机制
一、 kafka读写流程
写流程
1.连接ZK集群,从ZK中拿到对应topic的partition信息和partition的Leader的相关信息 2.连接到对应Leader对应的broker 3.将消息发送到partition的Leader上 4.其他Follower从Leader上复制数据 5.依次返回ACK 6.直到所有ISR中的数据写完成,才完成提交,整个写过程结束
读流程
1.连接ZK集群,从ZK中拿到对应topic的partition信息和partition的Leader的相关信息 2.连接到对应Leader对应的broker 3.consumer将自己保存的offset发送给Leader 4.Leader根据offset等信息定位到segment(索引文件和日志文件) 5.根据索引文件中的内容,定位到日志文件中该偏移量对应的开始位置读取相应长度的数据并返回给consumer
二、数据可靠性保证
为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送 ack(acknowledgement 确认收到),如果 producer 收到 ack,就会进行下一轮的发送,否则重新发送数据。
1. ack机制
acks 参数配置: 0:producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟,broker 一接收到还没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据; 1:producer 等待 broker 的 ack,partition 的 leader 落盘成功后返回 ack,如果在 follower同步成功之前 leader 故障,那么将会丢失数据;
-1(all):producer 等待 broker 的 ack,partition 的 leader 和 follower 全部落盘成功后才 返回 ack。但是如果在 follower 同步完成后,broker 发送 ack 之前,leader 发生故障,那么会 造成数据重复。
2. ISR(动态副本集合)
Leader 维护了一个动态的 in-sync replica set (ISR),意为和 leader 保持同步的 follower 集合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 follower 发送 ack。如果 follower 长时间未向 leader 同步数据,则该 follower 将被踢出 ISR,该时间阈值由replica.lag.time.max.ms 参数设定。Leader 发生故障之后,就会从 ISR 中选举新的 leader。
3. Log文件中HW(High Watermark)和LEO(Log End Offset)
LEO:指的是每个副本最大的 offset; HW:指的是消费者能见到的最大的 offset,ISR 队列中最小的 LEO。
(1)follower 故障follower 发生故障后会被临时踢出 ISR,待该 follower 恢复后,follower 会读取本地磁盘记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向 leader 进行同步。 等该 follower 的 LEO 大于等于该 Partition 的 HW,即 follower 追上 leader 之后,就可以重新加入 ISR 了。 (2)leader 故障 leader 发生故障之后,会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的数据一致性,其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 leader同步数据。