应急预案:专有云V3环境中Kafka磁盘损坏或者新节点扩容后Topic的分区信息不完整的修复方法

1. 概述

在专有云V3环境中,Kafka磁盘损坏或者新节点扩容后,Topic的分区信息不完整,在部分Pod上有数据,部分Pod上没有数据,本文主要介绍如何修复该问题。

1.1. 适用范围

  • 专有云V3,消息队列Kafka
    说明:适用于企业版和敏捷PaaS,且专有云版本为V3.13及之后版本。

1.2. 用户告知

  • 适用平台:x86
  • 授权级别:L2(二线技术支持工程师)、L3(产品研发工程师)
  • 临时或固化方案:固化
  • 操作复杂度:高
  • 预估执行时长:30分钟
  • 业务影响:否
  • 风险等级:高

2. 问题描述

在磁盘损坏或者新节点扩容后,Topic的分区信息不完整,在部分Pod上有数据,部分Pod上没有数据。

3. 解决方案

3.1. 环境检查

在Master节点执行以下命令,确认Kafka相关的Pod都是Running状态。

kubectl get pods |grep alibaba-kafka

系统显示类似如下。

3.2. 实施步骤

获取各个Pod的Broker ID

在alibaba-kafka-cluster三个Pod中,检查meta.properties信息,具体操作如下:

  1. 登录Master节点,执行以下命令,进入alibaba-kafka-cluster中。
    kubectl exec -it alibaba-kafka-cluster-private-paas-default-0 bash
  2. 执行以下命令,避免出现JMX_PORT占用问题。
    export JMX_PORT=""
  3. 执行以下命令,查看meta.properties的值。
    cat /alidata1/kafka/kafka-logs/meta.properties | grep broker 
    说明:可能的结果为1002,1003,1004

查找需要均衡的Topic

对于每个Topic,其Replicas应该均衡分布在获取各个Pod的Broker ID章节中找出的Broker ID中。出现以下2种情况,说明该Topic需要均衡:

查找需要均衡的Topic的操作如下:

  1. 依次执行以下命令,先列出所有Topic。
    sudo su admin
    sh /home/admin/KafkaProxy/bin/kafka-topics.sh --list --bootstrap-server `hostname -i`:9092
  2. 执行以下命令,查看Topic的分区信息。
    sh /home/admin/KafkaProxy/bin/kafka-topics.sh --bootstrap-server `hostname -i`:9092 --describe --topic test1
    系统显示类似如下。

Reassign进行数据均衡

针对已有分区已经超过24,且数据占比较大,则考虑使用kafka-reassign-partitions.sh脚本文件,通过以下参数进行均衡。

  • --generate:生成分区重分配计划
  • --execute:执行分区重分配计划
  • --verify:验证分区重分配结果

选择要处理的Topic

如果在查找需要均衡的Topic章节中找出了很多Topic,建议分批处理,将其按照以下格式保存到JSON文件,比如要处理的Topic为test和test1,保存为topics_to_reassign.json文件。

  1. 执行以下命令,进入指定目录。
    说明:为了持久化各类文件,需要进入到独立盘。
    cd /alidata1/ 
  2. 执行以下命令,将需要处理的Topic保存到JSON文件。
    echo '{"topics":[{"topic":"test"},{"topic":"test2"}],"version":1}' > topics_to_reassign.json

生成分区重分配计划

下面的--broker-list应该替换成获取各个Pod的Broker ID章节查看到的Broker ID,以逗号分隔。

  1. 依次执行以下命令,保存旧分区信息在reassign_before.json文件中。
    sudo su admin
    cd /alidata1/
    sh /home/admin/KafkaProxy/bin/kafka-reassign-partitions.sh --zookeeper `cat /home/admin/kafka-config/server.properties | grep "zookeeper.connect=" | awk -F"=" '{print $2}'`  --topics-to-move-json-file topics_to_reassign.json  --broker-list "1002,1003,1004" --generate |grep version|grep partitions|head -n 1 > reassign_before.json 
  2. 执行以下命令,生成新分区信息在reassign_after.json文件中。
    sh /home/admin/KafkaProxy/bin/kafka-reassign-partitions.sh --zookeeper `cat /home/admin/kafka-config/server.properties | grep "zookeeper.connect=" | awk -F"=" '{print $2}'` --topics-to-move-json-file topics_to_reassign.json --broker-list "1002,1003,1004" --generate |grep version|grep partitions|tail -n 1 > reassign_after.json

执行分区重分配计划

分区重分配计划的操作如下:

  1. 执行以下命令,确认可以看到topics_to_reassign.jsonreassign_before.jsonreassign_after.json三个文件,且内容不为空。
    ls -alt /alidata1|grep .json
    系统显示类似如下。
  2. 执行以下命令,执行分区重分配计划。
    sh /home/admin/KafkaProxy/bin/kafka-reassign-partitions.sh --zookeeper `cat /home/admin/kafka-config/server.properties | grep "zookeeper.connect=" | awk -F"=" '{print $2}'` --reassignment-json-file reassign_after.json --execute
    系统显示类似如下,预期返回Successfully started reassignment of partitions信息,表示执行成功。

3.3. 结果验证

执行以下命令,验证分区重分配结果。

sh /home/admin/KafkaProxy/bin/kafka-reassign-partitions.sh --zookeeper `cat /home/admin/kafka-config/server.properties | grep "zookeeper.connect=" | awk -F"=" '{print $2}'` --reassignment-json-file reassign_after.json --verify

说明:如果数据量大,则需要等待一段时间。

 系统显示类似如下,预期所有分区都返回successfully,表示成功。

4. 回滚方案

无需回滚,操作前的情况已是非正常状态。