0%

Kafka 分区迁移

Kafka集群扩容后将数据量大Topic迁移到新的Kafka节点上


背景

最近因数据量上涨,对Kafka集群进行扩容后,需将Topic量大的迁移到新Kafka节点上,缓解集群压力。

操作

Kafka系统提供了一个分区重新分配工具(kafka-reassign-partitions.sh),该工具可用于在Broker之间迁移分区。

生成待迁移topic的json

新建文件topics-to-move.json,包含要迁移到Topic 列表。

1
2
3
4
5
cat topic-to-move.json
{
"topics": [{"topic": "ke01"},{"topic": "ke02"}],
"version":1
}
generate生成迁移计划

需要指定topics-to-move.json 文件和迁移目标节点的broker id

1
bin/kafka-reassign-partitions.sh --zookeeper $zklist --topics-to-move-json-file topics-to-move.json --broker-list "$brokerlist" --generate > generate.json

查看generate.json文件结果类似如下

1
2
3
4
5
Current partition replica assignment
{"version":1,"partitions":[{"topic":"sdk_counters","partition":1,"replicas":[61,62]},{"topic":"sdk_counters","partition":0,"replicas":[62,61]}]}

Proposed partition reassignment configuration
{"version":1,"partitions":[{"topic":"sdk_counters","partition":1,"replicas":[140,141]},{"topic":"sdk_counters","partition":0,"replicas":[141,140]}]}

将Current partition replica assignment 的内容保存到rollback-cluster-reassignment.json,用于回滚操作。

将Proposed partition reassignment configuration 的内容保存到expand-cluster-reassignment.json,用于执行迁移操作。

1
cat generate.json  |grep -A1 "Proposed partition reassignment configuration" |tail -1 > expand-cluster-reassignment.json
迁移执行generate_prop.json

限制带宽大小为500Mb/s

1
bin/kafka-reassign-partitions.sh --zookeeper $zklist --reassignment-json-file generate_prop.json --execute --throttle 50000000

迁移操作会将指定Topic 的数据文件移动到新的节点目录下,这个过程可能需要等待很长时间,视Topic 的数据量而定。

可以运行以下命令查看执行状态。

1
bin/kafka-reassign-partitions.sh --zookeeper $zklist  --reassignment-json-file generate_prop.json --verify

状态有两种,in progress 表示正在迁移,completed successlly 表示已经成功完成迁移。迁移完成后,原先的节点下将不存在该Topic 的数据文件。

扩展

如果要迁移的Topic 有大量数据(Topic 默认保留1天的数据),可以在迁移之前临时动态地调整retention.ms 来减少数据。


参考链接