应急预案:专有云V3环境中Kafka磁盘满导致消息写入失败的处理方法

1. 概述

本文主要介绍在专有云V3环境中,Kafka磁盘满导致消息写入失败的处理方法。

1.1. 适用范围

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

1.2. 用户告知

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

2. 问题描述

在专有云V3环境中,Kafka消息保留时间过长,导致Pod节点磁盘水位高,进而导致消息写入失败。

3. 解决方案

3.1. 环境检查

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

kubectl get pods |grep alibaba-kafka

系统显示类似如下。

3.2. 实施步骤

查看每个Topic分区的消息存储量

在alibaba-kafka-cluster三个Pod中,查看每个Topic分区的消息存储量,具体操作如下:

  1. 登录Master节点,执行以下命令,找到Kafka的Pod。
    kubectl get pod|grep kafka
  2. 执行以下命令,进入alibaba-kafka-cluster中。
    kubectl exec -it alibaba-kafka-cluster-private-paas-default-0 bash 
  3. 执行以下命令,进入指定目录。
    cd /alidata1/kafka/kafka-logs
  4. 执行以下命令,查看每个Topic分区的消息存储量。查看哪些Topic占用存储空间比较大,然后缩短这些Topic的消息保留时间。
    du -sh *
    系统显示类似如下。
    说明:目录名为[$TopicName]-[$Partition_Number]的格式,[$Topic_Name]为Topic名称,[$Partition_Number]为分区编号。

修改Topic的消息保留时间

该操作也可以直接在消息队列Kafka版控制台的Topic管理页面,单击目标Topic右侧的Topic配置,进行修改。如果没有控制台,可以按照以下方式手动操作:

查看Topic的保留时间

主要查看Topic的配置,比如保留时间等,操作如下:

  1. 执行以下命令,切换到admin用户。
    sudo su admin
  2. 执行以下命令,查看ZooKeeper的连接路径。
    cat /home/admin/kafka-config/server.properties | grep "zookeeper.connect=" | awk -F"=" '{print $2}'  
  3. 执行以下命令,查看Topic的配置。
    sh /home/admin/KafkaProxy/bin/kafka-configs.sh --zookeeper [$ZK_Path] --describe --entity-name [$Topic_Name] --entity-type topics
    说明:[$ZK_Path]为ZooKeeper的连接路径。
    示例命令如下。
    sh /home/admin/KafkaProxy/bin/kafka-configs.sh --zookeeper 10.X.X.152:2188,10.X.X.151:2188,10.X.X.150:2188/kafka-private-clusters/cluster-private-paas-default --describe --entity-name test --entity-type topics
修改Topic配置

比如修改消息保留时间,如果创建Topic时未指定则为默认7天。

  1. 执行以下命令,查看ZooKeeper的连接路径。
    cat /home/admin/kafka-config/server.properties | grep "zookeeper.connect="
  2. 执行以下命令,修改Topic配置。
    sh /home/admin/KafkaProxy/bin/kafka-configs.sh -zookeeper [$ZK_Path] --alter --add-config retention.ms=[$Retention] --entity-name [$Topic_Name] --entity-type topics
    说明:[$Retention]新设置的保留时间,单位为ms,1天为86400000ms。
    示例命令如下。
    sh /home/admin/KafkaProxy/bin/kafka-configs.sh -zookeeper 10.X.X.152:2188,10.X.X.151:2188,10.X.X.150:2188/kafka-private-clusters/cluster-private-paas-default --alter --add-config retention.ms=86400000 --entity-name test --entity-type topics
    系统显示类似如下。
    Completed Updating config for entity: topic 'test'.

3.3. 结果验证

请参见查看每个Topic分区的消息存储量,确认消息保留时间的修改已生效。

4. 回滚方案

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