Kafka存储扩容以及分区重分配
一、背景
最近生产环境Kafka数据暴增,导致原来磁盘存储不够用,现需对生产环境Kafka存储目录进行扩容。
二、执行方案
1、存储目录扩容
先进行挂载磁盘操作,将挂载的磁盘数据目录配置到Kafka配置文件中。 假设现在加了500G的磁盘用于给Kafka数据目录存储扩容,磁盘已经挂载到了/data 目录。
- 首先在 /data 目录下建立新的Kafka数据存储目录
mkdir -p /data/kafka/kafka-logs
- 修改Kafka配置文件
vi config/server.properties
log.dirs=/opt/kakfa/kafka-logs,/data/kafka/kafka-logs
配置文件定位到log.dirs配置项,增加新数据目录,并以逗号分隔;
- 重启Kafka节点服务: 注意: 使用bin/kafka-server-stop.sh 停止命令,不要直接杀进程,否则内存区的数据未写到磁盘,可能导致数据丢失。
- 重启以后已建立且在使用的topic分区还是分布在旧存储目录上,不会重新负载到新的存储目录,只有新建的topic才会使用新的存储目录进行存储,因此需进行旧分区的重新分配。
- 生成Kafka分区重分配方案: 要想使旧的topic分区也能均匀分布到新加的数据目录,可使用分区重分配。
2、生产Kafka分区重分配方案
1)、使用如下命令生成分区重分配方案:
kafka-reassign-partitions --zookeeper localhost:2181 --generate --topics-to-move-json-file topic-reassign.json --broker-list 0
其中topic-reassign.json文件可指定生成重分配方案的topic :
{ "version":1,"topics":[{ "topic":"test"}]}
2)、执行以后kafka-reassign-partitions帮我们生成了当前的分区副本的分布方案,以及建议的分区副本的分布方案:
如图上(本地环境执行的,只有一个分区一个副本,因此重分配前后是一样的,生产环境执行以后会根据负载等情况生成新的重分配方案)。
3)、当前分区副本的分布方案:
Current partition replica assignment { "version":1,"partitions":[{ "topic":"test","partition":0,"replicas":[0],"log_dirs":["any"]}]}
4)、建议的分区副本的分布方案:
Proposed partition reassignment configuration { "version":1,"partitions":[{ "topic":"test","partition":0,"replicas":[0],"log_dirs":["any"]}]}
5)、记得将Current partition replica assignment的备份保存,用于后期回滚操作。
6)、我们将Proposed partition reassignment configuration保存到另外一个json文件中(比如reassign-partitions.json),这个就是系统建议的一个可行性分区重分配方案。注意,这里并没有真正执行重分配的动作。
3、执行Kafka分区重分配:
1)使用reassign-partitions.json重分配方案,正式执行分区重分配:
kafka-reassign-partitions --zookeeper localhost:2181 --reassignment-json-file reassign-partitions.json --execute
2)检查重分配操作的进度:
kafka-reassign-partitions --zookeeper localhost:2181 --reassignment-json-file reassign-partitions.json --verify
3)此时可查看topic的partition分布情况,看重新分配以后的分区分布
kafka-topics --zookeeper localhost:2181 --topic test --describe
去查看新存储目录,分区已被分配到新存储目录下。