高可用架构需将监控能力深度嵌入全链路组件并构建闭环:指标采集→异常识别→告警分级→通知触达→故障定位;覆盖API网关、微服务、Redis、MQ、数据库及基础设施层关键指标,并通过OTLP统一采集、带上下文标签告警、分级触达与抑制聚合实现精准响应。

要让高可用架构真正“可感知、可响应”,光有冗余和自动切换不够,关键得把每个组件的运行状态实时暴露出来,并在异常时精准告警。这需要把监控能力像毛细血管一样,扎进网关、服务、缓存、消息队列、数据库、中间件等所有环节,再统一归集、分级触发。
核心不是堆工具,而是建闭环:指标采集 → 异常识别 → 告警分级 → 通知触达 → 故障定位
覆盖全链路的关键组件监控点
- API网关层:监控请求总量、成功率、平均延迟、5xx错误率、限流触发次数。特别关注熔断开关状态和降级策略是否被激活,这些直接影响用户可见性。
- 微服务应用层:除基础JVM指标(GC频率、堆内存使用、线程数)外,必须采集业务级指标,比如下单接口QPS、库存校验耗时、分布式锁等待时长。用OpenTelemetry自动注入Span,确保每个RPC调用都有TraceId透传。
- Redis层:重点看连接数、内存使用率、慢查询数量、主从同步延迟、evicted_keys(驱逐键数)。单节点内存超限或主从延迟突增,往往是雪崩前兆。
- MQ层(如Kafka/RabbitMQ):监控消费者积压量(Lag)、分区Offset落后情况、重试队列堆积、死信队列增长速率。积压不是静态值,要看单位时间变化趋势。
- 数据库层:不只是CPU和连接数,更要盯住慢SQL数量、锁等待时间、复制延迟(MySQL GTID差值或PostgreSQL WAL lag)、连接池等待队列长度。
- 基础设施层:磁盘inode使用率、swap in/out频率、网络丢包率、容器OOM事件。很多线上故障根源不在代码,而在资源耗尽却没被及时发现。
告警插件集成的实操要点
- 统一采集协议优先选OTLP:让所有组件(服务、中间件、主机)通过OpenTelemetry SDK或Exporter,以OTLP协议将Metrics/Logs/Traces发往Collector,避免各搞一套Agent。EMQX、Prometheus Node Exporter、Spring Boot Actuator都原生支持。
-
告警规则必须带上下文标签:比如
alert: RedisMemoryHigh不能只写redis_memory_used_percent > 90,而应加上for: 2m、labels: {severity: "warning", service: "order-service", env: "prod"},方便后续路由和静默。 - 告警分级不靠人工判断,靠数据联动:低优先级(如单实例CPU>80%)走企业微信;中优先级(如订单服务错误率>1%持续5分钟)加短信;高优先级(如支付服务全链路Trace失败率>5%且持续1分钟)直接电话+自动创建工单。
-
避免告警风暴的关键是抑制与聚合:用Alertmanager的
group_by: [alertname, service]合并同类告警;设置inhibit_rules,例如当“K8s节点NotReady”告警触发时,自动抑制该节点上所有Pod的CPU告警,防止误扰。 - 每个告警必须附带直达定位线索:在告警消息里嵌入Grafana跳转链接(带时间范围和变量),并自动附加最近3条相关错误日志摘要、该服务当前Top3慢接口TraceID、以及依赖服务健康状态快照。
不要忽略“静默故障”的监控盲区
有些问题不会立刻报错,但会悄悄劣化:比如Redis连接池长期满载但未超时、Kafka消费者心跳正常但实际消费速度下降、数据库查询计划突然走错索引导致响应变慢。这类问题需靠基线比对(如同比/环比波动超阈值)和异常检测模型(如Prometheus的anomaly()函数或Flink实时流计算)来捕获,不能只依赖静态阈值。
不复杂但容易忽略

















