kafka擁有以下可靠性保證:
- 可以保證分區(qū)消息的順序。也就是說(shuō),同一個(gè)生產(chǎn)者往同一個(gè)分區(qū)寫入消息,假如消息2在消息1之后寫入,則Kafka可以保證消息2的偏移量比消息1的偏移量大,所以消費(fèi)者會(huì)先讀取消息1的數(shù)據(jù)。
- 只有當(dāng)消息被寫入分區(qū)的所有同步副本時(shí),才會(huì)被標(biāo)記為“已提交”。
- 只要還有一個(gè)副本為活躍狀態(tài),已提交的消息就不會(huì)丟失。
- 消費(fèi)者只能讀取已提交的消息。
Kafka可靠性保證的核心是其復(fù)制機(jī)制以及分區(qū)的多副本架構(gòu)。
復(fù)制機(jī)制:Kafka的topic由多個(gè)分區(qū)組成,分區(qū)是其基本的數(shù)據(jù)塊。每個(gè)分區(qū)存儲(chǔ)在單個(gè)磁盤上,且其中的事件有序。分區(qū)可以有多個(gè)副本,其中有一個(gè)稱為首領(lǐng)副本,對(duì)該分區(qū)所有的事件發(fā)送給首領(lǐng)副本,其他副本與首領(lǐng)保持同步,及時(shí)復(fù)制最新事件。首領(lǐng)副本不可用時(shí),其中一個(gè)同步副本將成為新首領(lǐng)。
Broker中影響可靠性的參數(shù)
復(fù)制系數(shù)
relication.factor
更高的復(fù)制系數(shù)會(huì)帶來(lái)更高的可用性、可靠性和更少故障。但其也會(huì)占用更多存儲(chǔ)空間。
如果可以允許topic不可用,則復(fù)制系數(shù)設(shè)置為1即可。
建議將復(fù)制系數(shù)設(shè)置為3,這樣已經(jīng)足夠安全了。
不同步副本是否可進(jìn)行首領(lǐng)選舉
unclean.leader.election,默認(rèn)為true。
如果為true,因?yàn)閷⒁粋€(gè)不同步的副本提升為首領(lǐng)副本,有可能造成數(shù)據(jù)不一致的問(wèn)題。
如果為false,該分區(qū)可能長(zhǎng)時(shí)間不可用,降低可用性。
具體的配置要根據(jù)業(yè)務(wù)場(chǎng)景,比如在銀行系統(tǒng)中,寧愿選擇不可用,也不能容忍數(shù)據(jù)不一致而導(dǎo)致的錯(cuò)誤結(jié)果。
最少同步副本
min.insync.replicas
在實(shí)際的場(chǎng)景中,會(huì)出現(xiàn)只有一個(gè)同步副本的情況,根據(jù)可靠性保證,消息只有被寫入到所有同步副本后才被認(rèn)為是已提交的。但如果只有一個(gè)同步副本,如果其不可用,則數(shù)據(jù)丟失。
要確保已提交的數(shù)據(jù)被寫入不止一個(gè)副本,需要將min.insync.replicas設(shè)置大一些,比如2,即至少要存在兩個(gè)同步副本才能向分區(qū)寫入數(shù)據(jù)。
如果只有一個(gè)副本不可用,不會(huì)有什么問(wèn)題,但是如果兩個(gè)副本都變?yōu)椴豢捎茫瑒tbroker就會(huì)停止接收生產(chǎn)者的請(qǐng)求。