原来有一个5台的kafka集群,现在需要用一台新的服务器替换原先的一台broker,所以需要将这个broker上所有partition的数据都迁移过去。
我的kafka是0.8.2.1的版本,其本身提供了一个kafka-reassign-partitions.sh工具帮助完成这个工作。
首先,需要在新的机器上启动kafka进程。然后,需要到老的broker上查看其本身包含哪些topic的partition数据。当然,你可以写个程序到zookeeper上遍历所有topic的partition分布情况,然后找出需要下线机器相关的信息。我比较懒,手动登录到老broker上,进入kafka-logs目录,就会看到很多类似与
topic1-0
topic2-1
topic2-4
这样的子目录。topic1,topic2是topic名称,-后面的就是partition编号。
知道了老broker上有哪些数据就可以编写迁移文件了。
reassignment.json
{
"version": 1,
"partitions": [
{
"topic": "topic1",
"partition": 0,
"replicas": [
6
]
},
{
"topic": "topic2",
"partition": 1,
"replicas": [
6
]
},
{
"topic": "topic2",
"partition": 4,
"replicas": [
6
]
}
]
}
文件里分别写上老机器上包含的topic和对应的partition,replicas就是新机器的地址。
随后,在老机器上运行
bin/kafka-reassign-partitions.sh --zookeeper localhost:2181/kafka --reassignment-json-file reassignment.json --execute
你就会看到,老机器上kafka-logs下的子目录一个一个消失了。消失的目录就是已经迁移完成的topic-partition
最后,可以通过
./kafka-reassign-partitions.sh --zookeeper localhost:2181/vehicle_kafka --reassignment-json-file reassignment.json --verify
查看reassign的进度,是否全部完成了。等数据全部迁走了,就可以下线老broker机器了。