企業(yè)網(wǎng)站開發(fā)模板windows優(yōu)化大師靠譜嗎
ISR 是什么
ISR 的全稱叫做: In-Sync Replicas (同步副本集), 可以理解為和 leader 保持同步的所有副本的集合。ISR 動(dòng)態(tài)維護(hù)了一個(gè)和 leader 副本保持同步副本集合,ISR 中的副本全部都和 leader 的數(shù)據(jù)保持同步。
設(shè)一個(gè)場(chǎng)景,有6個(gè)分區(qū)集合,分別為 [0,1,2,3,4,5],其中 leader-replica 是 0
其中 [1,2,3] 作為 follower 和 leader 的數(shù)據(jù)保持同步,而 [4,5] 未能和 leader 保持同步,那么此時(shí),ISR=[0,1,2,3],OSR=[4,5]
如果此時(shí)副本 4 追上了 leader-replica,也就是和 leader 保持到了同步,那么此時(shí),ISR=[0,1,2,3,4],OSR=[5]
ISR 的作用
我們知道了與 leader 保持同步的副本集后,可以做到哪些事情?
- 當(dāng)我們生產(chǎn)消息的時(shí)候,到底要寫入多少副本才能算成功呢?
- 當(dāng) leader 掛了之后,我們應(yīng)該選擇哪個(gè) follower 來成為新的 leader 呢?
通過 ISR 就可以知曉了哪些 follower 與 leader 保持著同步,在寫入消息的時(shí)候,設(shè)置寫入處于 ISR 中所有的副本才算成功,在進(jìn)行 leader 切換的時(shí)候,就可以從 ISR 中選擇對(duì)應(yīng)的 follower 成為新的 leader。
ISR 的作用是通過副本機(jī)制實(shí)現(xiàn)消息高可靠,服務(wù)高可用時(shí),不可缺少的一環(huán);這也是為什么講到副本不得不提到 ISR 的原因。
總結(jié)
- ISR 機(jī)制通過副本冗余機(jī)制,提供了 kafka 消息的高可靠性。
- ISR 機(jī)制可以做到故障轉(zhuǎn)移,保障服務(wù)的可用性。
- ISR 平衡了主從架構(gòu)下,復(fù)制方案的選擇(同步 / 異步 / 少數(shù)服從多數(shù)),讓使用者根據(jù)參數(shù)自行選擇。
為什么要設(shè)計(jì) ISR 機(jī)制
在一些中間件中,都有副本的概念,不同場(chǎng)景下寫入數(shù)據(jù)時(shí),要求寫入副本的個(gè)數(shù)也不盡相同。例如 zk 中要求寫入的節(jié)點(diǎn)個(gè)數(shù)大于一半才算成功,或者有些要求高可靠性的場(chǎng)景,規(guī)定寫入所有副本才能算成功。
而 kafka 的 ISR 可以允許生產(chǎn)消息時(shí),根據(jù)自己的業(yè)務(wù)場(chǎng)景自行配置 ACK 確認(rèn)機(jī)制達(dá)到想要的效果:
- acks=0:生產(chǎn)者發(fā)了就算完了,后續(xù)成不成功我都不管,這種設(shè)置下消息的高可靠性幾乎沒有保障,但是卻有著極大的吞吐量
- acks=1:消息寫入主節(jié)點(diǎn)就算成功,這種設(shè)置,可以保障一定的高可靠性,也具有不錯(cuò)的吞吐量
- acks=-1或all:消息必須寫入 ISR 中所有的副本才算成功,這種設(shè)置下,就能提供較高的高可靠性,但是吞吐量就相對(duì)較低
ISR 雖然是動(dòng)態(tài)伸縮的,可能會(huì)出現(xiàn) follower 全部都掛了的情況,如果 ISR 中只剩下 leader,那么此時(shí)設(shè)置 acks=all 就等價(jià)于 acks=1 了。這樣就會(huì)對(duì)高可靠性要求的場(chǎng)景產(chǎn)生危險(xiǎn)。
kafka 提供了 min.insync.replicas 參數(shù)配置,這個(gè)參數(shù)可以配置最少 ISR 中需要多少個(gè)副本,才能繼續(xù)提供寫服務(wù)。如果設(shè)置為 2,一旦 ISR 中的個(gè)數(shù)小于 2,那么就不再提供寫服務(wù),犧牲一定的可用性,來保障這種高可靠的場(chǎng)景需求。
總結(jié)
ISR 機(jī)制的存在是 kafka 為了平衡可靠性和可用性,不指定提供高可靠或者高可用的服務(wù),而是將決定權(quán)交給了使用者,讓使用者通過參數(shù)來控制,到底要實(shí)現(xiàn)什么程度的高可靠與高可用。