4、SLI采集链路全景:采集端(Agent/Exporter)、传输层(协议/队列)、处理层(聚合/降采样)、存储层(时序数据库)

SLI 数据从目标系统到 SLO 自愈引擎,需要经过一条完整的采集链路。链路中任何一个环节的故障或性能瓶颈,都会导致 SLI 数据失真、延迟甚至丢失,进而触发错误的自愈决策。本章从采集端、传输层、处理层、存储层四个维度,拆解 SLI 采集链路的全貌。

4.1 采集端:Agent 与 Exporter

采集端是 SLI 数据的源头,负责从目标系统(应用、中间件、基础设施)中提取原始指标。根据采集模式的不同,主要分为 Agent 模式和 Exporter 模式。

对比维度 Agent 模式 Exporter 模式
部署方式 作为独立进程或 Sidecar 部署在目标主机上 作为应用内嵌模块或独立进程暴露 HTTP 端点
数据拉取 主动推送(Push)到采集网关或后端 被动拉取(Pull),由 Prometheus 等系统定期抓取
典型工具 Telegraf、Fluentd、Datadog Agent Prometheus Exporter(node_exporter、redis_exporter)
适用场景 动态环境、短生命周期任务、需要认证的指标 稳态服务、标准协议暴露、大规模集群
SLI 风险 Agent 崩溃导致数据断流,需配置本地缓冲 Exporter 响应超时导致抓取失败,需设置超时重试
SRE 实践建议: 对于核心 SLI(如请求延迟、错误率),建议采用 Agent + Exporter 双通道采集。Agent 负责高可靠推送,Exporter 提供标准化拉取接口,两者互为备份,避免单点采集失效。

4.2 传输层:协议与队列

传输层负责将采集端的数据安全、可靠、低延迟地送达处理层。协议选择决定了传输效率与兼容性,队列机制决定了抗压能力与数据完整性。

4.2.1 传输协议对比

协议 传输方式 压缩 可靠性 典型场景
HTTP/HTTPS 请求-响应 gzip 应用层 ACK Exporter 拉取、Agent 推送
gRPC 双向流 Snappy 流控 + 重试 高吞吐、低延迟采集
Kafka 发布-订阅 LZ4/Zstd 持久化 + 副本 大规模解耦、异步缓冲
UDP 无连接 无 无确认 内部网络、可容忍丢包

4.2.2 队列缓冲策略

传输层必须引入队列来应对采集峰值和下游抖动。常见的队列策略包括:

  • 内存队列: 低延迟,但进程重启会丢失数据。适用于可容忍少量丢包的 SLI。
  • 磁盘缓冲队列: 基于 WAL(Write-Ahead Log)或 LevelDB,重启后恢复。适用于关键 SLI。
  • 外部消息队列(Kafka/RabbitMQ): 完全解耦,支持多消费者。适用于跨团队、跨数据中心的 SLI 汇聚。
常见陷阱: 内存队列无限制增长会导致 OOM。必须设置最大队列长度和背压(Backpressure)机制。当队列满时,优先丢弃低优先级 SLI,而非全部拒绝。

4.3 处理层:聚合与降采样

处理层是 SLI 链路的“大脑”,负责将原始指标转换为可用于 SLO 计算的聚合数据。核心操作包括聚合(Aggregation)和降采样(Downsampling)。

4.3.1 聚合策略

聚合类型 计算方式 SLI 示例 窗口
时间窗口聚合 固定时间窗口内求和/平均 每分钟请求总数 1m / 5m / 10m
滑动窗口聚合 持续移动的时间窗口 最近 5 分钟错误率 5m / 30m / 1h
分位数聚合 T-Digest / HDR Histogram P99 延迟 10m / 1h
计数聚合 Counter 累加 / Gauge 快照 在线 Pod 数量 实时

4.3.2 降采样策略

降采样用于减少存储量和查询延迟,但必须保证 SLI 精度不丢失。常见策略:

  • Last 降采样: 保留窗口内最后一个值。适用于变化缓慢的指标(如内存使用率)。
  • Avg 降采样: 保留窗口内平均值。适用于平稳指标(如 CPU 负载)。
  • Min/Max 降采样: 保留窗口内极值。适用于告警检测(如最大延迟)。
  • Count 降采样: 保留窗口内数据点数。适用于判断数据完整性。
SLO 自愈关键: 降采样粒度必须与 SLO 窗口对齐。例如,SLO 窗口为 5 分钟,降采样粒度应 ≤ 1 分钟,否则自愈剧本无法感知窗口内的突发错误。

4.4 存储层:时序数据库

存储层是 SLI 数据的最终归宿,决定了查询性能、数据保留策略和自愈剧本的实时性。主流时序数据库(TSDB)包括 Prometheus、VictoriaMetrics、TimescaleDB、InfluxDB。

4.4.1 存储层关键特性对比

特性 Prometheus VictoriaMetrics TimescaleDB InfluxDB
存储引擎 TSDB(自研) LSM-Tree + 列式 PostgreSQL 分区 TSM(自研)
压缩比 1:5 ~ 1:10 1:10 ~ 1:20 1:3 ~ 1:5 1:5 ~ 1:15
查询延迟 低(内存索引) 极低(倒排索引) 中(SQL 优化) 低(内存缓存)
高可用 Thanos / Cortex 内置集群 PG 流复制 企业版
SLI 场景 原生 PromQL,适合实时告警 兼容 PromQL,适合大规模 复杂 SQL 分析,适合历史趋势 Flux 查询,适合 IoT

4.4.2 数据保留与降采样联动

存储层必须与处理层的降采样策略联动,形成分层存储:

  • 热数据(最近 7 天): 原始粒度(10s ~ 1m),用于实时自愈剧本。
  • 温数据(7 ~ 30 天): 1m 降采样,用于短期趋势分析。
  • 冷数据(30 天以上): 10m ~ 1h 降采样,用于月度 SLO 报告。
存储成本优化: 对于非核心 SLI,可以设置更短的保留期(如 3 天)或更高的降采样粒度(如 1h)。核心 SLI 必须保留原始粒度至少 7 天,以支持自愈剧本的精确回放。

4.5 采集链路全景图

下图展示了 SLI 从采集端到存储层的完整链路,以及各层之间的数据流和关键组件。

SLI 采集链路全景图 SLI 采集链路全景图 采集端 Agent (Push) Exporter (Pull) 本地缓冲队列 传输层 HTTP / gRPC Kafka 队列 磁盘缓冲 / WAL 处理层 聚合 (Sum/Avg/P99) 降采样 (Last/Min/Max) 数据清洗 / 去重 存储层 TSDB 热/温/冷 分层存储 数据流方向:采集端 → 传输层 → 处理层 → 存储层 每层均需配置监控告警,确保 SLI 链路可观测 采集端关键指标 采集成功率 采集延迟 (P99) 队列积压量 传输层关键指标 传输吞吐量 重试率 / 丢包率 端到端延迟 处理层关键指标 聚合延迟 降采样数据量 数据丢弃率 存储层关键指标 写入延迟 查询延迟 磁盘使用率 自愈剧本触发点 处理层聚合结果 → 触发 SLO 评估 → 自愈剧本执行 存储层查询结果 → 触发历史趋势分析 → 自愈剧本优化

4.6 链路优化要点总结

基于全景图,SRE 团队在优化 SLI 采集链路时应重点关注以下要点:

  1. 采集端冗余: 核心 SLI 使用 Agent + Exporter 双通道,避免单点故障。
  2. 传输层缓冲: 引入 Kafka 或磁盘队列,应对采集峰值和下游抖动。
  3. 处理层精度: 降采样粒度必须 ≤ SLO 窗口的 1/5,确保自愈剧本感知突发。
  4. 存储层分层: 热/温/冷分层存储,平衡查询性能与存储成本。
  5. 全链路监控: 每层都暴露关键指标(延迟、吞吐、错误率),形成采集链路的可观测性。
SRE 自愈黄金法则: 采集链路的可靠性必须高于被监控系统的可靠性。如果采集链路本身不可靠,SLO 自愈剧本将基于错误数据做出错误决策,导致“误自愈”或“漏自愈”。建议为采集链路设置独立的 SLO(如采集成功率 ≥ 99.9%,端到端延迟 ≤ 30s)。