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同步數據。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM