kafka集群維護
一、kafka集群啟停
#啟動kafka
/home/cluster/kafka211/bin/kafka-server-start.sh -daemon /home/cluster/kafka211/config/server.properties
#關閉kafka
/home/cluster/kafka211/bin/kafka-server-stop.sh
二、kafka集群基本信息實時查看和修改
#列出所有有效主題
/home/cluster/kafka211/bin/kafka-topics.sh --list --zookeeper 134.32.123.101:2181,134.32.123.102:2181,134.32.123.103:2181
#查看特定主題
/home/cluster/kafka211/bin/kafka-topics.sh --describe --zookeeper 134.32.123.101:2181,134.32.123.102:2181,134.32.123.103:2181 --topic REC-CBBO-MSG-TOPIC
#創建主題 盡量不要使用下划線"_"或者點好".",可以使用橫線"-"
/home/cluster/kafka211/bin/kafka-topics.sh --create --zookeeper 134.32.123.101:2181,134.32.123.102:2181,134.32.123.103:2181 --replication-factor 3 --partitions 17 --topic REC-CBBO-MSG-TOPIC
#修改主題 如果主題創建了之后發現分區不夠用,可以增加,不可以減少
/home/cluster/kafka211/bin/kafka-topics.sh --zookeeper 134.32.123.101:2181,134.32.123.102:2181,134.32.123.103:2181 --alter --topic REC-CBBO-MSG-TOPIC --partitions 50
#刪除主題 delete.topic.enable要設置為true
/home/cluster/kafka211/bin/kafka-topics.sh --delete --zookeeper 134.32.123.101:2181,134.32.123.102:2181,134.32.123.103:2181 --topic REC-CBBO-MSG-TOPIC
#控制台當作生產者
kafka-console-producer.sh --broker-list node1:9092,node2:90092,node3:9092 --topic t0425
#控制台當作消費者
./kafka-console-consumer.sh --zookeeper node3:2181,node4:2181,node5:2181 --topic t0422
#查看producer生產消息的最大位置
./kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list node1:9092 --topic t0426 --time -1
-1表示查詢某個主題各個分區當前最大的消息位移值(注意,這里的位移值不是consumer端的位移,而是指消息在每個分區的位置)
如果要查詢曾經生產過的最大消息數,那么只運行上面這條命令然后把各個分區的結果相加就可以了
#如果查詢集群中某個topic當前消息數,還需要運行下面命令:
/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list node1:9092 --topic t0426 --time -2
-2表示去獲取當前各個分區的最小位移。之后把運行第一條命令的結果與剛剛獲取的位移之和相減就是集群中該topic的當前消息總數
三、kafka集群leader平衡機制
問題:當一個broker停止或者crashes時,所有本來將它作為leader的分區將會把leader轉移到其他broker上去,極端情況下,會導致同一個leader管理多個分區,導致負載不均衡,同時當這個broker重啟時,如果這個broker不再是任何分區的leader,kafka的client也不會從這個broker來讀取消息,從而導致資源的浪費。
解決思路:
kafka中有一個被稱為優先副本(preferred replicas)的概念。如果一個分區有3個副本,且這3個副本的優先級別分別為0,1,2,根據優先副本的概念,0會作為leader 。當0節點的broker掛掉時,會啟動1這個節點broker當做leader。當0節點的broker再次啟動后,會自動恢復為此partition的leader。不會導致負載不均衡和資源浪費,這就是leader的均衡機制。
#leader手動平衡
/home/cluster/kafka211/bin/kafka-preferred-replica-election.sh --zookeeper 134.32.123.101:2181,134.32.123.102:2181,134.32.123.103:2181
#leader自動平衡 server.properties 參數配置
auto.leader.rebalance.enable=true
注意:kafka創建主題時指定副本數R和分區數P,那么總副本數為 R*P,這些副本均勻的分布到各個broker機器上;
其中對於每個分區都有R個副本,其中有一個leader,其他都是follow
四、kafka集群分區日志遷移
1、遷移topic數據到其他broker
1.1寫json文件 格式
cat topics-to-move.json
{
"topics":[{"topic","foo1"},{"topic","foo2"}],
"version":1
}
1.2使用generate生成遷移計划 只是生成遷移計划 並未遷移
bin/kafka-reassign-partitions.sh --zookeeper 134.32.123.101:2181,134.32.123.102:2181,134.32.123.103:2181 --topics-to-move-json-file topics-to-move.json --broker-list "5,6" --generate
Current partition replica assignment 指當前配置 要保存 用來回滾
Proposed partition reassignment configuration 指生成的遷移計划 保存到expand-cluster-reassignment.json
1.3使用-execute執行計划 執行前最好保存當前的分配情況 以防出錯回滾
將上一步生成的執行計划json數據保存到expand-cluster-reassignment.json
bin/kafka-reassign-partitions.sh --zookeeper 134.32.123.101:2181,134.32.123.102:2181,134.32.123.103:2181 --reassignment-json-file expand-cluster-reassignment.json --execute
1.4使用-verify驗證是否已經遷移完成
bin/kafka-reassign-partitions.sh --zookeeper 134.32.123.101:2181,134.32.123.102:2181,134.32.123.103:2181 --reassignment-json-file expand-cluster-reassignment.json -verify
2、遷移某個topic的某些特定的partition的數據到其他broker 步驟與上面一樣 但是json文件如下
cat custom-reassignment.json
{
"version":1,"partitions":[{"topic":"foo1","partition":0,"replicas":[5,6]},{"topic":"foo2","partition":1,"replicas":[2,3]}]
}
可以指定到topic的分區編碼
注意:遷移會導致leader失衡 需要使用平衡命令 重新平衡
五、集群操作日志清理
5.1 了解linux查看空間的命令
#查看目錄空間的分配和使用情況 df -h
[cluster@PCS103 ~]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel-root 100G 4.7G 96G 5% / devtmpfs 95G 0 95G 0% /dev tmpfs 95G 0 95G 0% /dev/shm tmpfs 95G 722M 94G 1% /run tmpfs 95G 0 95G 0% /sys/fs/cgroup /dev/sda2 1016M 148M 868M 15% /boot /dev/sda1 200M 9.5M 191M 5% /boot/efi /dev/mapper/vgdata-data02 1.0T 7.5G 1017G 1% /data2 /dev/mapper/vgdata-data01 1.0T 12G 1013G 2% /data1 /dev/mapper/rhel-home 100G 100G 20K 100% /home /dev/loop0 3.6G 3.6G 0 100% /mnt/cdrom
可以看到/home 幾乎已經滿了
#查看當前目錄所占空間大小 du -sh
[cluster@PCS101 ~]$ du -sh 3.7G .
#查看當前目錄下每個文件以及目錄所占空間大小 du -h
[cluster@PCS101 ~]$ du -h 472K ./zookeeper/src/recipes . . . 20M ./zookeeper/src 4.0K ./zookeeper/data 0 ./zookeeper/logs 61M ./zookeeper 61M .
5.2 kafka操作日志 清理
kafka/logs目錄下會有操作日志 如controller.log server.log state-change.log 等 非常多 ,根據kafka/config/log4j.properties可以看到 每天都會生成,而且有幾個的日志級別是
trace,這樣會造成空間迅速被占滿,需要定期清理
需要做的是:
(1)修改日志級別 trace改成info
(2)寫個腳本 定期清理 kafka/logs下日志 rm -rf kafka/logs/*