【kafka運(yùn)維】數(shù)據(jù)遷移顽馋、分區(qū)副本重分配谓厘、跨路徑遷移、副本擴(kuò)縮容(附教學(xué)視頻)

日常運(yùn)維寸谜、問(wèn)題排查=>滴滴開源LogiKM一站式Kafka監(jiān)控與管控平臺(tái)

如果你不想看文章,可以直接看配套的視頻; (后續(xù)的視頻會(huì)在 公眾號(hào)竟稳、CSDN、B站等各平臺(tái)同名號(hào)[石臻臻的雜貨鋪]上上傳 )

本期視頻內(nèi)容:

  1. 分區(qū)副本重分配教程
  2. 重分配的注意事項(xiàng)
  3. LogiKm簡(jiǎn)化重分配流程,更高效
  4. 跨副本遷移

視頻請(qǐng)看: 【Kafka運(yùn)維】分區(qū)副本重分配操作+注意事項(xiàng)+利用LogIKM簡(jiǎn)化操作

腳本參數(shù)

參數(shù) 描述 例子
--zookeeper 連接zk --zookeeper localhost:2181, localhost:2182
--topics-to-move-json-file 指定json文件,文件內(nèi)容為topic配置 --topics-to-move-json-file config/move-json-file.json Json文件格式如下:
在這里插入圖片描述
--generate 嘗試給出副本重分配的策略,該命令并不實(shí)際執(zhí)行
--broker-list 指定具體的BrokerList,用于嘗試給出分配策略,與--generate搭配使用 --broker-list 0,1,2,3
--reassignment-json-file 指定要重分配的json文件,與--execute搭配使用 json文件格式如下例如:
在這里插入圖片描述
--execute 開始執(zhí)行重分配任務(wù),與--reassignment-json-file搭配使用
--verify 驗(yàn)證任務(wù)是否執(zhí)行成功,當(dāng)有使用--throttle限流的話,該命令還會(huì)移除限流;該命令很重要,不移除限流對(duì)正常的副本之間同步會(huì)有影響
--throttle 遷移過(guò)程Broker之間現(xiàn)在流程傳輸?shù)乃俾?單位 bytes/sec -- throttle 500000
--replica-alter-log-dirs-throttle broker內(nèi)部副本跨路徑遷移數(shù)據(jù)流量限制功能熊痴,限制數(shù)據(jù)拷貝從一個(gè)目錄到另外一個(gè)目錄帶寬上限 單位 bytes/sec --replica-alter-log-dirs-throttle 100000
--disable-rack-aware 關(guān)閉機(jī)架感知能力,在分配的時(shí)候就不參考機(jī)架的信息
--bootstrap-server 如果是副本跨路徑遷移必須有此參數(shù)

1. 腳本的使用介紹

該腳本是kafka提供用來(lái)重新分配分區(qū)的腳本工具;

1.1 生成推薦配置腳本

關(guān)鍵參數(shù)--generate

在進(jìn)行分區(qū)副本重分配之前,最好是用下面方式獲取一個(gè)合理的分配文件;
編寫move-json-file.json文件; 這個(gè)文件就是告知想對(duì)哪些Topic進(jìn)行重新分配的計(jì)算

{
  "topics": [
    {"topic": "test_create_topic1"}
  ],
  "version": 1
}

然后執(zhí)行下面的腳本,--broker-list "0,1,2,3" 這個(gè)參數(shù)是你想要分配的Brokers;

sh bin/kafka-reassign-partitions.sh --zookeeper xxx:2181 --topics-to-move-json-file config/move-json-file.json --broker-list "0,1,2,3" --generate

執(zhí)行完畢之后會(huì)打印

Current partition replica assignment//當(dāng)前副本分配方式
{"version":1,"partitions":[{"topic":"test_create_topic1","partition":2,"replicas":[1],"log_dirs":["any"]},{"topic":"test_create_topic1","partition":1,"replicas":[3],"log_dirs":["any"]},{"topic":"test_create_topic1","partition":0,"replicas":[2],"log_dirs":["any"]}]}

Proposed partition reassignment configuration//期望的重新分配方式
{"version":1,"partitions":[{"topic":"test_create_topic1","partition":2,"replicas":[2],"log_dirs":["any"]},{"topic":"test_create_topic1","partition":1,"replicas":[1],"log_dirs":["any"]},{"topic":"test_create_topic1","partition":0,"replicas":[0],"log_dirs":["any"]}]}

需求注意的是他爸,此時(shí)分區(qū)移動(dòng)尚未開始,它只是告訴你當(dāng)前的分配和建議果善。保存當(dāng)前分配诊笤,以防你想要回滾它

1.2. 執(zhí)行Json文件

關(guān)鍵參數(shù)--execute
將上面得到期望的重新分配方式文件保存在一個(gè)json文件里面
reassignment-json-file.json


{"version":1,"partitions":[{"topic":"test_create_topic1","partition":2,"replicas":[2],"log_dirs":["any"]},{"topic":"test_create_topic1","partition":1,"replicas":[1],"log_dirs":["any"]},{"topic":"test_create_topic1","partition":0,"replicas":[0],"log_dirs":["any"]}]}

然后執(zhí)行

sh bin/kafka-reassign-partitions.sh --zookeeper xxxxx:2181 --reassignment-json-file config/reassignment-json-file.json --execute

遷移過(guò)程注意流量陡增對(duì)集群的影響
Kafka提供一個(gè)broker之間復(fù)制傳輸?shù)牧髁肯拗疲拗屏烁北緩臋C(jī)器到另一臺(tái)機(jī)器的帶寬上限岭埠,當(dāng)重新平衡集群盏混,引導(dǎo)新broker蔚鸥,添加或移除broker時(shí)候惜论,這是很有用的。因?yàn)樗拗屏诉@些密集型的數(shù)據(jù)操作從而保障了對(duì)用戶的影響止喷、
例如我們上面的遷移操作加一個(gè)限流選項(xiàng)-- throttle 50000000

> sh bin/kafka-reassign-partitions.sh --zookeeper xxxxx:2181 --reassignment-json-file config/reassignment-json-file.json --execute -- throttle 50000000

在后面加上一個(gè)—throttle 50000000 參數(shù), 那么執(zhí)行移動(dòng)分區(qū)的時(shí)候,會(huì)被限制流量在50000000 B/s
加上參數(shù)后你可以看到

The throttle limit was set to 50000000 B/s
Successfully started reassignment of partitions.

需要注意的是,如果你遷移的時(shí)候包含 副本跨路徑遷移(同一個(gè)Broker多個(gè)路徑)那么這個(gè)限流措施不會(huì)生效,你需要再加上|--replica-alter-log-dirs-throttle 這個(gè)限流參數(shù),它限制的是同一個(gè)Broker不同路徑直接遷移的限流;

如果你想在重新平衡期間修改限制概疆,增加吞吐量臀突,以便完成的更快。你可以重新運(yùn)行execute命令,用相同的reassignment-json-file

1.3. 驗(yàn)證

關(guān)鍵參數(shù)--verify
該選項(xiàng)用于檢查分區(qū)重新分配的狀態(tài)疚俱,同時(shí)—throttle流量限制也會(huì)被移除掉; 否則可能會(huì)導(dǎo)致定期復(fù)制操作的流量也受到限制。

sh bin/kafka-reassign-partitions.sh --zookeeper xxxx:2181 --reassignment-json-file config/reassignment-json-file.json --verify

在這里插入圖片描述

注意: 當(dāng)你輸入的BrokerId不存在時(shí),該副本的操作會(huì)失敗,但是不會(huì)影響其他的;例如
在這里插入圖片描述

2. 副本擴(kuò)縮

kafka并沒(méi)有提供一個(gè)專門的腳本來(lái)支持副本的擴(kuò)縮, 不像kafka-topic.sh腳本一樣,是可以擴(kuò)分區(qū)的; 想要對(duì)副本進(jìn)行擴(kuò)縮,只能是曲線救國(guó)了; 利用kafka-reassign-partitions.sh來(lái)重新分配副本

2.1 副本擴(kuò)容

假設(shè)我們當(dāng)前的情況是 3分區(qū)1副本,為了提供可用性,我想把副本數(shù)升到2;

2.1.1 計(jì)算副本分配方式

我們用步驟1.1--generate 獲取一下當(dāng)前的分配情況,得到如下json

{
    "version": 1,
    "partitions": [{
        "topic": "test_create_topic1",
        "partition": 2,
        "replicas": [2],
        "log_dirs": ["any"]
    }, {
        "topic": "test_create_topic1",
        "partition": 1,
        "replicas": [1],
        "log_dirs": ["any"]
    }, {
        "topic": "test_create_topic1",
        "partition": 0,
        "replicas": [0],
        "log_dirs": ["any"]
    }]
}

我們想把所有分區(qū)的副本都變成2,那我們只需修改"replicas": []里面的值了,這里面是Broker列表,排在第一個(gè)的是Leader; 所以我們根據(jù)自己想要的分配規(guī)則修改一下json文件就變成如下

{
    "version": 1,
    "partitions": [{
        "topic": "test_create_topic1",
        "partition": 2,
        "replicas": [2,0],
        "log_dirs": ["any","any"]
    }, {
        "topic": "test_create_topic1",
        "partition": 1,
        "replicas": [1,2],
        "log_dirs": ["any","any"]
    }, {
        "topic": "test_create_topic1",
        "partition": 0,
        "replicas": [0,1],
        "log_dirs": ["any","any"]
    }]
}

注意log_dirs里面的數(shù)量要和replicas數(shù)量匹配;或者直接把log_dirs選項(xiàng)刪除掉; 這個(gè)log_dirs是副本跨路徑遷移時(shí)候的絕對(duì)路徑

2.1.2 執(zhí)行--execute

在這里插入圖片描述

如果你想在重新平衡期間修改限制钾虐,增加吞吐量眼五,以便完成的更快。你可以重新運(yùn)行execute命令植康,用相同的reassignment-json-file:

2.1.2 驗(yàn)證--verify

在這里插入圖片描述

完事之后,副本數(shù)量就增加了;

2.2 副本縮容

副本縮容跟擴(kuò)容是一個(gè)意思; 當(dāng)副本分配少于之前的數(shù)量時(shí)候,多出來(lái)的副本會(huì)被刪除;
比如剛剛我新增了一個(gè)副本,想重新恢復(fù)到一個(gè)副本

執(zhí)行下面的json文件

{
  "version": 1,
  "partitions": [{
    "topic": "test_create_topic1",
    "partition": 2,
    "replicas": [2],
    "log_dirs": ["any"]
  }, {
    "topic": "test_create_topic1",
    "partition": 1,
    "replicas": [1],
    "log_dirs": ["any"]
  }, {
    "topic": "test_create_topic1",
    "partition": 0,
    "replicas": [0],
    "log_dirs": ["any"]
  }]
}

執(zhí)行之后可以看到其他的副本就被標(biāo)記為刪除了; 一會(huì)就會(huì)被清理掉


在這里插入圖片描述

<font color=red>用這樣一種方式我們雖然是實(shí)現(xiàn)了副本的擴(kuò)縮容, 但是副本的分配需要我們自己來(lái)把控好, 要做到負(fù)載均衡等等; 那肯定是沒(méi)有kafka自動(dòng)幫我們分配比較合理一點(diǎn); 那么我們有什么好的方法來(lái)幫我們給出一個(gè)合理分配的Json文件嗎?</font>PS:

我們之前已經(jīng)分析過(guò)【kafka源碼】創(chuàng)建Topic的時(shí)候是如何分區(qū)和副本的分配規(guī)則 那么我們把這樣一個(gè)分配過(guò)程也用同樣的規(guī)則來(lái)分配不就Ok了嗎旷太?
--generate本質(zhì)上也是調(diào)用了這個(gè)方法,AdminUtils.assignReplicasToBrokers(brokerMetadatas, assignment.size, replicas.size)

具體的實(shí)現(xiàn)操作請(qǐng)看 【kafka思考】最小成本的擴(kuò)縮容副本設(shè)計(jì)方案

自己寫一個(gè)工程來(lái)實(shí)現(xiàn)類似的方法,如果覺(jué)得很麻煩,可以直接使用
LogIKM 的新增副本功能直接幫你做了這個(gè)事情;(未來(lái)會(huì)實(shí)現(xiàn))

3. 分區(qū)擴(kuò)容

kafka的分區(qū)擴(kuò)容是 kafka-topis.sh腳本實(shí)現(xiàn)的;不支持縮容
分區(qū)擴(kuò)容請(qǐng)看 【kafka源碼】TopicCommand之a(chǎn)lter源碼解析(分區(qū)擴(kuò)容)

4. 分區(qū)遷移

分區(qū)遷移跟上面同理, 請(qǐng)看 1.1,1.2,1.3 部分;

5. 副本跨路徑遷移

為什么線上Kafka機(jī)器各個(gè)磁盤間的占用不均勻,經(jīng)常出現(xiàn)“一邊倒”的情形销睁? 這是因?yàn)镵afka只保證分區(qū)數(shù)量在各個(gè)磁盤上均勻分布供璧,但它無(wú)法知曉每個(gè)分區(qū)實(shí)際占用空間,故很有可能出現(xiàn)某些分區(qū)消息數(shù)量巨大導(dǎo)致占用大量磁盤空間的情況冻记。在1.1版本之前睡毒,用戶對(duì)此毫無(wú)辦法,因?yàn)?.1之前Kafka只支持分區(qū)數(shù)據(jù)在不同broker間的重分配冗栗,而無(wú)法做到在同一個(gè)broker下的不同磁盤間做重分配演顾。1.1版本正式支持副本在不同路徑間的遷移

怎么在一臺(tái)Broker上用多個(gè)路徑存放分區(qū)呢?

只需要在配置上接多個(gè)文件夾就行了

############################# Log Basics #############################

# A comma separated list of directories under which to store log files
log.dirs=kafka-logs-5,kafka-logs-6,kafka-logs-7,kafka-logs-8

注意同一個(gè)Broker上不同路徑只會(huì)存放不同的分區(qū)供搀,而不會(huì)將副本存放在同一個(gè)Broker; 不然那副本就沒(méi)有意義了(容災(zāi))

怎么針對(duì)跨路徑遷移呢?

遷移的json文件有一個(gè)參數(shù)是log_dirs; 默認(rèn)請(qǐng)求不傳的話 它是"log_dirs": ["any"] (這個(gè)數(shù)組的數(shù)量要跟副本保持一致)
但是你想實(shí)現(xiàn)跨路徑遷移,只需要在這里填入絕對(duì)路徑就行了,例如下面

遷移的json文件示例

{
  "version": 1,
  "partitions": [{
    "topic": "test_create_topic4",
    "partition": 2,
    "replicas": [0],
    "log_dirs": ["/Users/xxxxx/work/IdeaPj/source/kafka/kafka-logs-5"]
  }, {
    "topic": "test_create_topic4",
    "partition": 1,
    "replicas": [0],
    "log_dirs": ["/Users/xxxxx/work/IdeaPj/source/kafka/kafka-logs-6"]
  }]
}

然后執(zhí)行腳本

sh bin/kafka-reassign-partitions.sh --zookeeper xxxxx --reassignment-json-file config/reassignment-json-file.json --execute --bootstrap-server
xxxxx:9092 --replica-alter-log-dirs-throttle 10000

注意 --bootstrap-server 在跨路徑遷移的情況下,必須傳入此參數(shù)

如果需要限流的話 加上參數(shù)|--replica-alter-log-dirs-throttle ; 跟--throttle不一樣的是 --replica-alter-log-dirs-throttle限制的是Broker內(nèi)不同路徑的遷移流量;

源碼解析

源碼解析請(qǐng)看文章
【kafka源碼】ReassignPartitionsCommand源碼分析(副本擴(kuò)縮钠至、數(shù)據(jù)遷移趁曼、分區(qū)重分配、副本跨路徑遷移)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棕洋,一起剝皮案震驚了整個(gè)濱河市挡闰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掰盘,老刑警劉巖摄悯,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異愧捕,居然都是意外死亡奢驯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門次绘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瘪阁,“玉大人,你說(shuō)我怎么就攤上這事邮偎」芏澹” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵禾进,是天一觀的道長(zhǎng)豁跑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)泻云,這世上最難降的妖魔是什么艇拍? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮宠纯,結(jié)果婚禮上卸夕,老公的妹妹穿的比我還像新娘。我一直安慰自己婆瓜,他們只是感情好快集,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勃救,像睡著了一般碍讨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒙秒,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天勃黍,我揣著相機(jī)與錄音,去河邊找鬼晕讲。 笑死覆获,一個(gè)胖子當(dāng)著我的面吹牛马澈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弄息,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痊班,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了摹量?” 一聲冷哼從身側(cè)響起涤伐,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缨称,沒(méi)想到半個(gè)月后凝果,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睦尽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年器净,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片当凡。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡山害,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沿量,到底是詐尸還是另有隱情浪慌,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布欧瘪,位于F島的核電站眷射,受9級(jí)特大地震影響匙赞,放射性物質(zhì)發(fā)生泄漏佛掖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一涌庭、第九天 我趴在偏房一處隱蔽的房頂上張望芥被。 院中可真熱鬧,春花似錦坐榆、人聲如沸拴魄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匹中。三九已至,卻和暖如春豪诲,著一層夾襖步出監(jiān)牢的瞬間顶捷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工屎篱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留服赎,地道東北人葵蒂。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像重虑,于是被迫代替她去往敵國(guó)和親践付。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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