在可用性和一致性之間做一個動態平衡
ISR: 1. in-sync Replica,每一個partition都有一個leader,每一個leader都會維護一個基本與它同步的replica列表。
2. 如果一個Follower比Leader落後太多,或者超過一定時間未發起數據複製請求,則Leader將其從ISR中移除
3. 當ISR中所有Replica都向Leader發送ACK時,Leader即Commit
消息落後-原因:同數據的時候,批量同步,或者異步同步,都回產生差異。後者網絡延遲,內存緩慢。
好處:當有很多follwer比較慢的時候,移除ISR,保證高可用。如果follower ,狀態追上來了,重新加入ISR。
Commit策略
Server配置
- replica.lag.time.max.ms=10000 10秒沒有fetch 移除
- replica.lag.max.messages=4000 數據相差4000條 移除
Topic配置
- min.insync.replicas=1
Producer配置
- request.required.acks=0
kafka全部宕機:
- 方案1(等待ISR恢復服務)
優點: 因爲ISR中的replica數據都是已經commit的(認爲數據都是最新的,而且數據已知),所以等待ISR中一個節點恢復就可以作爲leader啓動服務。
缺點:如果replica過多(10個),ISR中的replica只有2個,那就需要等到ISR中的兩個replica恢復,才能啓動服務。
- 方案2(等待任意replica恢復服務)
優點:當有服務恢復時,服務即能恢復使用,可用性高。
缺點:如果先啓動的replica不在ISR中,那麼就會出現數據丟失。