随着业务的发展, 服务器所在网段/机群不允许kafka继续保留在那, 需要移动到先机器上.
哎呀上面是废话,总的说就是: 2台老kafka不要了,数据要迁移到新的2台kafka上面.要求数据不丢失
通过查询官网,并无直接切换的命令,当前版本是kafka 0.8.1, 说是0.8.2才提供老机器的退役功能.
不过没关系, 我们有一个变通的方法:
kafka提供了修改复制因子的方法, 我们可以将她的复制目标机器改成新的节点. 这样所有发往老节点的数据都会被转移到新节点去.
等你将发送者的API修改后,让他目标指向新机器, 迁移工作就全部完成.
具体步骤如下:
1.在新节点上搭建kafka服务
原先我有2台机器, broker.id分别为1和2
现在我新机器上broker.id分别设置为3和4
2.启动所有kafka 服务
3.确认要移动的topics
kafka-topics.sh --list --zookeeper 192.168.103.47:2181 查看所有主题
复制这些topic,并写成如下格式的文件, 命名为 topics-to-move.json
{"topics": [
{"topic": "fortest1"},
{"topic": "fortest2"},
{"topic": "fortest3"}
],
"version":1
}
4.生成移动脚本
运行bin/kafka-reassign-partitions.sh --zookeeper 192.168.103.47:2181 --topics-to-move-json-file topics-to-move.json --broker-list "3,4" --generate
其中3,4是你的新节点的broker.id
这样就会生成一串新的json数据
{"version":1,"partitions":[{"topic":"fortest1","partition":0,"replicas":[3,4]},其他部分省略}
将这一串json写入新文件reassignment-node.json中
5.这时候,万事俱备, 开始迁移
bin/kafka-reassign-partitions.sh --zookeeper 192.168.103.47:2181 --reassignment-json-file reassignment-node.json --execute
6.适当时候, 运行如下命令,查看运行结果
bin/kafka-reassign-partitions.sh --zookeeper 192.168.103.47:2181 --reassignment-json-file reassignment-node.json --verify
假设出现
ERROR: Assigned replicas (3,4,0,1) don't match the list of replicas for reassignment (3,4) for partition [mpt-session,1]
这样的错误, 他并不是真的出错,而是指目前仍在复制数据中.
再过一段时间再运行verify命令,他就会消失(加入完成拷贝)
7.数据完成迁移后, 老的服务先别停.
8.修改所有客户端producer或者consumer连接指向新节点.
9.测试正常后, 关闭老节点
10.大功告成