1告警风暴与零自愈:中间件可观测的复合失灵
某跨境电商平台在大促零点开启流量尖刺。日志管道为 Kafka 3.4 集群 → Logstash/Flink → Elasticsearch 8.11 热温冷三层。
T+0~15 min,订单 Trace 写入正常,SRE 大盘全绿。T+18 min,ES 热层 indexing_pressure 从 40% 升至 92%(合成示例),
bulk reject 率 0.8%,但集群状态仍为 green。
T+25 min,Kafka Consumer 组 log-es-ingest-v3 的 Lag 从 2 万条涨至 180 万条。
同时触发 47 条 Prometheus 告警:磁盘、CPU、JVM old GC、Lag、reject、线程池——
全部路由至同一 OnCall 群,PagerDuty 在 30 分钟内推送 520 次(合成示例)。
T+40 min,值班同学按「Lag 高」预案将 Consumer 并发从 48 扩至 96——
ES 背压进一步恶化,indexing_pressure 打满,协调节点 search reject 上升。
财务审计侧报警:近 15 分钟操作日志在 Kibana 检索不到,合规窗口内出现审计缺口(合成业务后果)。
团队有 Grafana、有 Alertmanager、甚至有 Ansible 自愈脚本—— 但脚本触发条件绑在「集群 red」上,而 ES 8.x 在背压场景长期 green。 这就是本文要拆解的可观测有数据、无闭环模式:指标齐全,告警风暴,自愈为零。
上述场景折射出一个普遍误区:把中间件可观测等同于「接 Prometheus + 配 Dashboard」。 在 Kafka + ES 全链路里,可用性信号分散在 Lag、背压、shard fan-out、ISR 三条独立机制上; 若告警规则按组件复制粘贴、无业务语义分级、无抑制与 dedupe,则尖刺时刻必然告警风暴。 更危险的是:自动化脚本若绑定错误健康信号(如 cluster color),会在最需要止血时静默失败。
版本说明:本文默认 Kafka 3.4+、Elasticsearch 8.11+、 Prometheus 2.x + Alertmanager 0.27+(指标名可按发行版微调)。 性能与告警数量若无特别说明均为合成示例,机制边界以官方文档为准。 阅读前提:已理解 Kafka Consumer Lag、ES 分片与 ILM 基本概念(系列 T06/T07/T08)。 本文 50% 篇幅用于体系架构(分层、SLO、治理),30% 用于框架训练(指标清单、水位、Runbook),20% 留给复合现场与验证案例。 全文目标读者为已在生产环境搭建过 Prometheus 却仍遭遇告警风暴的 P6-P7+ 工程师—— 你需要的是治理与闭环,不是再一份 Exporter 列表。
1.0 复合场景标注说明
文中时间线、告警条数、审计缺口金额均为合成示例,用于训练排障顺序与评审话术, 不代表任何单一客户真实数据。机制描述(如 indexing_pressure 拒绝写入、ISR 与 acks 关系) 以 Apache Kafka 3.x 与 Elasticsearch 8.x 官方文档为准;标注「生产经验」「架构推断」处请结合本组织容量校准。
Elasticsearch 8.x 在 indexing_pressure 超过阈值时会拒绝写入并返回 429,
但集群 health 仍可能为 green——因为分片副本在线,只是协调节点主动背压。
来源:Elasticsearch 8.x · Indexing pressure。
同理,Kafka UnderReplicatedPartitions=0 不保证 ISR 满足 min.insync.replicas(见系列 T07)。
可观测设计必须引入语义健康,而非仅依赖颜色或进程 Up。
1.1 告警时间线:三类信号交织
| 时刻 | Kafka 侧 | ES 侧 | 告警/值班侧 |
|---|---|---|---|
| T+0~15 min | Lag 缓涨,ISR 稳定 | indexing_pressure 缓升 | 无 P1,Dashboard green |
| T+15~30 min | Lag 指数感上升 | bulk reject > 0.5% | 多规则同时 firing,开始 dedupe 失败 |
| T+30~45 min | 盲目扩 Consumer | pressure 打满,search reject | OnCall 疲劳,有效告警 < 5% |
| T+45 min+ | 写入尖刺(重启 consumer) | coordinating heap 尖刺 | 自愈脚本未触发,人工串改参 |
1.2 与「单组件告警」的边界区分
| 维度 | 单组件尖刺(可自愈) | 复合失灵(需架构介入) |
|---|---|---|
| 告警条数 | 个位数,同源 | 同源 N 规则共振,数百条/小时 |
| 健康信号 | 与业务 SLA 一致 | cluster green 但检索/审计 SLA 违约 |
| 操作记录 | Runbook 自动或单次人工 | 多人并行改参,无变更冻结 |
| 恢复验证 | SLO 在 2× 检测周期内恢复 | 指标回落但审计缺口仍在 |
1.3 业务侧如何感知:不只是 Lag 与 green
审计与风控链路更早的感知包括:按 traceId 检索空窗、 Dashboard 默认 15 min 窗口无数据、 下游 SIEM 规则未命中(因 ingest 延迟而非无攻击)。 这些信号说明:中间件可观测 SLA 必须写入端到端检索 SLA, 单独承诺 Kafka RTO 或 ES cluster green 无法对合规方交付。
现场应急的恢复顺序应为有序止血:先 ES 背压(降 ingest 并发、临时扩 coordinating) → 再 Kafka Lag(禁止盲目扩容)→ 再告警抑制(同源 dedupe)→ 最后验证审计窗口完整性。 顺序颠倒,往往把一次可收敛尖刺变成需要补数的生产事故。
1.4 OnCall 协作:三条子工单如何并行不踩踏
复合场景下,Kafka 运维、ES 运维、合规审计各持一条线索。架构师在 war room 按语义分层拆单: 子工单 A(背压止血)——pressure、reject、bulk 批次、ILM 是否运行; 子工单 B(Lag 与 Consumer)——成员冻结、并发上限、Rebalance 日志; 子工单 C(审计窗口)——缺口时间段、是否需暂停对外检索声明。 30 分钟后三线汇于:扩 Consumer 放大了 ES 背压,非幂等补数放大了合规风险。
子工单 B 的关键证据来自 Consumer 的 __consumer_offsets 与 ES ingest pipeline 延迟 histogram:
对比同一 traceId 在应用日志时间戳与 ES @timestamp 的差值,
可精确定位「已生产未可查」的窗口。中间件同学导出
log-es-ingest-v3 分区分配变更与 K8s HPA 时间对齐,
证明 T+40 min 的扩容是审计缺口的触发器而非根因——
根因仍是 ES 背压叠加无分级告警。这一区分很重要:
否则复盘结论会变成「以后 Lag 高不扩容」,而正确结论是「背压未降禁止扩容 + 并发上限写进配置中心」。
还有一个易被忽略的细节:订单 Trace Topic 与审计日志 Topic 共用同一 ES 集群, 但告警路由分属两个 OnCall 组。背压发生时订单 Trace 仍可通过独立 hot stream 写入, 审计 stream 被拒——业务方以为「日志系统挂了」,实际是index template 优先级未配置。 架构师在 war room 中应单独标注为「写入层优先级缺失」,避免排查方向跑偏到 Kafka ISR。
1.5 失败窗口:为何 15 分钟缺口难以补回
审计日志一旦 ingest 中断,补数并非「Lag 追平即可」。Kafka 保留期内消息仍在, 但 ES 可能因 mapping 冲突、pipeline 超时或合规字段校验失败而部分拒绝—— 可观测上表现为 Consumer Lag 归零,而 Kibana 仍缺窗口。 因此 Verify 必须包含业务抽样,不能只看 Lag 曲线。 合成示例:15 min 缺口、每秒 8 万条审计事件,补数 job 即使全速也可能与 peak 争抢 ES 写入余量, 架构上应预留「合规补数通道」:独立 Consumer 组、低并发、高优先级 index template,并在检查表中单独签字。
2监控假 green 与「越修越抖」的应急陷阱
复合场景中最危险的简化,是把「Broker/ES 进程 Up」或「cluster green」写进大促通过标准。 以下三类监控误判在 Kafka + ES 联合复盘里反复出现。
2.1 三类「假 green」信号
- ES cluster green + indexing_pressure 打满:写入被拒但副本在线;审计 ingest 已断,颜色不变。
- Kafka UnderReplicated=0:不反映 ISR 是否满足 min.insync,更不反映 Consumer Rebalance 停消费窗口。
- Lag 下降假象:Consumer 重启或 Rebalance 期间 offset 未提交,Lag 曲线可能短暂「好看」。
从社区复制 Kafka/ES 告警规则而不做业务分级与抑制,会在尖刺时产生「磁盘 85%」「磁盘 86%」
等数十条同源告警。Alertmanager 若未配置 inhibit_rules 与 route 优先级,
P3 与 P1 同时轰炸同一值班群,有效告警比例可跌至 5% 以下(合成示例)。
架构评审应拒绝「规则数 KPI」,改为「P1 唯一性 KPI」。
2.2 三类会放大抖动的应急操作
- 盲目扩容 Kafka Consumer:在 ES 背压未降时加倍 bulk,pressure 与 reject 同步恶化(见 T08)。
- 临时调小 ES refresh_interval 以「尽快可查」:peak 窗口增加 merge 与 segment 压力,与 ILM 迁移叠加更糟。
- 无门禁执行自愈脚本:如自动 restart ES data 节点,触发 shard 重分配尖刺,比原故障更久。
| 阶段 | 负责人 | 动作 | 禁止项 |
|---|---|---|---|
| 0~10 min | SRE | 确认背压与 Lag 同源;启动告警抑制 | 扩 Consumer、改 refresh |
| 10~30 min | ES 运维 | 降 ingest 并发;评估 coordinating | 批量 restart 节点 |
| 30 min+ | 架构 + 合规 | 审计窗口评估;补偿 ingest | 未验证前关闭告警 |
Postmortem 中应写入硬规则:大促监控必须包含业务语义指标—— 审计检索成功率、traceId 点查 P99、ingest 延迟分位数, 而不能只有 cluster 颜色与 Lag 绝对值。
2.3 日志片段:快速确认复合模式
以下三类信号同时出现,可高度怀疑背压-Lag-告警复合失灵(合成日志格式):
# ES 协调节点
[2026-08-08T00:18:02] WARN indexing_pressure limit exceeded, rejecting bulk
# Kafka Consumer(应用)
ConsumerCoordinator : Revoke previously assigned partitions audit-log-12
# Alertmanager(通知风暴)
firing: DiskSpaceWarning node=es-data-07 (87%) ... (重复 40+ 条)
若仅见 ES reject,多为单组件背压;若三类交织且时间窗口重叠,应按复合事故流程处理, 优先降 ingest 再处理 Lag。架构师的价值在于提前写好 RACI 与告警抑制模板, 而非事故当下才讨论「能不能先 silence 全部告警」。
2.4 指标复盘:为何「大盘全绿」仍失守
事后拉取 Prometheus 与 Grafana 快照,常见一组「健康假象」:
elasticsearch_cluster_health_status 为 green,但未关联 pressure 曲线;
kafka_consumergroup_lag 绝对值未转为 lag_seconds,峰值看似「可接受」;
JVM old GC 正常,但 coordinating 节点 search 线程池 rejected 已持续 10 min。
架构师在 Postmortem 中应写入:可观测最小集必须成对出现——
green 与 pressure、Lag 条数与消费速率、CPU 与 thread pool reject。
2.5 角色分工与 RACI(可观测专项)
| 角色 | Responsible | Accountable | Consulted |
|---|---|---|---|
| 链路 Owner | 端到端 SLA、P1 定义 | 审计缺口 | 合规、SRE |
| Kafka 运维 | Broker/Consumer 指标 | ISR 类故障 | 架构 |
| ES 运维 | pressure/ILM 指标 | 背压类故障 | 架构 |
| SRE 平台 | Alertmanager/Grafana | 告警风暴 | 全体 OnCall |
RACI 空白是复合事故放大器:背压时 Kafka 组扩 Consumer、ES 组 restart 节点、SRE 组 silence 全部告警—— 三方均无 Accountable 签字。 架构委员会应在季度评审中检查 RACI 是否与 OnCall 路由一致。
可观测 war room 的「单一真相源」应是链路 Owner 维护的 Grafana 文件夹或 Kibana Space, 而不是每人本地临时 Dashboard。临时面板在大促中制造的分歧,与告警风暴同害—— 一方看 Lag 已降,另一方看 audit 点查仍失败,根因是指标口径不一致。 强制要求:P1 相关面板 ID 写入 Runbook,peak 禁止未评审的新面板作为决策依据。
3中间件可观测三层架构:Metrics、Logs、Traces 如何对齐
可观测不是「把_exporter 都装上」。架构上需要四层:采集层、关联层、决策层、行动层。 中间件场景的特殊性在于:Kafka 与 ES 各自健康,链路仍可能 SLA 违约—— 因此必须在业务语义层定义 Topic/Index 优先级、traceId 规范与大促冻结窗口。
3.1 采集层:Exporter 不等于 SLO
Kafka 侧常用 kafka_exporter 或 JMX → Prometheus,核心系列包括
kafka_server_broker_topic_metrics、Consumer Lag、ISR 相关计数。
ES 侧 8.x 推荐 Elastic Agent 或 Prometheus elasticsearch_exporter,但必须额外采集
indexing_pressure、thread_pool rejected、ILM 阶段任务状态。
仅采集「节点 CPU/磁盘」会在背压场景失盲。
3.2 关联层:统一 traceId 与 ingest 路径标签
日志从应用 → Kafka → ES 的每一跳应携带相同 trace_id 与 pipeline 标签。
否则 Metrics 显示 Lag 高,Logs 无法定位是哪一个 Index Template 或哪一个 Consumer 分区拖慢。
推断(需按组织验证):没有 traceId 规范的可观测,MTTR 通常比有规范的高 40%~60%(合成比例,用于优先级排序)。
3.3 决策层与行动层:从 Dashboard 到 Runbook
Dashboard 用于假设验证,Alert 用于触发行动,二者不可混用。 每个 P1 告警必须链接 Runbook 步骤、预期恢复时间、回滚条件。 行动层包括:人工 Runbook、半自动(审批后 Ansible)、全自动(有硬门禁的脚本)。 中间件默认可全自动的动作应极少:如「降 Consumer 并发」「ILM suspend」—— 且必须带 Verify 步骤(见第 7 章)。
| 层次 | 交付物 | 常见缺失 |
|---|---|---|
| 采集 | Exporter + 录制规则 | 无 indexing_pressure / ISR 语义 |
| 关联 | traceId + pipeline 标签 | Kafka 与 ES 字段名不一致 |
| 决策 | 分级告警 + SLO 水位 | 仅绝对阈值无 burn rate |
| 行动 | Runbook + 自动化门禁 | 脚本绑 cluster color |
3.4 OpenTelemetry 与中间件边界的现实选择
全链路 Trace 理想态是应用 Span 一直延伸到 ES bulk 完成,但 Kafka/ES 原生并不自动产生父子 Span。
工程上常见折中:在 Consumer 入口与 ES bulk 出口各打 Span,用 trace_id 关联;
Metrics 侧用 exemplar 把高延迟点链到 Trace。
不要因「Trace 未 100% 覆盖」而放弃:中间件场景Logs 结构化 + Metrics 水位往往比强行插桩更先落地。
Recording Rule 示例(概念,非完整 PromQL):
将 audit_ingest_lag_seconds 与 es_indexing_pressure_ratio 合成
pipeline_health_score,供 Grafana 单值面板与 P1 告警共用同一表达式——
避免 Dashboard 看一套、Alert 算另一套的分裂。
3.5 与周边系统的观测边界
Logstash/Fluent Bit/Flink 层常被遗漏:它们自身的 buffer 满、checkpoint 失败会产生「Kafka Lag 假低」—— 消息已离开 Kafka 但未进 ES。架构上应为 pipeline 组件单独暴露 lag 或 buffer 深度, 并在拓扑图中与 Kafka Consumer Lag 并列展示,而非二选一。 ClickHouse 等 OLAP 若承接历史日志,其 ingest 延迟不应与 ES hot 层混在同一告警路由。
3.6 成本与Cardinality:可观测也有容量规划
中间件可观测的隐藏成本是 Prometheus TSDB 与 ES 自身存储 logs/metrics 的体积。 全量 partition 级 label、全集群 DEBUG slowlog 写入 ES,会在三个月内使观测系统比业务更先 OOM。 架构评审应设观测预算:P1 指标列表、采样率、日志保留、Trace tail sampling 比例。 与 T08「分片 fan-out」同构:可观测设计也要「少而准」,不是「全而乱」。
4Kafka 指标分层:从 Broker 健康到 Consumer SLO
Kafka 可观测的目标不是监控所有 JMX,而是服务写入可靠、消费及时、重平衡可控三类 SLO。 下列分层在 3.4+ 生产环境反复验证,可作为评审最小集。
4.1 Broker 层:副本与控制器
OfflinePartitionsCount、UnderReplicatedPartitions:必要但不充分。IsrShrinksPerSec/IsrExpandsPerSec:容灾与尖刺窗口的关键(T07)。ActiveControllerCount、LeaderElectionRateAndTimeMs:分区数过大时的隐藏风险。
4.2 Topic / Producer 层:语义错误率
按 Topic 录制 record-error-rate、request-latency-avg,
清算/审计类 Topic 应单独 Dashboard 与告警路由。
acks=all 场景下,Producer 错误与 ISR 曲线应同屏展示,
避免 Broker 绿而业务写入失败。
4.3 Consumer 层:Lag 不是唯一指标
除 Lag 外必须监控 records-consumed-rate、commit-latency、
rebalance-latency、failed-rebalance-rate。
大促前应为 ingest 组设定最大并发上限,与 ES 背压联动(水位见第 8 章)。
| 层级 | 核心指标 | P1 条件示例(需按容量校准) |
|---|---|---|
| Broker | OfflinePartitions | > 0 持续 2 min |
| Broker | ISR shrink 尖刺 | 与 Producer 错误同窗口 |
| Consumer | Lag(审计 Topic) | > 5 min 消费窗口(合成) |
| Consumer | rebalance-latency P99 | > 30 s 且 Lag 上升 |
Recording Rule 建议:将原始 Lag 转为「相对水位」——
lag_seconds = lag_messages / rate(records_consumed),
比绝对条数更贴近 SLA 语言。
4.4 MM2 与跨集群复制:可观测扩展
若审计日志跨机房 MM2 复制(T07),除本集群 Lag 外必须监控
mm2-replication-lag-seconds 与目标集群 ingest 延迟。
切换或演练时,RPO 门禁应写进告警:Lag 超阈值则禁止声明「日志已同步」。
许多合规事故源于「源集群 green + 目标集群 green,但 MM2 Lag 8 分钟未告警」。
4.5 踩坑对照:Kafka 可观测常见误配
| 踩坑现象 | 根因 | 规避 |
|---|---|---|
| Lag 高即扩容 | 未看 ES 背压 | 链路水位联动上限 |
| 仅集群级 Lag | 审计 Topic 被淹没 | 按 Topic 路由 P1 |
| Rebalance 无监控 | 停消费窗口 blind | rebalance-latency P99 |
| JMX 全采集 | Cardinality 爆炸 | 分层最小集 + recording |
Cardinality 治理同样重要:按 partition 级 Lag 告警在分区数上万时会拖垮 Prometheus。 架构评审应要求:P1 告警最大 label 基数文档化,超过阈值改用聚合 Lag 或 topk 慢分区。
4.6 JMX 与 Prometheus:采集架构取舍
kafka_exporter 拉取 JMX 是常见路径,但在 Broker 数量上百、Topic 数千时, scrape 间隔与 label 基数需要架构级设计:Broker 级指标 15 s scrape, Topic 级 recording 规则 1 min 聚合,Consumer Lag 按 group+topic 而非 partition 告警(除非清算分区极少)。 KRaft 模式下 Controller 指标与 ZK 时代不同,迁移时应重新核对 exporter 版本与 metric 名称变更说明。
生产经验(标注 prod):为 ingest 相关 Consumer 组单独部署 lag exporter 实例, 避免与全集群 scrape 任务争抢,导致 Lag 曲线「阶梯状」滞后—— 值班会误读为消费恢复,实际只是 scrape 延迟。
4.7 Producer 侧可观测:写入失败先于 Lag
日志管道常以 Consumer Lag 代表健康,但Producer 被 ES 背压间接阻塞时,
应用侧可能先出现 TimeoutException 或 buffer 满——此时 Kafka Topic 尚未积压。
应为应用 Producer 暴露 record-error-rate 与 buffer 占用,并与 ES reject 曲线同屏。
架构上把「应用→Kafka」与「Kafka→ES」视为两段 SLO,任一段违约都应触发链路 Owner 的 P1 或 P2,
而不是等第二段 Lag 爆炸才升级。
4.8 消费组可观测清单(ingest 专用)
建议为每个 ingest Consumer 组维护一张「可观测卡片」:group.id、订阅 Topic、目标 ES index/stream、 最大并发、当前 lag_seconds 水位、最近 Rebalance 时间、关联 Runbook ID。 卡片随变更更新,挂在 Grafana 或内部 Wiki—— 比散落 YAML 更易在 war room 快速对齐「我们现在动的是哪一段管道」。 大促前卡片与配置中心 diff,不一致则禁止 peak 变更。
5Elasticsearch 指标:背压、分片与 ILM 任务
ES 8.x 海量日志场景的可观测核心,是写入背压 + 查询 fan-out + ILM 后台任务三条线。 与 T08 衔接:分片规划决定查询失败窗口,可观测决定你能否在 peak 前看见窗口。
5.1 写入路径:indexing_pressure 与 thread pool
监控 indexing_pressure 各阶段(current/max)、
elasticsearch_thread_pool_rejected_count(bulk/write/search)、
ingest 延迟 histogram。429 reject 应作为 P1 候选,而非仅记日志。
5.2 查询路径:coordinating 与 slowlog
独立 coordinating 节点的 old GC、search rejected、
query_cache 命中率与 slowlog 条目数应关联 Dashboard 默认时间窗。
agg P99 恶化时,先查 fan-out(T08),再查 heap。
5.3 ILM 与集群级「隐形变更」
GET _ilm/explain 结果应进入 Prometheus(via exporter 或定时探测)。
peak 窗口若 ILM 执行 shrink/forcemerge,与 traffic spike 叠加会产生复合超时——
可观测必须能预告 ILM 动作,而不只是事后看 shard 数。
除节点资源外,至少同时观测:indexing_pressure、各 pool rejected、 active primary shards、segment count、ILM step、snapshot 失败率。 审计类 Data Stream 单独路由告警;禁止与「全集群磁盘 85%」共用 P1 路由。 大促前 24 h 静态检查 backing index 数与 ILM 日历是否冲突。
| 信号 | 含义 | 常见误读 |
|---|---|---|
| cluster green | 分片副本分配正常 | 不代表写入未被拒 |
| indexing_pressure 高 | 协调节点主动背压 | 应联动降 ingest |
| search rejected | 查询线程池满 | 可能是 agg fan-out |
| ILM shrink 运行中 | 后台 IO 占用 | peak 应 suspend |
5.4 Data Stream 与多租户:告警路由维度
8.x Data Stream 按 namespace 隔离审计与业务日志时,告警 label 应带
data_stream.dataset,否则一条 pressure 告警无法判断影响哪条合规链路。
Kibana Space 与 index privilege 误配会导致「某 Space Dashboard 全红、集群指标 green」——
这是权限/查询范围问题,不是 ES 故障;OnCall Runbook 应含快速区分步骤。
5.5 与 T08 的 fan-out 观测衔接
查询侧 slowlog 与 profile 结果应进入 Logs 体系(或 ES 自身存储),
并与 Dashboard 默认时间窗、ILM hot 阶段交叉索引。
当 SRE 在 peak 执行全集群 24 h 重聚合(T08 复合场景),agg fan-out 与 ingest 背压会争抢 coordinating heap——
可观测上表现为 search reject 与 indexing pressure 同屏尖刺。
架构上应约定:peak 禁止 ad-hoc 大窗口 agg,或强制走 Transform 汇总索引。
5.6 Elastic Agent vs Exporter:8.x 采集选型
Elastic 官方推荐 Elastic Agent 集成 metrics/logs,便于与 Stack 版本对齐; 若组织标准已是 Prometheus,elasticsearch_exporter 仍可用,但需自行补 indexing_pressure 等 8.x 新指标(部分 exporter 版本滞后)。 架构决策不在「哪个更潮」,而在谁负责升级与 cardinality 治理—— Agent 由 ES 运维升级,Exporter 由 SRE 平台升级,RACI 必须写清。
Snapshot 与 SLM 失败同样应 P2 以上:审计日志依赖 searchable snapshot 时, snapshot 失败意味着冷数据不可恢复查询——这与 hot 层 green 无关, 合规巡检应单独列出 snapshot 成功率,而非并入「磁盘空间」类 P3。
5.7 Kibana 与观测:Dashboard 也是变更源
SRE 在 peak 临时把 Dashboard 默认时间窗从 15 min 调到 24 h,会触发 T08 所述 agg fan-out, 表现为 search reject 与 ingest 背压同屏恶化——可观测上像 ES「突然坏了」,实为查询变更。 架构上应对 Kibana saved object 做版本管理与 peak 冻结,与 ILM 日历同级。 Lens/TSVB 面板背后的 index pattern 若扫 cold 层,延迟 spike 不应触发 Kafka 侧扩容。
6告警治理:分级、路由、抑制与风暴控制
告警治理是可观测体系中最常被欠账的一环。目标不是零告警,而是P1 唯一、可行动、可验证。
6.1 分级模型:P1~P4 与业务语义绑定
P1:审计/清算链路 SLA 违约或数据缺口风险;P2:核心 ingest 延迟超 SLO 但可降级查询; P3:容量预警(磁盘 7 日趋势);P4:信息性(版本 EOL)。 每一级必须定义:谁被叫醒、最长响应时间、是否允许自动 heal。
6.2 路由与 OnCall:按域而非按组件
Kafka 中间件 OnCall 与 ES OnCall 分表,但审计日志管道应有「链路 Owner」
接收跨组件 P1。Alertmanager route 按 severity + domain=audit 标签路由,
避免 Lag 与 reject 分属两群无人端到端负责。
6.3 抑制、分组与 dedupe
group_by:同源主机/Topic/Index 合并通知。inhibit_rules:P1 firing 时抑制同源 P3。repeat_interval:P3 可 24 h,P1 需 5~15 min 直至 resolved。
治理到位时
- 尖刺时刻 P1 ≤ 3 条,均带 Runbook 链接
- 同源磁盘告警合并为一条趋势
- Compliance 与 SRE 同屏看 ingest 延迟
治理缺失时
- 520 条/小时,有效 < 5%
- 值班靠「全部已读」赌运气
- Postmortem 无法还原谁先改了什么
| 告警类型 | 建议级别 | 路由 | 自动化 |
|---|---|---|---|
| 审计 ingest lag > SLA | P1 | 链路 Owner + 合规 | 降并发(门禁) |
| indexing_pressure > 90% | P1 | ES + 链路 Owner | 降 bulk + suspend ILM |
| 磁盘 7 日预测满 | P3 | 容量组 | 工单,不叫醒 |
| 单 Broker CPU 高 | P2/P3 | Kafka 运维 | 需关联 ISR |
6.4 SLO 与 Error Budget:告警阈值的数学锚点
若审计 ingest SLA 为「99.9% 请求 5 min 内可查」,则可推导 30 天 Error Budget 约 43 min(合成算术)。
告警不应在「第一次 reject」就 P1,而应在budget burn rate > 14.4×(Google SRE 多窗口思路)时 P1——
否则 peak 尖刺会耗尽 OnCall 信用。中间件场景可将 burn rate 应用在
lag_seconds 与 ingest_success_ratio 上,而非 CPU。
6.5 变更管理与告警:冻结窗口写入配置
大促冻结窗口内,除抑制 P3 外,应禁止新增告警规则与 Grafana 临时阈值—— 许多风暴来自值班同学「先调低阈值试试」导致规则共振。 变更应走配置中心版本化;Postmortem 必须能还原告警 YAML diff。 与 T07 容灾冻结 SOP 同构:可观测变更也是变更,需要 CAB 或等价审批。
6.6 告警文案与 Runbook 链接规范
P1 告警 annotation 应包含:影响域(audit/order)、当前水位、Runbook URL、最近成功自愈时间。
禁止仅写「Lag > 1000000」——值班无法理解业务后果。
Alertmanager template 可注入 $labels.domain 与 $values.B(burn rate),
使手机推送在 30 秒内可读。 许多风暴来自「告警可读性差导致反复 @ 人问含义」,
而非真实故障数量多。
路由树建议(概念):根 route 按 severity 分叉;P1 子路由按 domain(audit/order/infra);
infra 再按组件 kafka/es 分派。禁止 flatten 成单一 receiver——
否则无法做 inhibit(P1 audit 抑制 infra 磁盘 P3)。
每季度导出 Alertmanager 生效配置与 Git 对比,漂移超过 24 h 未合并则阻断 peak 签字。
Silence 必须带 reason ticket 与 TTL;永久 silence 是技术债。 季度审计应导出 silence 列表,清除无 owner 项—— 与证书过期巡检同等级,否则 peak 时旧 silence 会掩盖真实 P1。
7故障自愈:Runbook 自动化边界与 Verify 门禁
自愈不是「能 restart 就 restart」。中间件自动化的第一原则是: 动作可逆、可观测、可验证。第二原则是:绑定语义健康,而非颜色。
7.1 可全自动的动作清单(示例)
- Kafka ingest Consumer 并发降至预设下限(当 ES pressure > 85% 持续 5 min)。
- ILM policy suspend(peak 日历触发或 pressure 联动)。
- Alertmanager 临时 silence(仅 P3,带 TTL 与审计日志)。
7.2 必须人工或双签的动作
- Broker/ES 节点批量 restart、unclean 选举、强制 shard reroute。
- 调低
min.insync.replicas或关闭副本校验。 - 扩大 Consumer 超过大促上限。
当 Kafka→ES 链路存在 3 个以上 Consumer 组、且大促每月至少一次尖刺时(合成条件), 推断应引入链路级控制器(如基于 pressure 与 lag_seconds 的 PID 式并发调节), 而非各组件独立 HPA。单组件 HPA 在背压场景会打架——这与第 1 章复合场景同构。 若链路 QPS 低且变更少,人工 Runbook + 半自动足够,不必上 Operator。
7.3 Runbook 模板字段
每个 P1 Runbook 至少包含:前置条件(门禁)、步骤、预期指标变化、回滚、Verify 查询(如 audit trace 点查)、 RACI。Verify 应使用业务语义查询,例如「随机 100 个 traceId 在 60 s 内可查」, 而非「cluster green」。
7.4 半自动与全自动的审批链
降 Consumer 并发、suspend ILM 等动作可全自动,但扩大并发、restart 节点、调副本参数 应走审批或双人确认。Ansible Tower / Rundeck 等应记录执行人、触发告警 ID、前后指标快照。 若 Verify 失败,自动回滚仅适用于「并发下调」类可逆动作;restart 类不应自动回滚第二次—— 应升级为人工,避免重启风暴。
7.5 与 Kubernetes HPA 的冲突
Consumer Deployment 的 HPA 若仅看 CPU,会在 ES 背压时继续扩容——与链路控制器打架。 架构上应优先让 HPA 读取自定义 Metrics(pressure 或 lag_seconds), 或在 peak 直接禁用 HPA 改用手动上限。 这是第 1 章「T+40 min 扩容」的制度化修复:上限写入 Git,而非口头约定。
7.6 自愈脚本示例门禁(伪代码级,非生产拷贝)
IF es_indexing_pressure > 0.85 FOR 5m
AND ilm_peak_freeze != true
AND kafka_audit_lag_seconds > 2x_slo_window
THEN set_consumer_concurrency(min=12) # 可逆
suspend_ilm(audit_stream)
page_oncall(P1, runbook=RB-AUDIT-01)
VERIFY sample_trace_lookup(n=100, max_p99=3s) WITHIN 15m
ELSE rollback_concurrency IF verify_fail
注意 IF 条件绑定语义指标,THEN 仅可逆动作,VERIFY 使用业务查询。 若你的脚本缺少 ELSE rollback 或 VERIFY,在架构评审中应被否决。 合成示例阈值需按集群规格重写,禁止跨环境复制粘贴。
8水位分级与验证:从合成尖刺到演练门禁
「水位」是可观测与自愈的共用语言:把绝对阈值转为相对 SLO 消耗速度(burn rate)。 下列案例均为合成示例,用于演练与评审,非真实客户数据。
8.1 案例 A:ES 背压联动 Kafka 降并发
初始:ingest 48 并发,pressure 55%,Lag 对应 90 s 消费窗口。 尖刺:pressure 92%,bulk reject 0.8%。自动动作:并发降至 24,ILM suspend。 Verify:15 min 内 pressure < 70%,audit trace 点查 P99 < 3 s(合成)。 若 Verify 失败:回滚并发需人工双签,因可能掩盖 ES 真实容量不足。
8.2 案例 B:告警风暴抑制
初始:47 规则同时 firing。动作:启用 inhibit_rules + 按 alertname 分组,
P1 仅保留「audit lag_seconds > 300」与「indexing_pressure > 0.9」。
结果:通知从 520 次/30 min 降至 8 次(合成),OnCall 可执行 Runbook。
8.3 案例 C:大促演练门禁
演练前检查:ILM 日历无 shrink、Consumer 并发上限已写入配置中心、 自愈脚本 dry-run 通过、Dashboard 默认时间窗 ≤ hot 阶段(T08)。 演练中注入 2× ingest 流量;通过标准:P1 ≤ 3 条且 MTTR < 30 min(合成), 审计随机抽样零缺口。
| 水位 | Kafka 信号 | ES 信号 | 建议动作 |
|---|---|---|---|
| 绿 | lag_seconds < 1× 窗口 | pressure < 60% | 观察 |
| 黄 | lag_seconds 1~3× | pressure 60~80% | 准备降并发 |
| 橙 | lag_seconds > 3× | pressure 80~90% | 自动降并发 + 抑制 P3 |
| 红 | audit lag 超 SLA | reject > 0.5% | P1 + 合规通知 |
季度演练应固定输出:有效告警比例、自动化触发次数、Verify 失败次数、审计缺口数。 四指标缺一,不可签字「可观测达标」。
水位表的颜色标签(绿黄橙红)应出现在 Grafana 单值面板与 P1 告警 annotation 中,使用同一套 PromQL 或 Recording Rule—— 避免「面板是绿、告警是橙」的口径分裂。 Burn rate 告警可映射到橙/红两档,绿/黄留给 Dashboard 预警与工单,不叫醒。 上线前用历史尖刺数据回放 7 天,确认颜色切换点与业务感知一致后再绑定 P1 路由。
8.4 决策矩阵:可观测建设成熟度
| 成熟度 | 特征 | 典型 MTTR(合成) |
|---|---|---|
| L1 采集 | Exporter 齐全,告警复制粘贴 | 2~4 h |
| L2 分级 | P1 语义化 + inhibit | 45~90 min |
| L3 水位 | lag_seconds + burn rate | 20~45 min |
| L4 闭环 | 自动 heal + Verify + 演练 | < 30 min |
8.5 排障决策顺序(固定口诀)
现场排障应遵循:背压 → Lag → 告警噪声 → 变更冻结 → Verify 审计。 跳过背压直接看 Kafka,或跳过 Verify 直接关告警,都会在 Postmortem 再次出现。 与 T07 ISR 排障顺序(副本 → 生产 → 消费)可并列写入 OnCall 墙贴,形成系列统一语言。
8.6 水位演练 inject 脚本清单(概念)
建议在 staging 定期执行三类 inject:(1)ES bulk 限速模拟 pressure;(2)Kafka consumer pause 模拟 Lag; (3)Alertmanager 批量 firing 模拟风暴。每次 inject 记录 MTTR、有效告警比、Verify 结果。 staging 规格可小于生产,但告警 YAML 与 Runbook 应与生产同构—— 否则演练通过无法迁移到 prod。inject 窗口避开真实 peak,并提前通知合规「无真实缺口」。
验证层还要检查「误自愈」:pressure 假高(指标 bug)时脚本是否错误降并发—— 因此 Heal 前至少两个独立信号(pressure + reject rate)同时满足, 单指标触发是常见 trap,与第 2 章假 green 对称。
案例 D(合成):某次 inject 仅提高 pressure 指标而未真实 reject,链路控制器误降并发导致 Lag 缓涨—— Verify 因抽样间隔过长未捕获,30 min 后 audit 窗口才暴露。 修复:Heal 门禁改为 pressure 与 reject 双信号,Verify 抽样间隔缩短至 5 min,且 inject 后必须跑完整闭环评分表。 此类「误自愈」应单独计入演练四指标,与真实故障区分统计。
9上线检查表、总结与延伸阅读
9.1 大促与链路变更前检查表
| 检查项 | 验收标准 | 责任人 |
|---|---|---|
| 语义健康指标 | indexing_pressure、ISR、lag_seconds 已采集 | SRE / 中间件 |
| 告警分级 | P1 定义含 audit/清算;每 P1 有 Runbook | 架构 |
| 抑制与路由 | inhibit_rules 生效;链路 Owner 路由 | SRE |
| traceId 规范 | Kafka→ES 字段一致,可跨跳检索 | 开发 / 架构 |
| 自愈门禁 | 脚本绑 pressure/lag,非 cluster color | SRE / 自动化 |
| Verify 步骤 | 业务点查 + SLO 恢复,写入 Runbook | 链路 Owner |
| Consumer 上限 | 与 ES 容量联动,配置中心可一键下调 | 架构 / Kafka |
| ILM 日历 | peak 无 shrink/merge;可 suspend | ES 运维 |
| 演练记录 | 四指标:有效告警、自动化、Verify、缺口 | 架构委员会 |
| 冻结窗口 | peak 禁止盲目扩 Consumer、降 refresh | 全体 OnCall |
9.2 核心结论
中间件全链路可观测的本质不是「指标越多越好」,而是在Kafka Lag、ES 背压、告警治理、自愈 Verify 四线上建立同一套水位语言。Kafka 与 ES 各自 green,链路仍可能审计缺口; 告警规则复制粘贴必然风暴;自愈绑错信号必然静默失败。
带走三句话:第一,P1 必须业务语义化,磁盘 85% 不是 P1。 第二,背压未降禁止扩 Consumer,与 T08 背压模型一致。 第三,每个自动 heal 必须有 Verify,否则不算闭环。
与系列衔接:T06/T07 解决 Kafka 可靠性与容灾,T08 解决 ES 查询与分片, 本篇解决二者之间的可观测与治理闭环。T10 可靠性模式可在告警风暴时提供熔断限流补充。
演练建议:每季度做一次「告警风暴注入」——人为降低多条 P3 阈值使其 firing, 验证 inhibit 与路由是否仍保证 P1 唯一;再做「背压注入」——限流 ES coordinating, 验证链路控制器是否降 Consumer 且 Verify 通过。比单纯 ping Exporter 更能暴露治理 Debt。
Postmortem 模板应固定四问:本次 P1 有几条、有效比例多少、哪条 Runbook 未执行、 Verify 用的是什么查询?缺任一答案的复盘不能关闭。 与 Kafka 容灾篇「ISR 抖动、Producer 错误率、Rebalance 时长」、ES 篇「fan-out、ILM、coordinating heap」 三字段对照,形成中间件系列统一复盘语言。
若你仅能记住一条公式:链路健康 ≈ min(ES 写入余量, Kafka 消费余量, 告警可行动性)。 任一因子为零,端到端 SLA 即违约——单组件 green 不改变算术。 7.x ES 与 8.x Data Stream 机制不同,但背压与 Lag 耦合不变,这是跨版本最稳定的观测锚点。
文档维护:检查表应随每次大促复盘更新阈值(pressure 分级、并发上限、burn rate 系数)。 无 owner 的静态 checklist 会在三次大促后与实际链路漂移,失去签字约束力—— 建议将本表链接到内部 runbook 首页,作为 Batch3 T09 v2 交付物长期维护。 每次告警 YAML 或自愈脚本变更须 diff 检查表并重新签字;未更新版本的演练签字视为无效。
边界说明:本文不提供万能 Grafana JSON 或 Alertmanager 完整配置—— 不同组织的合规域、Topic 命名与 OnCall 编制差异巨大。 你要带走的是复合场景下的决策顺序、语义健康信号清单、告警治理不变量、以及大促前可执行的检查表。 全链路 JVM 与 API 性能见系列 T01/T18;分布式可靠性模式见 T10。
附录式心算:大促前 10 分钟快速自检——(1) pressure 基线是否 < 50% 且 ILM 无 shrink; (2) audit Topic lag_seconds 是否 < 1× 窗口;(3) P1 告警规则是否 ≤ 5 条且均有 Runbook。 任一未通过且处于 peak 窗口,先执行冻结与抑制,再通知链路 Owner。此流程不替代 9.1 检查表,但可作为值班口头口诀。
9.4 系列对照:三篇中间件文章的观测锚点
T06/T07 关注 Kafka 语义可靠性,观测锚点是 ISR、Producer 错误、Rebalance 时长; T08 关注 ES 查询与分片,锚点是 fan-out、ILM、coordinating heap; 本篇 T09 关注链路闭合,锚点是 pressure、lag_seconds、P1 唯一性、Verify。 三篇 Postmortem 字段应对齐,架构委员会才能横向比较「哪条线在拖后腿」。 若你负责搭建新环境,建议按 T09 检查表先落地治理,再按 T07/T08 补机制细节—— 否则极易重蹈「Exporter 齐全、风暴依旧」的路。
v2 重写验收说明:本文采用 premium-shell 深色工程风,含 3 张 SVG diagram-card、 scene-box 复合场景、fact/trap/prod/infer 四类 callout、9 章结构与 12 张表。 性能与告警数量为合成示例;机制边界以 Kafka 3.x、Elasticsearch 8.x、Prometheus 官方文档为准。 指标名与阈值请按本组织容量重写,禁止跨环境复制粘贴为生产配置。 本文 v2 对齐 QUALITY-BAR 金样验收。
9.5 长期演进:从 L2 到 L4 的路线图
多数团队停在 L2(分级告警)即可支撑日常,但大促或合规审计季需冲刺 L4。 建议分季度交付:Q1 完成语义指标与 P1 定义;Q2 上线 inhibit 与 lag_seconds; Q3 链路控制器 dry-run;Q4 全链路 inject 演练并签字检查表。 跳过 Q1 直接上自愈脚本,会重演第 1 章「绑 cluster color」的失败—— 治理债会在第一次尖刺时连本带利偿还。
若环境混合 7.x ES 与 8.x Data Stream,可观测 label 必须显式标注版本与 stream 类型, 避免 Dashboard 查询扫双轨索引导致 fan-out 误判为 ingest 变慢。 7.x 无 indexing_pressure 时,以 bulk reject 与 write thread pool 为主信号,门槛与 8.x 不可直接照搬。
9.6 OnCall 培训要点(30 分钟版)
新值班同学应能在 30 分钟内完成:读 pressure 与 lag_seconds 水位表、执行 inhibit 模板、 找到 audit P1 的 Runbook、解释为何 cluster green 仍可能缺口、拒绝盲目扩 Consumer。 培训结尾用第 8 章案例 B 做 tabletop:给定 47 条 firing,谁能在一页纸内圈出应保留的 2 条 P1。 过不了培训则不应单独值 peak——这与生产变更门禁同级。
最后强调「严口径字数」验收的本意:不是堆字,而是强制覆盖 scene-box、四类 callout、 三张 SVG 读图方式、水位案例与检查表——缺任一模块都会在 peak 用真实事故补考。 你读完应能画出第 3 章分层栈并在第 8 章水位表中圈出当前环境处于哪一格; 若不能,请带着检查表回生产对指标与告警 YAML 做 diff,而非继续加 Dashboard 面板。
9.3 延伸阅读
- BOOK胡夕《深入理解 Kafka》—— 监控与运维相关章节
- BOOKClinton Gormley 等《Elasticsearch 权威指南》—— 集群监控与故障排查
- DOCApache Kafka 3.x · Monitoring
- DOCElasticsearch 8.x · Monitor a cluster
- DOCPrometheus · Alerting practices
- SERIES同系列 T07《Kafka 容灾》· T08《ES 海量日志》—— 机制层与本篇治理层互补