一. 簡述:
? ? ?當業務增加時,服務瓶頸,我們需要進行擴容。當業務量下降時,為成本考慮。自然也會涉及到縮容。假設集群有 15 臺機器,預計縮到 10 臺機器,那么需要做 5 次縮容操作,每次將一個節點下線,那么現在問題就是如何正確、安全地從 Kafka 集群中移除一臺 broker?搞定這個之后,重復 5 次即可(也可以根據實際情況,一次多臺)。
? ? ?一個 broker 下線,它上面的所有 partition 都會處于副本不足的狀態,并且 Kafka 集群不會在其它的 broker 上生成這些副本,因此,在將一個 broker 從集群中移除之前,需要將這個 broker 上的 partition 副本都轉移到最終會保留的 10 臺機器上,怎么實現這個呢?Kafka 自帶的分區重分配工具。
? ? 在集群數據量較大的情況下,分區的轉移可能會花費較長時間,那么在轉移過程中最好不要創建新 topic,不然新的 topic 有可能又創建到要被移除的 broker 上,當然如果實在無法避免的話,可以再對新的 topic 進行一次額外的轉移。
二. 縮容步驟:
? ? 需要先獲取所有 broker 的 broker id,選擇待移除的 broker。?使用 kafka-reassign-partitions 腳本將待移除 broker 上的 partition 均勻地轉移到最終會留在集群的 broker 上。確認待移除 broker 上沒有任何 partition 之后,在 對這個 broker 進行停止和刪除。其中重點是 partition 的轉移或者說重分配。
? 1. 獲取brokerID :
? ? ?可以通過管理工具,或者命令行,配置文件,都可以。 命令行的話:
./kafka-broker-api-versions.sh --bootstrap-server localhost:9092
? 工具的話,cmak :?
? ?可以看到 broker list,broker id 分別為 141,142,145,146 ....?
?2. ?確定topic 數據量大小。
? ? ? 在重分區過程中,很耗節點資源的(cpu,內存,IO),所以如果數據量大,需要按批次進行多次操作。如果沒有監控指標的話, 可以通過配置文件中,log.dir查看具體數據路徑。通過指令(du -sh )判斷topic的數據存儲大小。
3. ?重分區 (和擴容方式一樣,也可以參考: kafka-集群擴容-CSDN博客?):?
?將涉及到的topic,以json方式,寫入臨時文件:
{"version": 1,"topics": [{"topic": "topic1"},{"topic": "topic2"},...]
}
獲取當前 partition 分配方案
使用 kafka-reassign-partitions 腳本的 --generate 來獲取當前的 partition 分配方案。?
# bin/kafka-reassign-partitions.sh --bootstrap-server logkafka-1:9092 --topics-to-move-json-file topics-to-move.json --broker-list "141,142,143。。。" --generate
將新的分配規則保存在json文件(例如,保存在 reassignment.json這個文件下)然后,用--execute選項來執行它:
bin/kafka-reassign-partitions.sh --bootstrap-server logkafka-1:9092 --reassignment-json-file reassignment.json --execute
可通過--verify 參數查看進度。?
4. ?觀察沒問題后,直接下線空數據節點即可。
??----------------------------------------------------------------------------------------------
深耕運維行業多年,擅長linux、容器云原生、運維自動化等方面。
承接各類運維環境部署、方案設計/實施、服務代運維工作,歡迎溝通交流!
(V: xiaoxiangbj2013 ) !