10.7.8 容量预警与健康检查规范

容量预警与健康检查规范#

原理草图:容量预警与健康检查链路#

文章图片

容量预警指标与阈值设计#

  • Broker磁盘使用率:建议预警阈值70%(告警)、85%(严重),避免Log Segment滚动与清理压力导致写入抖动。
  • 分区数量与文件句柄:按Broker分区数与FD使用率设定阈值(如FD使用>70%预警、>85%告警)。
  • 副本同步延迟:UnderReplicatedPartitions与ISR变化率作为容量侧压力信号,持续>0触发预警。
  • 主题增长速率:以消息入流量(MB/s)与分区增长速度计算天/周增长,结合磁盘剩余可用天数告警。
  • 控制器负载:Controller事件队列堆积、Leader迁移频率突增提示容量或分区不均衡。
  • 磁盘I/O与网络带宽:磁盘写延迟与网卡出入流量达到峰值80%触发容量评估。

容量预警计算与策略(含示例)#

  • 容量预测公式:可用天数 = 可用磁盘容量 /(日均入流量 × 副本数)。
  • 弹性阈值:结合业务周期波动,设置动态阈值(P95峰值×1.2)作为上限告警线。
  • 主题级别预警:对高价值Topic设置独立阈值与更短预测周期(24h、7d)。
  • 自愈与扩容触发:预警达到严重级别时,自动触发扩容工单或分区迁移计划。

示例:用脚本计算剩余可用天数(需安装 awk/df)

#!/usr/bin/env bash
# /opt/kafka/bin/capacity_calc.sh
# 说明:基于磁盘剩余容量与日均入流量估算可用天数
DISK_AVAIL_GB=$(df -BG /data/kafka | awk 'NR==2{gsub("G","",$4);print $4}')
DAILY_INGRESS_GB=500   # 业务统计:日均入流量
REPLICA=3              # 副本数
DAYS=$(( DISK_AVAIL_GB / (DAILY_INGRESS_GB * REPLICA) ))
echo "可用天数: $DAYS 天"
# 预期:输出可用天数,供告警规则使用

安装与监控采集示例(JMX Exporter)#

安装 JMX Exporter 并暴露 Kafka Broker 指标:

# 1) 下载 exporter
mkdir -p /opt/jmx_exporter
cd /opt/jmx_exporter
wget -O jmx_prometheus_javaagent.jar https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.20.0/jmx_prometheus_javaagent-0.20.0.jar

# 2) 配置 exporter
cat >/opt/jmx_exporter/kafka.yml <<'EOF'
lowercaseOutputName: true
rules:
  - pattern: kafka.server<type=(.+), name=(.+)><>Value
  - pattern: kafka.log<type=(.+), name=(.+)><>Value
EOF

# 3) 修改 Kafka 启动参数(以 systemd 为例)
# /etc/systemd/system/kafka.service
# Environment="KAFKA_OPTS=-javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent.jar=7071:/opt/jmx_exporter/kafka.yml"

# 4) 重载并启动
systemctl daemon-reload
systemctl restart kafka

Prometheus 抓取配置示例:

# /etc/prometheus/prometheus.yml
scrape_configs:
  - job_name: 'kafka-broker'
    static_configs:
      - targets: ['10.0.0.11:7071','10.0.0.12:7071','10.0.0.13:7071']

健康检查范围与频率(含命令示例)#

  • 集群层面(每5分钟):Broker在线状态、Controller存活、ISR稳定性、URP数量。
  • 节点层面(每1分钟):磁盘I/O、CPU、内存、网卡、JVM GC停顿。
  • 主题/分区层面(每15分钟):Leader均衡度、分区分布、热点分区检测。
  • 客户端层面(每5分钟):Producer/Consumer错误率、重试率、消费滞后Lag。
  • 变更后检查(即时):滚动升级、Broker扩容、分区迁移后对ISR与副本同步进行验证。

示例:健康检查脚本(含命令解释)

#!/usr/bin/env bash
# /opt/kafka/bin/health_check.sh
# 说明:检查Broker存活、ISR、URP、分区分布
KAFKA_HOME=/opt/kafka
BOOTSTRAP=10.0.0.11:9092
ZK=10.0.0.21:2181

echo "== Broker 列表 =="
$KAFKA_HOME/bin/kafka-broker-api-versions.sh --bootstrap-server $BOOTSTRAP | head -n 5

echo "== URP 数量 =="
$KAFKA_HOME/bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeeper $ZK --topic __consumer_offsets 2>/dev/null

echo "== Topic 分区分布 =="
$KAFKA_HOME/bin/kafka-topics.sh --bootstrap-server $BOOTSTRAP --describe | head -n 10

健康检查标准与判定(含示例)#

  • Broker可用率:单节点健康为进程存活+端口可用+磁盘可写。
  • ISR稳定性:ISR无频繁缩减,URP=0或短时可恢复。
  • 生产消费链路:端到端延迟可接受、消费Lag无持续扩大趋势。
  • 元数据一致性:ZK/KRaft元数据一致,Topic配置无异常漂移。
  • 性能基线:延迟、吞吐和错误率不低于近7日基线的P95范围。

示例:端口与磁盘可写检查

# 端口连通
nc -zv 10.0.0.11 9092

# 磁盘可写
touch /data/kafka/.healthcheck && rm -f /data/kafka/.healthcheck

预警与健康检查联动规范(含示例)#

  • 预警触发后30分钟内执行健康检查,确认是否因容量不足导致性能下降。
  • 健康检查异常需关联容量预警,形成“容量—性能—故障”因果链。
  • 紧急阈值触发时,限制新Topic创建或扩容分区,避免进一步放大压力。

示例:限制自动创建Topic(紧急态操作)

# /opt/kafka/config/server.properties
auto.create.topics.enable=false

规范化输出与告警分级(含示例)#

  • 告警分级:提示(容量可用>14天)、一般(7–14天)、严重(<7天)。
  • 输出格式:包含时间、Broker/Topic维度、当前值、阈值、预测可用天数、建议动作。
  • 告警抑制:同一指标短时间重复告警合并,避免运维噪声。

Prometheus 告警规则示例(容量可用天数)

# /etc/prometheus/rules/kafka_capacity.yml
groups:
- name: kafka_capacity
  rules:
  - alert: KafkaDiskCapacitySevere
    expr: kafka_disk_available_days < 7
    for: 10m
    labels:
      severity: critical
    annotations:
      summary: "Kafka 磁盘容量严重不足"
      description: "Broker {{ $labels.instance }} 可用天数 {{ $value }} 天"

运维动作建议(含命令示例)#

  • 轻度预警:分区再均衡、优化保留策略(retention.ms/bytes)。
  • 中度预警:新增Broker或扩容存储、调整副本数与分区规划。
  • 重度预警:紧急扩容、暂停非核心Topic写入、降低保留周期并执行数据清理。

示例:调整保留策略与分区再均衡

# 调整 Topic 保留时间
/opt/kafka/bin/kafka-configs.sh --bootstrap-server 10.0.0.11:9092 \
  --alter --entity-type topics --entity-name orders \
  --add-config retention.ms=259200000

# 生成再均衡计划
/opt/kafka/bin/kafka-reassign-partitions.sh --bootstrap-server 10.0.0.11:9092 \
  --generate --topics-to-move-json-file /opt/kafka/reassign/topics.json \
  --broker-list "1,2,3"

排错清单(常见问题与命令)#

  • URP持续>0:检查Broker宕机、网络抖动、磁盘慢。
  • FD耗尽:检查分区数过多、ulimit过低。
  • 磁盘满:检查保留策略与日志清理线程是否生效。

排错命令示例:

# 检查 FD 限制
ulimit -n

# 查看 Broker 日志
tail -n 200 /opt/kafka/logs/server.log

# 检查磁盘 IO
iostat -x 1 5

练习#

  1. 编写脚本计算可用天数并接入 Prometheus Pushgateway(输出可用天数指标)。
  2. 将一个高价值 Topic 设置独立阈值,模拟达到严重级别后执行“保留策略调整”。
  3. 通过创建大量分区触发 FD 预警,观察告警与健康检查联动流程。