Kafka消息傳遞的可靠性

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)求。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容