Kafka存储扩容以及分区重分配

一、背景

最近生产环境Kafka数据暴增,导致原来磁盘存储不够用,现需对生产环境Kafka存储目录进行扩容。

二、执行方案

1、存储目录扩容

先进行挂载磁盘操作,将挂载的磁盘数据目录配置到Kafka配置文件中。 假设现在加了500G的磁盘用于给Kafka数据目录存储扩容,磁盘已经挂载到了/data 目录。

  1. 首先在 /data 目录下建立新的Kafka数据存储目录
mkdir -p /data/kafka/kafka-logs
  1. 修改Kafka配置文件
vi config/server.properties
log.dirs=/opt/kakfa/kafka-logs,/data/kafka/kafka-logs

配置文件定位到log.dirs配置项,增加新数据目录,并以逗号分隔;

  1. 重启Kafka节点服务: 注意: 使用bin/kafka-server-stop.sh 停止命令,不要直接杀进程,否则内存区的数据未写到磁盘,可能导致数据丢失。
  2. 重启以后已建立且在使用的topic分区还是分布在旧存储目录上,不会重新负载到新的存储目录,只有新建的topic才会使用新的存储目录进行存储,因此需进行旧分区的重新分配。
  3. 生成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

去查看新存储目录,分区已被分配到新存储目录下。

经验分享 程序员 微信小程序 职场和发展