深入淺出解讀 Kafka 的可靠性機(jī)制

1. 副本機(jī)制

在分布式系統(tǒng)中椿每,為了提高可靠性捶闸,最常用、最有效的策略是“副本機(jī)制”拖刃,Kafka 也不例外。Kafka 為每個(gè) Partition 維護(hù)了一個(gè) AR(Assigned Replicas)列表贪绘,由 ISR(In-Sync Replicas兑牡,與 Leader 數(shù)據(jù)同步的 Replica)和 OSR(Outof-Sync Replicas,與 Leader 數(shù)據(jù)不同步的 Replica)組成税灌。初始狀態(tài)下均函,所有的 Replica 都在 ISR 中,但在 Kafka 工作過程中菱涤,由于各種問題(網(wǎng)絡(luò)苞也、磁盤、內(nèi)存)可能導(dǎo)致部分 Replica 的同步速度慢于參數(shù) replica.lag.time.max.ms 指定的閾值粘秆,一旦出現(xiàn)這種情況如迟,這部分 Replica 會被移出 ISR,降級至 OSR 中攻走。

關(guān)于參數(shù) replica.lag.time.max.ms

數(shù)據(jù)類型為 Long殷勘,默認(rèn)值為 10000,重要性為 High昔搂,官方解釋如下:

If a follower hasn't sent any fetch requests or hasn't consumed up to the leaders log end offset for at least this time, the leader will remove the follower from ISR.

副本機(jī)制如何作用玲销?

Producer 指定 Topic 向 Broker 發(fā)送消息,經(jīng)過內(nèi)部處理(如負(fù)載均衡等)后寫入某 Partition 的 Leader摘符,Leader 收到消息數(shù)據(jù)后并不會立即回應(yīng) Producer贤斜,而是等待 ISR 列表中所有的 Replica 同步數(shù)據(jù)完成策吠,之后才向 Producer 返回成功消息。這是不是與 Raft 算法有點(diǎn)類似瘩绒?

基于上述分析猴抹,不難理解,只要保證 ISR 中的 Replica 數(shù)量大于 2(ISR 包括 Leader)草讶,即便出現(xiàn) Leader 突然故障下線的情況洽糟,也能保證消息不丟失(因?yàn)?ISR 中的 Replica 與 Leader 保持同步)。當(dāng)然堕战,凡事過猶不及坤溃,ISR 中 Replica 的數(shù)量不宜過多,否則會降低 Kafka 的吞吐性能嘱丢。

補(bǔ)充一點(diǎn)薪介,OSR 內(nèi)的 Replica 是否同步了 Leader 的數(shù)據(jù)不影響數(shù)據(jù)是否提交成功,這些 Replica 會不斷從 Leader 中同步數(shù)據(jù)越驻。至于同步的進(jìn)度并不重要汁政,不過,運(yùn)維人員應(yīng)密切關(guān)注 Replica 從 ISR 中降級轉(zhuǎn)入 OSR 的情況缀旁,并及時(shí)排查故障记劈,使其盡快回到 ISR 中,以維持 ISR 中 Replica 的數(shù)量處于合理狀態(tài)并巍,同時(shí)降低集群宕機(jī)的風(fēng)險(xiǎn)目木。

2. 截?cái)鄼C(jī)制

在第 12 課中,我們介紹了 LEO 和 HW 在正常情況下的流轉(zhuǎn)過程懊渡,那遇到異常情況又會怎樣呢刽射?

如果出現(xiàn) Leader 故障下線的情況,就需要從所有的 Follower 中選舉新的 Leader剃执,以便繼續(xù)提供服務(wù)誓禁。為了保證一致性,通常只能從 ISR 列表中選取新的 Leader (上面已經(jīng)介紹肾档,ISR 列表中的 Follower 與原 Leader 保持同步)摹恰,因此,無論 ISR 中哪個(gè) Follower 被選為新的 Leader怒见,它都知道 HW 之前的數(shù)據(jù)戒祠,可以保證在切換了 Leader 后,Consumer 可以繼續(xù)“看到”之前已經(jīng)由 Producer 提交的數(shù)據(jù)速种。

如下圖所示姜盈,如果 Leader 宕機(jī),F(xiàn)ollower1 被選為新的 Leader配阵,而新 Leader (原 Follower1 )并沒有完全同步之前 Leader 的所有數(shù)據(jù)(少了一個(gè)消息 6)馏颂,之后示血,新 Leader 又繼續(xù)接受了新的數(shù)據(jù),此時(shí)救拉,原本宕機(jī)的 Leader 經(jīng)修復(fù)后重新上線难审,它將發(fā)現(xiàn)新 Leader 中的數(shù)據(jù)和自己持有的數(shù)據(jù)不一致,怎么辦呢亿絮?

為了保證一致性告喊,必須有一方妥協(xié),顯然舊的 Leader 優(yōu)先級較低派昧,因此黔姜, 它會將自己的數(shù)據(jù)截?cái)嗟藉礄C(jī)之前的 HW 位置(HW 之前的數(shù)據(jù),與 Leader 一定是相同的)蒂萎,然后同步新 Leader 的數(shù)據(jù)秆吵。這便是所謂的 “截?cái)鄼C(jī)制”。

enter image description here

3. 消息生產(chǎn)的可靠性

3.1 消息可能重復(fù)生產(chǎn)

在第 12 課 2.4 小節(jié)中五慈,我們介紹了消息生產(chǎn)過程中保證數(shù)據(jù)可靠性的策略纳寂。該策略雖然可以保障消息不丟失,但無法避免出現(xiàn)重復(fù)消息泻拦。例如毙芜,生產(chǎn)者發(fā)送數(shù)據(jù)給 Leader,Leader 同步數(shù)據(jù)給 ISR 中的 Follower争拐,同步到一半 Leader 時(shí)宕機(jī)腋粥,此時(shí)選出新的 Leader,它可能具有部分此次提交的數(shù)據(jù)陆错,而生產(chǎn)者收到發(fā)送失敗響應(yīng)后將重發(fā)數(shù)據(jù),新的 Leader 接受數(shù)據(jù)則數(shù)據(jù)重復(fù)金赦。因此 Kafka 只支持“At Most Once”和“At Least Once”音瓷,而不支持“Exactly Once”,消息去重需在具體的業(yè)務(wù)中實(shí)現(xiàn)夹抗。

  1. At Most Once:消息可能會丟绳慎,但絕不會重復(fù)傳輸;
  2. At Least Once:消息絕不會丟漠烧,但可能會重復(fù)傳輸杏愤;
  3. Exactly once:每條消息肯定會被傳輸一次且僅傳輸一次。

3.2 配置示例

綜上所述已脓,對高可靠性有要求的應(yīng)用場景中珊楼,生產(chǎn)者的配置示例如下。

Broker 配置:

default.replication.factor=3
min.insync.replicas=2

Producer 配置:

roperties props = new Properties();
props.put("bootstrap.servers", "100.120.130.170:9092,100.120.130.171:9092, 100.120.130.172:9092");
props.put("acks", "all"); //保證高可靠性度液,設(shè)置成"all"或者"-1"
props.put("retries", 3);  //重試次數(shù)閾值厕宗,這里設(shè)置為3
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); //這里是key的序列化類
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");//這里是value的序列化類
Producer<String, String> producer = new KafkaProducer<String,String>(props);

4. 消息發(fā)送的可靠性

還有 70% 的精彩內(nèi)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
支付 ¥5.99 繼續(xù)閱讀
  • 序言:七十年代末画舌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子已慢,更是在濱河造成了極大的恐慌曲聂,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佑惠,死亡現(xiàn)場離奇詭異朋腋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)膜楷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門旭咽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人把将,你說我怎么就攤上這事轻专。” “怎么了察蹲?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵请垛,是天一觀的道長。 經(jīng)常有香客問我洽议,道長宗收,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任亚兄,我火速辦了婚禮混稽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘审胚。我一直安慰自己匈勋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布膳叨。 她就那樣靜靜地躺著洽洁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菲嘴。 梳的紋絲不亂的頭發(fā)上饿自,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音龄坪,去河邊找鬼昭雌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛健田,可吹牛的內(nèi)容都是我干的烛卧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼妓局,長吁一口氣:“原來是場噩夢啊……” “哼唱星!你這毒婦竟也來了雳旅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤间聊,失蹤者是張志新(化名)和其女友劉穎攒盈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哎榴,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡型豁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尚蝌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迎变。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖飘言,靈堂內(nèi)的尸體忽然破棺而出衣形,到底是詐尸還是另有隱情,我是刑警寧澤姿鸿,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布谆吴,位于F島的核電站,受9級特大地震影響苛预,放射性物質(zhì)發(fā)生泄漏句狼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一热某、第九天 我趴在偏房一處隱蔽的房頂上張望腻菇。 院中可真熱鬧,春花似錦昔馋、人聲如沸筹吐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丘薛。三九已至,卻和暖如春垄提,著一層夾襖步出監(jiān)牢的瞬間榔袋,已是汗流浹背周拐。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工铡俐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妥粟。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓审丘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親勾给。 傳聞我的和親對象是個(gè)殘疾皇子滩报,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

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