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