Kafka集群的Leader選舉
- Kafka並沒有采用多數投票來選舉Leader
原因:
1)節點數據完整性不同,如果完整數據為1萬挑,如果不完整數據節點只有9000條數據,如果當選了Leader,數據就丟失了1000條,而導致數據不一致;
2)大數據文本比較慢;
- Kafka會動態維護一組Leader數據的副本(ISR)
ISR的作用:
1)保證所有副本數據的一致性;
2)數據寫入的時候,告知所有的ISR都保存一份;
- Kafka會在ISR中選擇一個速度比較快的設為Leader
如何判斷一個Leader速度比較快?
1)Controller:集群啟動的時候會在Zookeeper中去注冊一個controller,所有的ISR會去session文件中搶注為Leader;
Controller的作用:
1)管理所有的Broker,檢查Broker的健康狀態,節點剔除;
2)針對已經損壞的Broker,檢查該Broker中有多少的Leader和Follwer;
3)重新分配之類的事情;
特殊情況:ISR中副本全部宕機
對於這種情況,Kafka會如何處理呢?
- 對於這種情況,Kafka會進行 unclean leader選舉(臟選舉),對於臟選舉,提供了兩種解決思路
1)等待,當其中一個ISR好了,就選擇為Leader;
2)ISR以外的Follower中選舉,此情況是丟失數據 ,生產不允許
Leader選舉配置建議
- 禁用 “unclean leader” 選舉
- 手動指定最小ISR(當ISR小於指定數量的時候,消息發送失敗)
故障處理細節
- LEO(Log End Offset)
每個副本的最后一個offset
- HW(High Watermark)
保證消費者數據的一致性,消費者能見到的最大的offset,ISR隊列中最小的LEO(所有副本中的最小LEO)
HW解決了兩個問題:
1)消費一致性;
2)存儲一致性(新的Leader從ISR中選舉出來之后,其他的follower會將各自的log文件 高於 HW的部分截掉,然后從新的Leader同步數據)
缺點:
只能保證副本之間的數據一致性,並不能保證數據不丟失或者不重復。