Kafka之ISR機制的理解

Kafka對于producer發(fā)來的消息怎么保證可靠性碴巾?
每個partition都給配上副本锋勺,做數(shù)據(jù)同步崭添,保證數(shù)據(jù)不丟失。

副本數(shù)據(jù)同步策略
和zookeeper不同的是,Kafka選擇的是全部完成同步郑诺,才發(fā)送ack羡鸥。但是又有所區(qū)別想括。

所以曾沈,你們才會在各種博客看到這句話【kafka不是完全同步这嚣,也不是完全異步,是一種ISR機制】

這句話對也不對塞俱,不對也對(謎語人......)

首先筆者認為:Kafka使用的就是完全同步方案姐帚。

完全同步的優(yōu)點
同樣為了容忍 n 臺節(jié)點的故障,過半機制需要 2n+1 個副本障涯,而全部同步方案只需要 n+1 個副本罐旗,

而 Kafka 的每個分區(qū)都有大量的數(shù)據(jù),過半機制方案會造成大量數(shù)據(jù)的冗余唯蝶。(這就是和zookeeper的不同)

完全同步會有什么問題九秀?
假設就有這么一個follower延遲太高或者某種故障的情況出現(xiàn),導致遲遲不能與leader進行同步粘我。

怎么辦鼓蜒?leader等還是不等?

等吧:producer有話要說:“Kafka也不行啊征字,處理個消息這么費勁都弹,垃圾,你等NM呢等”

不等:那你Kafka對外說完全同步個雞兒匙姜,你這是完全同步么畅厢?

基于此,Kafka的設計者和開發(fā)者想出了一個非常雞賊的點子:ISR

什么是ISR氮昧?
先來看幾個概念

1或详、AR(Assigned Repllicas)一個partition的所有副本(就是replica,不區(qū)分leader或follower)

2郭计、ISR(In-Sync Replicas)能夠和 leader 保持同步的 follower + leader本身 組成的集合霸琴。

3、OSR(Out-Sync Relipcas)不能和 leader 保持同步的 follower 集合

4昭伸、公式:AR = ISR + OSR

所以梧乘,看明白了嗎?

Kafka對外依然可以聲稱是完全同步庐杨,但是承諾是對AR中的所有replica完全同步了嗎选调?

并沒有。Kafka只保證對ISR集合中的所有副本保證完全同步灵份。

至于仁堪,ISR到底有多少個follower,那不知道填渠,別問弦聂,問就是完全同步鸟辅,你再問就多了。

這就好比網(wǎng)購買一送一莺葫,結果郵來了一大一小兩個產(chǎn)品匪凉。

你可能覺得有問題,其實是沒問題的捺檬,商家說送的那個是一模一樣的了嗎再层?并沒有。

ISR就是這個道理堡纬,Kafka是一定會保證leader接收到的消息完全同步給ISR中的所有副本聂受。

而最壞的情況下,ISR中只剩leader自己烤镐。

基于此饺饭,上述完全同步會出現(xiàn)的問題就不是問題了。

因為ISR的機制就保證了职车,處于ISR內部的follower都是可以和leader進行同步的瘫俊,一旦出現(xiàn)故障或延遲,就會被踢出ISR悴灵。

ISR 的核心就是:動態(tài)調整

總結:Kafka采用的就是一種完全同步的方案扛芽,而ISR是基于完全同步的一種優(yōu)化機制。

follower的作用
讀寫都是由leader處理积瞒,follower只是作備份功能川尖,不對外提供服務。

什么情況ISR中的replica會被踢出ISR茫孔?
以前有2個配置

默認10000 即 10秒

replica.lag.time.max.ms

允許 follower 副本落后 leader 副本的消息數(shù)量叮喳,超過這個數(shù)量后,follower 會被踢出 ISR

replica.lag.max.messages
說白了就是一個衡量leader和follower之間差距的標準缰贝。

一個是基于時間間隔馍悟,一個是基于消息條數(shù)。

0.9.0.0版本之后剩晴,移除了replica.lag.max.messages 配置锣咒。

為什么?

因為producer是可以批量發(fā)送消息的赞弥,很容易超過replica.lag.max.messages毅整,那么被踢出ISR的follower就是受了無妄之災。

他們都是沒問題的绽左,既沒有出故障也沒高延遲悼嫉,憑什么被踢?

replica.lag.max.messages調大呢拼窥?調多大戏蔑?太大了是否會有漏網(wǎng)之魚蹋凝,造成數(shù)據(jù)丟失風險?

這就是replica.lag.max.messages的設計缺陷辛臊。

replica.lag.time.max.ms的誤區(qū)
【只要在 replica.lag.time.max.ms 時間內 follower 有同步消息仙粱,即認為該 follower 處于 ISR 中】

你去網(wǎng)上看博客房交,很多博客表達的就是這個意思彻舰,不過筆者認為這么描述很容易誤導初學者。

那我是不是可以理解為候味,follower有個定時任務刃唤,只要在replica.lag.time.max.ms時間內去leader那pull數(shù)據(jù)就行了。

其實不是的白群。千萬不要這么認為尚胞,因為這里還涉及一個速率問題(你理解為蓄水池一個放水一個注水的問題)。

如果leader副本的消息流入速度大于follower副本的拉取速度時帜慢,你follower就是實時同步有什么用笼裳?

典型的出工不出力,消息只會越差越多粱玲,這種follower肯定是要被踢出ISR的躬柬。

當follower副本將leader副本的LEO之前的日志全部同步時,則認為該follower副本已經(jīng)追趕上leader副本抽减。

此時更新該副本的lastCaughtUpTimeMs標識允青。

Kafka的副本管理器(ReplicaManager)啟動時會啟動一個副本過期檢測的定時任務,

會定時檢查當前時間與副本的lastCaughtUpTimeMs差值是否大于參數(shù)replica.lag.time.max.ms指定的值卵沉。

所以replica.lag.time.max.ms的正確理解是:

follower在過去的replica.lag.time.max.ms時間內颠锉,已經(jīng)追趕上leader一次了。

follower到底出了什么問題史汗?
兩個方面琼掠,一個是Kafka自身的問題,另一個是外部原因

Kafka源碼注釋中說明了一般有兩種情況會導致副本失效:

1停撞、follower副本進程卡住眉枕,在一段時間內根本沒有想leader副本發(fā)起同步請求,比如頻繁的Full GC怜森。

2速挑、follower副本進程同步過慢,在一段時間內都無法追趕上leader副本副硅,比如IO開銷過大姥宝。

1、通過工具增加了副本因子恐疲,那么新增加的副本在趕上leader副本之前也都是處于失效狀態(tài)的腊满。

2套么、如果一個follower副本由于某些原因(比如宕機)而下線,之后又上線碳蛋,在追趕上leader副本之前也是出于失效狀態(tài)胚泌。

什么情況OSR中的replica會重新加入ISR?
基于上述肃弟,replica重新追上了leader玷室,就會回到ISR中。

相關的重要概念
需要先明確幾個概念:

1笤受、LEO(last end offset):

當前replica存的最大的offset的下一個值

2穷缤、HW(high watermark):

小于 HW 值的offset所對應的消息被認為是“已提交”或“已備份”的消息,才對消費者可見箩兽。

假設ISR中目前有1個leader津肛,3個follower。

1汗贫、leader接收一個消息身坐,自己保存后,馬上發(fā)送3個請求通知3個follower趕緊保存

2落包、等待3個follower響應保存成功

3部蛇、響應producer,消息提交成功

你是這么想的么妥色?反正當時我是這么想的搪花。

實際上不是的,這個同步是follower主動去請求leader進行同步的嘹害。

因為是每個follower情況不一樣撮竿,所以才會出現(xiàn)LEO和HW的概念。

簡言之笔呀,木桶原理

replica里存了多少數(shù)據(jù)和consumer能消費多少數(shù)據(jù)幢踏,不是一回事。

所謂木桶原理许师,就是把每個replica當作一個木桶的板子房蝉,桶能裝多少水只取決于最短的那塊板子。

這就是也有些人把HW叫成 高水位 的原因微渠。

而 HW 的概念搭幻,也契合前文提到的【完全同步】,HW之前的所有消息逞盆,在ISR中是完全同步的檀蹋。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市云芦,隨后出現(xiàn)的幾起案子俯逾,更是在濱河造成了極大的恐慌贸桶,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桌肴,死亡現(xiàn)場離奇詭異皇筛,居然都是意外死亡,警方通過查閱死者的電腦和手機坠七,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門水醋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灼捂,你說我怎么就攤上這事离例』煌牛” “怎么了悉稠?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長艘包。 經(jīng)常有香客問我的猛,道長,這世上最難降的妖魔是什么想虎? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任卦尊,我火速辦了婚禮,結果婚禮上舌厨,老公的妹妹穿的比我還像新娘岂却。我一直安慰自己,他們只是感情好裙椭,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布躏哩。 她就那樣靜靜地躺著,像睡著了一般揉燃。 火紅的嫁衣襯著肌膚如雪扫尺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天炊汤,我揣著相機與錄音正驻,去河邊找鬼。 笑死抢腐,一個胖子當著我的面吹牛姑曙,可吹牛的內容都是我干的。 我是一名探鬼主播迈倍,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伤靠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了授瘦?” 一聲冷哼從身側響起醋界,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤竟宋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后形纺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丘侠,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年逐样,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜗字。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡脂新,死狀恐怖挪捕,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情争便,我是刑警寧澤级零,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站滞乙,受9級特大地震影響奏纪,放射性物質發(fā)生泄漏。R本人自食惡果不足惜斩启,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一序调、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兔簇,春花似錦发绢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至此虑,卻和暖如春甚纲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朦前。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工介杆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人韭寸。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓春哨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恩伺。 傳聞我的和親對象是個殘疾皇子赴背,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容