Kafka集羣擴容及數據轉移

最近我們生產環境的kafka集羣有增加節點的需求,然而kafka在新增節點後並不會像elasticsearch那樣感知到新節點加入後自動將數據reblance到新集羣中,因此這個過程需要我們手動分配。一番折騰之後,實現了增加kafka集羣節點並將原有數據均勻分配到擴容後的集羣。下面結合一個例子談一下整個過程。

一. 環境說明

1.假定當前的cluster中只有(0,1,2)三個kafka節點,有一個名爲20191009的topic,該topic有2個replica,均勻分佈在三個節點上.

2.我們要做的是在cluster中新增兩個節點(記爲3)後,將的數據均勻分到新集羣中的0,1,2,3 四個節點上。

二、kafka集羣擴容

 

1. scp -r kafka_2.11-0.11.0.3  [email protected]:/SERVICES01/  ##拷貝kafka文件到要擴容的機器上
2. cd /SERVERS01/kafka_2.11-0.11.0.3/config  ##進入172.18.186.29機器的kafka配置文件夾

   

3. vi server.properties   ##打開配置文件 修改kafka配置以下參數:
      broker.id=3
      listeners=PLAINTEXT://172.18.186.29:9092

 

4. wq    #保存文件
5. bin/kafka-server-start.sh -daemon config/server.properties  ##啓動kafka

三 .kafka數據遷移

 1. bin/kafka-topics.sh --list --zookeeper 172.18.163.203:2181,172.18.163.204:2181,172.18.163.205:2181  ##查看要topic列表和選擇要遷移的topic名稱

 

2. cat << EOF > topic-to-move.json

{

"topics": [

{"topic": "201909ack"},

{"topic": "20191009"}

],

"version":1

}

EOF

##確定要重啓分配分區的主題,新建topics-to-move.json   遷移json文件,遷移topic名稱爲”201909ack”,”20191009” 兩個

      

 

3. bin/kafka-reassign-partitions.sh --zookeeper 172.18.163.203:2181,172.18.163.204:2181,172.18.163.205:2181 --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2,4" –generate

##通過kafka-reassign-partitions.sh 獲取重新分配方案,--broker-lsit 的參數 "0,1,2,4"是指集羣中每個broker的id,由於我們是需要將所有topic均勻分配到擴完結點的4臺機器上,所以要指定。同理,當業務改變爲將原來的所有數據從舊節點(0,1,2)遷移到新節點(4)實現數據平滑遷移,這時的參數應"4"
,執行後會出現以下內容:
Current partition replica assignment       ##當前分區副本分配
{"version":1,"partitions":[{"topic":"20191009","partition":0,"replicas":[1,0]},{"topic":"201909ack","partition":0,"replicas":[0,2]}]}

Proposed partition reassignment configuration ##建議的分區重新分配配置
{"version":1,"partitions":[{"topic":"20191009","partition":0,"replicas":[2,0]},{"topic":"201909ack","partition":0,"replicas":[2,0]}]}

 

4. cat << EOF > expand-cluster-reassignment.json
{"version":1,"partitions":[{"topic":"20191009","partition":0,"replicas":[2,0]},{"topic":"201909ack","partition":0,"replicas":[2,0]}]}
EOF

##改變後的分佈配置保存爲expand-cluster-reassignment.json

 

5.bin/kafka-reassign-partitions.sh --zookeeper 172.18.163.203:2181,172.18.163.204:2181,172.18.163.205:2181 --reassignment-json-file expand-cluster-reassignment.json --execute

##使用-execute執行遷移計劃

 

6. bin/kafka-reassign-partitions.sh --zookeeper 172.18.163.203:2181,172.18.163.204:2181,172.18.163.205:2181  --reassignment-json-file expand-cluster-reassignment.json --verify

##使用--verify進行遷移結果的驗證,出現以下則遷移成功:
  Status of partition reassignment:
Reassignment of partition [20191009,0] completed successfully
Reassignment of partition [201909ack,0] completed successfully

四. kafka Topic遷移後驗證

1.bin/kafka-console-producer.sh --broker-list 172.18.163.203:9092,172.18.163.204:9092,172.18.163.205:9092 --topic 20191009

##在172.18.160.203機器執行遷移的TOPIC生產者

 

2. bin/kafka-console-consumer.sh --zookeeper 172.18.163.203:2181,172.18.163.204:2181,172.18.163.205:2181 --topic 20191009 --from-beginning

##在新擴容的機器上執行遷移的TOPIC消費者,正常消費所有數據,則再次驗證TOPIC遷移成功

五 .總結說明

操作中三個小技巧:

1.主題量很多的是就不要一個一個複製粘貼了,用excel的拼接函數,還是很方便

2. 最後一步驗證中,主題很多的時候,會有很多在爲未完成的輸出語句夾雜其中。在語句後面加上  | grep -c "progress"就知道有多少分區還沒完成,輸出爲0的時候就是完成了。

總結和知識點理解

1、kafka新建主題時的分區分配策略:隨機選取第一個分區節點,然後往後依次增加。例如第一個分區選取爲1,第二個分區就是2,第三個分區就是3.  1,2,3是brokerid。不會負載均衡,所以要手動重新分配分區操作,儘量均衡。

2、在生產的同時進行數據遷移會出現重複數據。所以遷移的時候避免重複生產數據,應該停止遷移主題的生產。同時消費不會,同時消費之後出現短暫的leader報錯,會自動恢復。

3、新增了broker節點,如果有主題的分區在新增加的節點上,生產和消費的客戶端都應該在hosts配置文件中增加新增的broker節點,否則無法生產消費,但是也不報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章