FusionInsight Kafka节点退服后未完全同步分区迁移方案
一、收集Kafka实例和分区信息
1. 执行kafka-broker-info.sh --zookeeper zk业务IP:24002/kafka 命令获取Kafka实例信息
2. 执行kafka-topics.sh --describe --zookeeper zk业务IP:24002/kafka --unavailable-partitions 命令获取Kafka未同步分区
3. 对比Replicas和ISR列表中的信息,确定哪些节点的分区未同步,确定未同步的节点正常与否。
例如,如下案例中,对比Replicas和ISR列表中的信息发现3节点没有同步,而正常的kafka实例中没有3。
二、准备迁移方案
根据步骤一中的未完全同步的分区即需要迁移的分区,把需要迁移的所有分区写入一个新的json文件,文件中replicas中的信息需要根据步骤一中第2步查询结果中的Replicas把退服节点的brokerid改为正常节点的brokerid(即步骤一中第1步查询到的brokerid),其他不变,格式如下所示:
{"version":1,
"partitions":[
{"topic":"test1","partition":0"replicas":[1,2]},
{"topic":"test1","partition":1"replicas":[1,2]},
{"topic":"test1","partition":5,"replicas":[2,1]},
{"topic":"test1","partition":3,"replicas":[2,1]}]}
如果涉及的分区比较多,也可按如下方式生成迁移的json文件。
1. 根据步骤一中未完全同步的分区中的topic信息编写迁移topic的json文件,例如json文件名为generate.json,格式如下:
{"topics":[{"topic": "test1"},{"topic": "test2"}], "version":1}
2. 执行命令kafka-reassign-partitions.sh --zookeeper zk业务IP:24002/kafka --topics-to-move-json-file generate.json文件路径 --broker-list 1,2 --generate 生成迁移方案,其中,broker-list中对应参数是所有正常的broker实例的id,即步骤一中1获取的所有brokerid,不同brokerid间用逗号隔开。
3. 把上一步得到的“Proposed partition reassignment configuration”的json文件写入迁移的json文件中,例如move.json,此json文件中只保留需要迁移的topic和partition的信息。如下图所示,红色方框内即迁移的json文件信息。
三、执行迁移
执行kafka-reassign-partitions.sh --zookeeper zk业务IP:24002/kafka --reassignment-json-file move.json文件路径 --execute 执行迁移
四、查看迁移进度
执行kafka-reassign-partitions.sh --zookeeper zk业务IP:24002/kafka --reassignment-json-file move.json文件路径 --verify 查看迁移进度,当所有partition都提示completed successfully时说明迁移完成。
五、查看是否所有分区都同步
执行kafka-topics.sh --describe --zookeeper zk业务IP:24002/kafka --unavailable-partitions 命令获取Kafka未同步分区,如果结果为空,说明所有分区都同步,操作完成;如果有leader为-1,按步骤六执行。
六、 Leader为-1的解决办法
1. Kafka配置中查看unclean.leader.election.enable配置,如果配置为true,只执行下面步骤2即可;如果配置为false,执行下面步骤3、4、5。
2. 切controller:进zookeeper客户端,执行 zkCli.sh -server zk业务IP:24002/kafka进入zk,执行deleteall /controller 切controller。
3. Kafka客户端修改参数配置:kafka-topics.sh --alter --topic topicName --zookeeper zk业务IP:24002/kafka --config unclean.leader.election.enable=true,其中,topicName是leader为-1的topic。
4. 按步骤2切controller。
5. 查看leader为-1的分区leader是否正常,正常后在kafka客户端执行kafka-topics.sh --alter --topic topicName --zookeeper 100.112.22.233:24002/kafka --delete-config unclean.leader.election.enable。
- 点赞
- 收藏
- 关注作者
评论(0)