問題如下:
kafka 為了保證數據的一致性使用了isr 機制
1 首先我們知道kafka 的數據是多副本的,每個topic 下的每個分區下都有一個leader 和多個follower,
2 每個follower 的數據都是同步leader的 這里需要注意 是follower 主動拉取leader 的數據
注意問題:follewer 只是數據的副本提供數據的可恢復性,本身和kafka 的讀寫性能無關(kafka的讀寫都是和leader 相關)
3 那么問題就出來了 雖然每個分區都有多個副本,但是如何確定副本的數據和leader 的數據是同步的?
isr 的全稱是:In-Sync Replicas isr 是一個副本的列表,里面存儲的都是能跟leader 數據一致的副本,確定一個副本在isr列表中,有2個判斷條件
條件1:根據副本和leader 的交互時間差,如果大於某個時間差 就認定這個副本不行了,就把此副本從isr 中剔除,此時間差根據
配置參數rerplica.lag.time.max.ms=10000 決定 單位ms
條件2:根據leader 和副本的信息條數差值決定是否從isr 中剔除此副本,此信息條數差值根據配置參數rerplica.lag.max.messages=4000 決定 單位條
isr 中的副本刪除或者增加 都是通過一個周期調度來管理的
4 kafka 根據isr 機制和消息的ack方式保證的數據的一致性和保證冪等性(消息是否會重復消費。發送等)
min.insync.replicas=n 配置參數表示 當滿足了n個副本的消息確認(n默認為1,最好大於1,因為leader 也在isr 列表中),才認為這條消息是發送成功的
min.insync.replicas 參數只有配合request.required.acks =-1 時才能達到最大的可靠性
request.required.acks 的參數說明:
0:生產者只管發送,不管服務器,消費者是否收到信息
1:只有當leader 確認了收到消息,才確認此消息發送成功
-1:只有isr 中的n-1個副本(leader 除外所以n-1)都同步了消息 此消息才確認發送成功
注意生產者發送的消息只有在確認發送成功后 才能被消費者消費
思考如果所有的副本都掛掉了會如何?