写在前面
假如有一天,你单位业务不断增长发财了。有天老板说我们需要增加kafka集群节点,这是怎莫办?那就新增加一台机器呗!很简单我们只需要从已经部署好的Kafka节点中复制相应的配置文件,然后把里面的broker id修改成全局唯一的,最后启动这个节点即可将它加入到现有Kafka集群中。
那问题也就来了,我们发现新的节点并不能负载之前的旧数据,只能对新增加的Topic进行负载,不能对旧数据进行负载很是浪费资源。
这里介绍个kafka对分区重新分配的神器脚本:
kafka-reassign-partitions.sh
一. 分区重新分配
1.1 指定需要分区的Topic
- 这里配制成json文件形式
cat topic-partition.json
{
"topics": [
{
"topic":"your topic's name"
}
],
"version":1
}
1.2 生成执行计划
- 执行脚本
kafka-reassign-partitions.sh --zookeeper 你的zookeeperIP:PORT --topics-to-move-json-file topic-partition.json --broker-list "0,1" --generate - 参数说明
--broker-list "0,1"0,1代表kafka节点的broker.id 包含新旧节点啊 - 保存结果
cat result.json
内容(示例)
{
"version": 1,
"partitions": [{
"topic": "your topic's name",
"partition": 4,
"replicas": [0],
"log_dirs": ["any"]
}, {
"topic": "your topic's name",
"partition": 1,
"replicas": [1],
"log_dirs": ["any"]
}, {
"topic": "your topic's name",
"partition": 2,
"replicas": [0],
"log_dirs": ["any"]
}, {
"topic": "your topic's name",
"partition": 3,
"replicas": [1],
"log_dirs": ["any"]
}, {
"topic": "your topic's name",
"partition": 0,
"replicas": [0],
"log_dirs": ["any"]
}]
}
1.3 执行执行计划
-
执行脚本
kafka-reassign-partitions.sh --zookeeper 你的zookeeperIP:PORT --reassignment-json-file result.json --execute
1.4 验证
-
执行脚本
kafka-reassign-partitions.sh --zookeeper 你的zookeeperIP:PORT --reassignment-json-file result.json --verify - 结果示例
Status of partition reassignment:
Reassignment of partition topic-1 completed successfully
Reassignment of partition topic-4 completed successfully
Reassignment of partition topic-2 completed successfully
Reassignment of partition topic-3 completed successfully
Reassignment of partition topic-0 completed successfully
1.5 简化操作
我们可以仿照1.2结果示例自己编辑一份执行计划,然后按照1.3操作就行,前提是你要熟悉分区,并分配均匀。