一个菜鸟迁移 kafka topic 分区副本的故事

故事的开始

  1. 今天线上 kafka 集群的一个节点突然出现了磁盘报警,我立即排查了数据量比较大的 topic 的保留时间,发现已经设到了最小值,这可怎么办呀,我这只菜鸟就会这一招,现在这么棘手的问题要怎么处理呀?
  2. 跟研发同事沟通一下,原来是有新业务上量了,研发希望通过扩容节点磁盘来解决问题。行,那我看看怎么扩容…
  3. 好巧不巧,我发现这个节点的数据目录居然用的是系统盘,扩容的话意味着要重启服务器。拜托,我才刚接手工作,好怕搞出什么事情来,有没有更优雅一点的方式呢?
  4. 通过查监控,我发现集群的其他几个节点的磁盘空间还空闲很多。感觉是不是 topic 分区分配的有点不均匀?能不能把 topic 的分区副本迁移到其他空闲节点上呢?这样应该也能解决问题吧?

尝试解决

先贴点背景信息

  1. 集群与涉事 topic:
  • 服务版本:0.10.2
  • 节点数量:5 台
    • broker-0
    • broker-1
    • broker-2
    • broker-3
    • broker-4
  • topic 名称:message
  • 分区个数:3
  • 副本个数:2
  1. 看一下问题机器 broker-1 当时的存储情况, 已经快要接近100%:
[root@broker-1 bin]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1       197G  181G  7.9G  96% /
devtmpfs        7.8G     0  7.8G   0% /dev
tmpfs           7.8G   24K  7.8G   1% /dev/shm
tmpfs           7.8G  520K  7.8G   1% /run
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
tmpfs           1.6G     0  1.6G   0% /run/user/10001
复制代码
  1. 查看下 topic 的详细情况, 发现 broker-3 节点没有被分配此 topic 的分区副本,而 broker-1 有两个分区副本:
Topic:message	PartitionCount:3	ReplicationFactor:2	Configs:retention.ms=172800000,max.message.bytes=5242880
	Topic: message	Partition: 0	Leader: 4	Replicas: 4,0	Isr: 4,0
	Topic: message	Partition: 1	Leader: 0	Replicas: 0,1	Isr: 0,1
	Topic: message	Partition: 2	Leader: 1	Replicas: 1,2	Isr: 1,2
复制代码

搜索解决方案

  1. 通过搜索”kafka 分区副本迁移”这几个关键字,在网上找到了很多相关文章,看样子有戏了。
  2. 看了几篇文章后总结发现,kafka 可以通过 kafka-reassign-partitions.sh 这个脚本进行手动迁移。
  3. 但执行脚本迁移前,需要自己准备一个 json 文件,里面要指定迁移的 topic 、分区以及副本的目标 broker-id。

在开始操作前,我很怂的用测试跑了一遍,确保没有问题才敢上线搞?

开始操作

  1. 先写配置文件,我希望 partition-1 分区副本从 0,1 两节点,迁移到 0,3 去,所以其他两个分区的配置保持不变即可。
$ vim partitions-topic.json

{
        "partitions":
                [
                {
                        "topic": "message",
                        "partition": 0,
                        "replicas": [4,0]
                },
                {
                        "topic": "message",
                        "partition": 1,
                        "replicas": [0,3]
                },
                {
                        "topic": "message",
                        "partition": 2,
                        "replicas": [1,2]
                }
                ],
        "version":1
}
复制代码

可以只填需要迁移的分区,未填写的分区不进行迁移操作

  1. 执行迁移脚本,按照文件开始进行迁移操作。
[root@broker-1 bin]# ./kafka-reassign-partitions.sh --zookeeper 127.0.0.1:2181 --reassignment-json-file partitions-topic.json --execute
Current partition replica assignment

{"version":1,"partitions":[{"topic":"message","partition":0,"replicas":[4,0]},{"topic":"message","partition":2,"replicas":[1,2]},{"topic":"message","partition":1,"replicas":[0,1]}]}

Save this to use as the --reassignment-json-file option during rollback
Successfully started reassignment of partitions.	
复制代码
  1. 查看迁移情况
[root@broker-1 bin]# ./kafka-reassign-partitions.sh --zookeeper 127.0.0.1:2181 --reassignment-json-file partitions-topic.json --verify
Status of partition reassignment:
Reassignment of partition [message,0] completed successfully
Reassignment of partition [message,1] is still in progress
Reassignment of partition [message,2] completed successfully
复制代码

通过输出可以看出,只有 partition-1 分区正在执行迁移操作,其他两个分区因为没有变化已经显示完成了。

验证迁移情况

  1. 查看 broker-3 节点上面是否生成对应的数据目录。
[root@broker-3 kafka_log]# ll message-1 -d
drwxr-xr-x 2 root root 4096 Jun  2 15:35 message-1
复制代码

确实已经创建了, 并且在不断的生成数据。

  1. 等待了一段时间,再来查看下迁移情况。
[root@broker-1 bin]# ./kafka-reassign-partitions.sh --zookeeper 127.0.0.1:2181 --reassignment-json-file partitions-topic.json --verify
Status of partition reassignment:
Reassignment of partition [message,0] completed successfully
Reassignment of partition [message,1] completed successfully
Reassignment of partition [message,2] completed successfully
复制代码

partition-1 已经显示迁移完成。

  1. 此时通过脚本查看 topic 详情可以发现,partition-1 分区的副本已经迁移到0,3两个节点。
[root@broker-1 bin]# ./kafka-topics.sh --zookeeper 127.0.0.1:2181 --describe --topic message
Topic:message	PartitionCount:3	ReplicationFactor:2	Configs:retention.ms=172800000,max.message.bytes=5242880
	Topic: message	Partition: 0	Leader: 4	Replicas: 4,0	Isr: 4,0
	Topic: message	Partition: 1	Leader: 0	Replicas: 0,3	Isr: 0,3
	Topic: message	Partition: 2	Leader: 1	Replicas: 1,2	Isr: 1,2
复制代码
  1. 再来查看 broker-1 节点的磁盘情况, 确实已经腾出了空间,问题解决!(长舒一口气?)
[root@broker-1 bin]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1       197G  136G   54G  72% /
devtmpfs        7.8G     0  7.8G   0% /dev
tmpfs           7.8G   24K  7.8G   1% /dev/shm
tmpfs           7.8G  520K  7.8G   1% /run
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
tmpfs           1.6G     0  1.6G   0% /run/user/10001
复制代码

总结教训

  1. 以后部署新服务时,服务器一定要挂数据盘,避免扩容难题。
  2. 服务正常时,应该多想想会出现哪些问题,提前进行演练,避免临时抱佛脚,自己吓自己。
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享