- kafka的高可靠性的核心是保證消息在傳遞過程中不丟失,涉及如下核心環節:
- 消息從生產者可靠的發送至Broker;—網絡、本地丟數據。
- 發送Broker的消息可靠持久化;—PageCache緩存落盤、單點崩潰、主從同步跨網絡。
- 消費者從Broker消費到消息且最好只消費一次。—跨網絡消息傳輸。
- Kafka通過多級協同機制保障高可靠性,具體實現如下:
一、生產者端防丟失
ACKs分級確認:設置acks=all要求所有同步副本(ISR)持久化後才確認寫入,結合min.insync.replicas=2確保最小副本數。
冪等與事務:啓用enable.idempotence=true防止消息重複,事務機制(transactional.id)保證跨分區原子寫入。
Producer發送消息後,能夠收到來自Broker的消息保存成功ack:
- Request.required.acks=0:請求發送即認為發送成功,不關心有沒有寫成功,常用於日誌進行分析場景。
- Request.required.acks=1:當leader partition寫入成功以後,才算寫入成功,有丟數據的可能。
- Request.required.acks=-1:ISR列表裏面的所有副本都寫完以後,這條消息才算寫入成功,強可靠性保證。
二、Broker層冗餘設計
1.副本同步機制(為了解決單機故障可能帶來的數據丟失問題,kafka為分區引入了副本機制):
- 分區配置多副本(通常3副本),Leader處理讀寫,Follower同步數據。
- ISR動態管理:僅同步延遲≤replica.lag.time.max.ms(默認30秒)的副本,故障時從ISR選舉新Leader。
- 分區的所有副本統稱為AR,所有與leader副本保持一定同步的副本組成ISR,與leader同步滯後的多個副本組成OSR。
- kafka通過多副本機制解決單機故障,也引入了數據一致性問題。
2.持久化優化:
Kafka為了獲得更高吞吐,Broker接收到消息後只是將數據寫入PageCache後便認為消息已寫入成功,而PageCache中的數據通過linux的flusher程序進行異步刷盤。
- 消息順序寫入磁盤,零拷貝傳輸(sendfile)減少CPU開銷。
- 禁用非ISR選舉:unclean.leader.election.enable=false防止數據不一致。
三、消費者端精準消費
- 手動提交Offset:關閉自動提交(enable.auto.commit=false),業務處理完成後同步提交commitSync()。
- 冪等處理:業務層通過唯一標識符(如消息ID)實現去重。
四、容災與高可用
- 跨集羣同步:MirrorMaker 2.0實現異地容災。
- KRaft模式:Kafka3.0+移除ZooKeeper依賴,控制器秒級切換。