平安銀行一面:Kafka ISR的原理是什么?
Kafka 的高可用性和高可靠性與它的 ISR機制密切相關。那么,什么是 ISR?它是如何工作的?這篇文章,我們來詳解 Kafka 的 ISR 機制。
什么是 ISR機制?
ISR 的全稱叫做In-Sync Replicas(同步副本集),ISR 動態維護了一個和 Leader 副本保持同步副本集合,ISR 中的副本全部都和 Leader 的數據保持同步。
ISR 機制通過副本冗余機制,提供了 kafka 消息的高可靠性,做到故障轉移,保障服務的可用性。ISR 平衡了主從架構下,復制方案的選擇(同步 / 異步 / 少數服從多數),讓使用者根據參數自行選擇。
ISR的作用
ISR的作用主要體現在以下幾個方面:
1.生產消息時的ACK確認機制
當我們生產消息的時候,到底要寫入多少副本才能算成功呢?通過 ISR 就可以知曉了哪些 follower 與 Leader 保持著同步,在寫入消息的時候,設置寫入處于 ISR 中所有的副本才算成功。Kafka提供了以下幾種ACK確認機制:
(1) acks=0
生產者不等待服務器的確認,消息發送后即認為成功,不管消息是否真正寫入 Kafka,這種方式效率最高,但可靠性最低,數據可能存在丟失。
(2) acks=1
生產者會等待來自 Leader分區的確認。Leader分區接收到消息并寫入本地日志后即返回確認。這種方式在 Leader分區可用時可靠,但如果 Leader分區發生故障,可能會丟失數據。從 Kafka 2.0 開始,默認值是 acks=1
(3) acks=all(或-1)
生產者等待所有 ISR(In-Sync Replica,同步副本)分區的確認。只有當消息被寫入所有同步副本后才返回確認,這種方式最可靠,但性能較低。
2.Leader選舉
當 Leader 掛了之后,我們應該選擇哪個 follower 來成為新的 Leader 呢?從 ISR 中選擇對應的 follower 成為新的 Leader。
3.最小 ISR副本數配置
Kafka提供了 min.insync.replicas 參數配置,這個參數可以配置最少 ISR 中需要多少個副本,才能繼續提供寫服務。如果設置為 2,一旦 ISR 中的個數小于 2,那么就不再提供寫服務,犧牲一定的可用性,來保障這種高可靠的場景需求。
ISR的原理
ISR機制的實現原理如下:
(1) Leader維護ISR
Leader負責維護ISR,當一個Follower趕上了Leader的進度,Leader會把它加入到ISR中;當一個Follower長時間未趕上Leader,或者主動退出同步,Leader會把它從ISR中移除,變成OSR(Out-of-Sync Replicas)。
(2) 生產者發送消息
生產者發送消息給Leader,Leader會把消息append到本地log,并且復制給ISR中的所有Follower。
(3) 消息提交
當ISR中的所有Follower都完成了復制,Leader會更新HW(High Watermark,最高提交偏移量),此時消息才算真正提交。
(4) 消費者消費消息
消費者只能消費提交的消息,即位于HW之前的消息。
(5) Follower同步數據
Follower定期主動從Leader拉取數據,保持與Leader的同步。當Follower死機或長時間未同步時,會被從ISR中移除。
(6) Leader選舉
當Leader所在的broker失效時,ISR中的其他Follower會選出一個新的Leader。選舉規則是:選擇ISR中最新的Follower。
實例分析
為了更好地理解 ISR機制,我們通過一個示例來講解。
假設一個 Kafka 集群中有一個 Topic test,該 Topic 有一個分區 partition-0,該分區有 3 個副本,分別在 Broker 1、Broker 2 和 Broker 3 上。
- 在初始狀態時:Leader 副本:Broker 1 Follower 副本:Broker 2, Broker 3 所有的副本都工作良好,所以 ISR 集合為:[Broker 1, Broker 2, Broker 3]
- 假如 Broker 2 失效:Broker 2 從 ISR 集合中移除,因此,ISR 集合變成了:[Broker 1, Broker 3]
- 接著 Broker 1 也失效了:Broker 3 被選為新的 Leader,SR 集合變成了:[Broker 3]
- 再然后,Broker 2 恢復:Broker 2 開始從 Broker 3 復制數據,Broker 2 追上 Broker 3 后,重新加入 ISR 集合,因此,ISR 集合變成了:[Broker 2, Broker 3]
ISR的優缺點
ISR機制的優點:
- 提供了消息的高可靠性,即使部分副本失效,只要ISR中還有副本存活,消息就不會丟失。
- 支持故障轉移,當 Leader失效時,ISR中的Follower可以順利接替成為新的 Leader,提高了系統的可用性。
- 通過ACK機制,生產者可以根據自己的需求,在可靠性和吞吐量之間進行權衡。
ISR機制的缺點:
- 同步復制會增加消息發送的延遲,因為生產者需要等待所有ISR中的副本完成復制。
- ISR中的副本越多,消息發送的延遲就越高。
- ISR中的副本數量受限于min.insync.replicas參數,如果副本數量低于該值,就無法提供寫服務,會降低系統的可用性。
總結
ISR機制是 Kafka實現高可靠性和高可用性的關鍵所在,它通過動態維護一個和Leader保持同步的副本集合,為消息的可靠性提供了保證。同時,ISR機制還支持故障轉移,當 Leader失效時,ISR中的 Follower可以順利接替成為新的 Leader。
不過,ISR機制也存在一些缺點,比如會增加消息發送的延遲,并且ISR中的副本數量受限于 min.insync.replicas參數。因此,在使用ISR機制時,需要根據實際的業務需求,在可靠性、可用性和吞吐量之間進行權衡。
總的來說,ISR機制是 Kafka實現高可靠性和高可用性的一個重要機制,它的出現大大提高了 Kafka的實用性,使其成為了大數據領域廣泛使用的消息隊列系統。