kafka如何保障數據不丟失,也就是kafka提供了什麼機制或者架構來保障數據的可靠性。java
主要從如下三個方面概述markdown
1.Topic 副本因子個數:replication.factor >= 3
2.同步副本列表(ISR):min.insync.replicas = 2
3.禁用unclean選舉: unclean.leader.election.enable=false
複製代碼
replication.factor
實現。依賴於zookeeper實現
)只有leader 副本纔會提供對外的服務
,follower 副本是不會處理任務服務請求的,只是作數據同步,數據備份。replica.lag.time.max.ms
這是配置follower副本與leader副本同步的最長時間,若是在該時間內follower副本沒有與leader副本同步,則會將該follower踢出ISR。min.insync.replicas=2
,那麼至少要存在兩個同步副本才能向分區寫入數據。注意: 若是進行了上面的配置,此時必需要保證ISR中至少存在兩個副本,若是ISR中的副本個數小於2,那麼Broker就會中止接受生產者的請求
。嘗試發送數據的生產者會收到NotEnoughReplicasException異常,消費者仍然能夠繼續讀取已有的數據。session
同步副本列表中的分區做爲leader
分區的過程稱爲clean leader election
非同步副本中選取一個副本做爲leader
的過程叫作unclean leader election
unclean.leader.election.enable
進行設置。背景
:由於ISR是動態的,因此存在ISR列表中爲空的狀況,在leader掛了,其它follower沒有同步時,將會產生這種狀況,而一旦發生這種狀況,整個kafka將不能提供服務了。高可用-開啓(好比實時點擊流分析系統)
:爲了kafka集羣可以一直提供服務(優勢
),能夠開啓unlean.leader選舉,可是由於選舉的是非ISR列表中的follower做爲新的leader,由於這些follower上的信息可能與以前的leader上的數據相差比較大,那麼新選舉的follower成爲leader後,由於沒有同步老leader上的數據,就會產生數據丟失
的狀況(缺點
)數據一致性-禁用unclean選舉(應用:好比銀行,要去數據一致性高)
:禁用的話,那麼選舉leader只能從ISR中選舉,這樣能夠能夠保障數據的一致性(固然,這個一致性不能徹底保障,由於follower中的數據是異步和leader同步的,若是數據沒有同步完,leader就掛了,那麼新選舉的leader裏面由於沒有徹底同步老leader數據,就會存在數據部分丟失的可能性。除非設置裏acks=all,確保了全部follower所有同步了leader,並響應給producer
)follower和leader數據同步和以下兩個參數關係密切:
replica.lag.time.max.ms:同步副本滯後與leader副本的時間
zookeeper.session.timeout.ms:與zookeeper會話超時時間
複製代碼
earliest
:消費者會從分區的開始位置讀取數據,無論偏移量是否有效,這樣會致使消費者讀取大量的重複數據,但能夠保證最少的數據丟失
。一種是latest(默認)
,若是選擇了這種配置, 消費者會從分區的末尾開始讀取數據,這樣能夠減小重複處理消息,但頗有可能會錯過一些消息。
這個和上面的推斷結果差很少。架構
Kafka 只對「已提交」的消息(committed message)作有限度的持久化保證負載均衡
kafka是能夠作到保障永久不丟失數據的,只不過要有條件限制
。分區有序
的,若是一個主題有多個分區,那麼Kafka會按照key將其發送到對應的分區中,因此,對於給定的key,與其對應的record在分區內是有序的。方案一: 對於須要保障消息有序的topic,設置單個分區,可是會影響吞吐量。異步
方案二: 設置兩個參數:post
retries>0
,還須要配置max.in.flight.requests.per.connections:1
,該參數是保障消息寫入的順序,當嘗試重發第一批消息的時候,就不會有其餘消息嘗試發送給broker。這種也會影響吞吐量,可是能夠保障消息是順序發送的。一個簡單的計算公式爲:分區數 = max(生產者數量,消費者數量)spa
生產者數量=總體生產吞吐量/每一個生產者對單個分區的最大生產吞吐量日誌
消費者數量=總體消費吞吐量/每一個消費者從單個分區消費的最大吞吐量code
選擇合適的分區數量能夠達到高度並行讀寫和負載均衡的目的,在分區上達到均衡負載是實現吞吐量的關鍵。須要根據每一個分區的生產者和消費者的指望吞吐量進行估計。
在下面狀況發生時,須要重平衡集羣:
使用kafka-reassign-partitions.sh命令進行重平衡
參考以下