溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

當(dāng)Kafka分區(qū)不可用且 副本被損壞時如何盡量減少數(shù)據(jù)的丟失

發(fā)布時間:2021-12-15 11:22:51 來源:億速云 閱讀:414 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了當(dāng)Kafka分區(qū)不可用且 副本被損壞時如何盡量減少數(shù)據(jù)的丟失,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

下面專門對分區(qū)不可用進行故障重現(xiàn),并給出我的一些騷操作來盡量減少數(shù)據(jù)的丟失。

故障重現(xiàn)

下面我用一個例子重現(xiàn)現(xiàn)分區(qū)不可用且 leader 副本被損壞的例子:

  1. 使用 unclean.leader.election.enable = false 參數(shù)啟動 broker0;

  2. 使用 unclean.leader.election.enable = false 參數(shù)啟動 broker1;

  3. 創(chuàng)建 topic-1,partition=1,replica-factor=2;

  4. 將消息寫入 topic-1;

  5. 此時,兩個 broker 上的副本都處于 ISR 中,broker0 的副本為 leader 副本;

  6. 停止 broker1,此時 topic-1 的 leader 依然時 broker0 的副本,而 broker1 的副本從 ISR 中剔除;

  7. 停止 broker0,并且刪除 broker0 上的日志數(shù)據(jù)

  8. 重啟 broker1,topic-1 嘗試連接 leader 副本,但此時 broker0 已經(jīng)停止運行,此時分區(qū)處于不可用狀態(tài),無法寫入消息;

  9. 恢復(fù) broker0,broker0 上的副本恢復(fù) leader 職位,此時 broker1 嘗試加入 ISR,但此時由于 leader 的數(shù)據(jù)被清除,即偏移量為 0,此時 broker1 的副本需要截斷日志,保持偏移量不大于 leader 副本,此時分區(qū)的數(shù)據(jù)全部丟失

我的建議

在遇到分區(qū)不可用時,是否可以提供一個選項,讓用戶可以手動設(shè)置分區(qū)內(nèi)任意一個副本作為 leader?

因為集群一旦設(shè)置了 unclean.leader.election.enable = false,就無法選舉 ISR 以外的副本作為 leader,在極端情況下僅剩 leader 副本還在 ISR 中,此時 leader 所在的 broker 宕機了,那如果此時 broker 數(shù)據(jù)發(fā)生損壞這么辦?在這種情況下,能不能讓用戶自己選擇 leader 副本呢?盡管這么做也是會有數(shù)據(jù)丟失,但相比整個分區(qū)的數(shù)據(jù)都丟失而言,情況還是會好很多的。

我的騷操作

首先你得有一個不可用的分區(qū)(并且該分區(qū) leader 副本數(shù)據(jù)已損失),如果是測試,可以以上故障重現(xiàn) 1-8 步驟實現(xiàn)一個不可用的分區(qū)(需要增加一個 broker):

當(dāng)Kafka分區(qū)不可用且 副本被損壞時如何盡量減少數(shù)據(jù)的丟失

此時 leader 副本在 broker0,但已經(jīng)掛了,且分區(qū)不可用,此時 broker2 的副本由于掉出 ISR ,不可選為 leader,且 leader 副本已損壞清除,如果此時重啟 broker0,follower 副本會進行日志截斷,將會丟失該分區(qū)所有數(shù)據(jù)。

經(jīng)過一系列的測試與實驗,我總結(jié)出了以下騷操作,可以強行把 broker2 的副本選為 leader,盡量減少數(shù)據(jù)丟失:

1、使用 kafka-reassign-partitions.sh 腳本對該主題進行分區(qū)重分配,當(dāng)然你也可以使用 kafka-manager 控制臺對該主題進行分區(qū)重分配,重分配之后如下:

當(dāng)Kafka分區(qū)不可用且 副本被損壞時如何盡量減少數(shù)據(jù)的丟失

此時 preferred leader 已經(jīng)改成 broker2 所在的副本了,但此時的 leader 依然還是 broker0 的副本。需要注意的是,分區(qū)重分配之后的 preferred leader 一定要之前那個踢出 ISR 的副本,而不是分區(qū)重分配新生成的副本。因為新生成的副本偏移量為 0,如果自動重分配不滿足,那么需要編寫 json 文件,手動更改分配策略。

2、進入 zk,查看分區(qū)狀態(tài)并修改它的內(nèi)容:

當(dāng)Kafka分區(qū)不可用且 副本被損壞時如何盡量減少數(shù)據(jù)的丟失

修改 node 內(nèi)容,強行將 leader 改成 2(與重分配之后的 preferred leader 一樣),并且將 leader_epoch 加 1 處理,同時 ISR 列表改成 leader,改完如下:

當(dāng)Kafka分區(qū)不可用且 副本被損壞時如何盡量減少數(shù)據(jù)的丟失

此時,kafka-manager 控制臺會顯示成這樣:

當(dāng)Kafka分區(qū)不可用且 副本被損壞時如何盡量減少數(shù)據(jù)的丟失

但此時依然不生效,記住這時需要重啟 broker 0。

3、重啟 broker0,發(fā)現(xiàn)分區(qū)的 lastOffset 已經(jīng)變成了 broker2 的副本的 lastOffset:

當(dāng)Kafka分區(qū)不可用且 副本被損壞時如何盡量減少數(shù)據(jù)的丟失

成功挽回了 46502 條消息數(shù)據(jù),盡管依然丟失了 76053 - 46502 = 29551 條消息數(shù)據(jù),但相比全部丟失相對好吧!

上述內(nèi)容就是當(dāng)Kafka分區(qū)不可用且 副本被損壞時如何盡量減少數(shù)據(jù)的丟失,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI