Kafka如何保證數據不丟失


Kafka如何保證數據不丟失

1.生產者數據的不丟失

kafka的ack機制:在kafka發送數據的時候,每次發送消息都會有一個確認反饋機制,確保消息正常的能夠被收到,其中狀態有0,1,-1。

  • 如果是同步模式:ack機制能夠保證數據的不丟失,如果ack設置為0,風險很大,一般不建議設置為0。即使設置為1,也會隨着leader宕機丟失數據。
producer.type=sync 
request.required.acks=1
  • 如果是異步模式:也會考慮ack的狀態,除此之外,異步模式下的有個buffer,通過buffer來進行控制數據的發送,有兩個值來進行控制,時間閾值與消息的數量閾值,如果buffer滿了數據還沒有發送出去,有個選項是配置是否立即清空buffer。可以設置為-1,永久阻塞,也就數據不再生產。
  • 異步模式下,即使設置為-1。也可能因為程序員的不科學操作,操作數據丟失,比如kill -9,但這是特別的例外情況。
producer.type=async 
request.required.acks=1 
queue.buffering.max.ms=5000 
queue.buffering.max.messages=10000 
queue.enqueue.timeout.ms = -1 
batch.num.messages=200

結論:producer有丟數據的可能,但是可以通過配置保證消息的不丟失。

2.消費者數據的不丟失

通過offset commit 來保證數據的不丟失,kafka自己記錄了每次消費的offset數值,下次繼續消費的時候,會接着上次的offset進行消費。

而offset的信息在kafka0.8版本之前保存在zookeeper中,在0.8版本之后保存到topic中,即使消費者在運行過程中掛掉了,再次啟動的時候會找到offset的值,找到之前消費消息的位置,接着消費,由於offset的信息寫入的時候並不是每條消息消費完成后都寫入的,所以這種情況有可能會造成重復消費,但是不會丟失消息。

唯一例外的情況是,我們在程序中給原本做不同功能的兩個consumer組設置KafkaSpoutConfig.bulider.setGroupid的時候設置成了一樣的groupid,這種情況會導致這兩個組共享同一份數據,就會產生組A消費partition1,partition2中的消息,組B消費partition3的消息,這樣每個組消費的消息都會丟失,都是不完整的。  為了保證每個組都獨享一份消息數據,groupid一定不要重復才行。

2.kafka集群中的broker的數據不丟失

每個broker中的partition我們一般都會設置有replication(副本)的個數,生產者寫入的時候首先根據分發策略(有partition按partition,有key按key,都沒有輪詢)寫入到leader中,follower(副本)再跟leader同步數據,這樣有了備份,也可以保證消息數據的不丟失。

 


免責聲明!

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



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