故事的开始
- 今天线上 kafka 集群的一个节点突然出现了磁盘报警,我立即排查了数据量比较大的 topic 的保留时间,发现已经设到了最小值,这可怎么办呀,我这只菜鸟就会这一招,现在这么棘手的问题要怎么处理呀?
- 跟研发同事沟通一下,原来是有新业务上量了,研发希望通过扩容节点磁盘来解决问题。行,那我看看怎么扩容…
- 好巧不巧,我发现这个节点的数据目录居然用的是系统盘,扩容的话意味着要重启服务器。拜托,我才刚接手工作,好怕搞出什么事情来,有没有更优雅一点的方式呢?
- 通过查监控,我发现集群的其他几个节点的磁盘空间还空闲很多。感觉是不是 topic 分区分配的有点不均匀?能不能把 topic 的分区副本迁移到其他空闲节点上呢?这样应该也能解决问题吧?
尝试解决
先贴点背景信息
- 集群与涉事 topic:
- 服务版本:0.10.2
- 节点数量:5 台
- broker-0
- broker-1
- broker-2
- broker-3
- broker-4
- topic 名称:message
- 分区个数:3
- 副本个数:2
- 看一下问题机器 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
复制代码
- 查看下 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
复制代码
搜索解决方案
- 通过搜索”kafka 分区副本迁移”这几个关键字,在网上找到了很多相关文章,看样子有戏了。
- 看了几篇文章后总结发现,kafka 可以通过
kafka-reassign-partitions.sh
这个脚本进行手动迁移。 - 但执行脚本迁移前,需要自己准备一个 json 文件,里面要指定迁移的 topic 、分区以及副本的目标 broker-id。
在开始操作前,我很怂的用测试跑了一遍,确保没有问题才敢上线搞?
开始操作
- 先写配置文件,我希望 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
}
复制代码
可以只填需要迁移的分区,未填写的分区不进行迁移操作
- 执行迁移脚本,按照文件开始进行迁移操作。
[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.
复制代码
- 查看迁移情况
[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 分区正在执行迁移操作,其他两个分区因为没有变化已经显示完成了。
验证迁移情况
- 查看 broker-3 节点上面是否生成对应的数据目录。
[root@broker-3 kafka_log]# ll message-1 -d
drwxr-xr-x 2 root root 4096 Jun 2 15:35 message-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 已经显示迁移完成。
- 此时通过脚本查看 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
复制代码
- 再来查看 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
复制代码
总结教训
- 以后部署新服务时,服务器一定要挂数据盘,避免扩容难题。
- 服务正常时,应该多想想会出现哪些问题,提前进行演练,避免临时抱佛脚,自己吓自己。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END