2. Jaeger 架构全景:组件与数据流详解

Jaeger 作为云原生场景下最流行的分布式追踪系统,其架构设计遵循“采集-存储-查询-可视化”的经典分层。理解各组件职责及数据流转路径,是定位慢查询、优化 SLI 口径的基础。

2.1 核心组件与职责

Jaeger 由四个主要组件构成,每个组件承担独立的可观测性职能:

组件 角色 核心职责 部署形态
Agent 边车代理 接收应用发出的 Span,批量压缩后转发给 Collector DaemonSet / Sidecar
Collector 数据管道 校验、聚合、写入后端存储;支持采样策略 Deployment(无状态)
Query 查询服务 从存储检索 Trace/Span,提供 gRPC/HTTP API Deployment(无状态)
UI 可视化 基于 Query API 展示 Trace 拓扑、火焰图、服务依赖 与 Query 同进程或独立部署
生产建议:Agent 推荐以 DaemonSet 模式部署在每台宿主机上,避免 Sidecar 模式带来的资源开销;Collector 和 Query 应配置 HPA,应对突发流量。

2.2 数据流全景

一条完整的 Trace 从应用发出到 UI 展示,经历以下四个阶段:

  1. 埋点生成:应用通过 Jaeger Client SDK 创建 Span,携带 TraceID、SpanID、ParentSpanID、OperationName、Tags、Logs。
  2. Agent 收集:Agent 通过 UDP 或 gRPC 接收 Span,进行协议缓冲(Thrift/Protobuf)压缩,批量发送至 Collector。
  3. Collector 处理:Collector 校验 Span 合法性,执行采样决策(头部采样/尾部采样),写入后端存储(Elasticsearch / Cassandra / Badger)。
  4. Query & UI 检索:用户通过 UI 发起查询,Query 服务从存储中按 TraceID、Service、Operation、Tags 检索,返回完整 Trace 树。
关键路径:慢查询定位的核心在于 Collector → 存储 阶段的写入延迟,以及 Query → 存储 阶段的检索延迟。这两个环节直接决定 Trace 的“端到端可见性延迟”。
Jaeger 数据流架构图 Jaeger 数据流架构图 应用服务 (Client SDK 埋点) Jaeger Agent (UDP/gRPC 收集) Collector (校验/采样/写入) 后端存储 (ES/Cassandra) Query 服务 (gRPC/HTTP API) Jaeger UI (可视化检索) 数据流说明: ① 应用通过 SDK 生成 Span → ② Agent 批量压缩转发 → ③ Collector 校验/采样/写入存储 ④ 用户通过 UI 发起查询 → Query 从存储检索 → 返回完整 Trace 树渲染

2.3 组件间通信协议

Jaeger 在不同组件之间使用多种协议,理解协议差异有助于排查数据丢失或延迟问题:

通信链路 默认协议 序列化格式 端口 注意事项
应用 → Agent UDP Thrift Compact 6831 / 6832 UDP 可能丢包,生产建议启用 gRPC
Agent → Collector gRPC Protobuf 14250 支持批量压缩,推荐生产使用
Collector → 存储 HTTP / gRPC JSON / Protobuf 9200 (ES) / 9042 (Cassandra) 写入延迟直接影响 Trace 可见性
Query → 存储 HTTP / gRPC JSON / Protobuf 9200 (ES) / 9042 (Cassandra) 检索性能决定 UI 响应速度
UI → Query HTTP JSON 16686 前端通过 REST API 调用
避坑提醒:Agent 默认使用 UDP 协议,当 Span 生成速率超过 10,000 spans/s 时,UDP 丢包率会显著上升。建议在 Collector 端开启 gRPC 接收,并将 Agent 配置为 gRPC 模式,同时增加 Collector 副本数。

2.4 采样策略与数据流影响

采样是 Jaeger 架构中控制数据量的关键机制,直接影响存储成本和慢查询定位的完整性:

  • 头部采样(Head-based):在 Trace 开始时决定是否采样,简单高效,但无法保证慢 Trace 被捕获。
  • 尾部采样(Tail-based):Collector 根据 Span 特征(如延迟 > 阈值)动态决定保留,适合慢查询定位,但增加 Collector 内存开销。
  • 概率采样:按固定百分比采样,适合低流量环境。
  • 速率限制采样:每秒最多采样 N 条 Trace,防止突发流量冲垮存储。
采样决策流程 采样决策流程 Span 流入 Collector 采样策略 写入存储 丢弃 Span 采样命中 采样未命中 采样策略配置位置: Collector 启动参数 --sampling.strategies-file 或通过 Jaeger UI 动态下发采样策略。

2.5 存储后端选型对比

存储是 Jaeger 架构中影响查询性能与运维复杂度的核心组件,不同场景推荐不同后端:

存储后端 适用场景 查询延迟 运维复杂度 数据保留策略
Elasticsearch 大规模生产环境,需要全文检索 中等(依赖索引优化) 高(需管理集群、ILM) ILM 自动轮转
Cassandra 写入密集型,需要高可用 低(按主键查询) 高(需管理节点、压缩) TTL 自动过期
Badger 单机测试、小规模演示 低(本地磁盘) 低(无需额外部署) 手动清理
Kafka + ES 超高吞吐,削峰填谷 中等(增加 Kafka 延迟) 极高(需维护 Kafka 集群) Kafka 保留 + ES ILM
SLI 口径优化关联:在后续章节中,我们将基于 Collector 写入存储的延迟(jaeger_collector_spans_written_latency)和 Query 检索延迟(jaeger_query_latency)来定义基础设施 SLI。存储选型直接影响这两个指标的基线值。

2.6 架构演进趋势

随着 OpenTelemetry 成为行业标准,Jaeger 架构也在持续演进:

  • Agent 弱化:OpenTelemetry Collector 可替代 Jaeger Agent,统一接收多种信号(Trace/Metric/Log)。
  • Collector 无状态化:通过 Kafka 作为缓冲层,Collector 可以完全无状态,便于弹性伸缩。
  • Query 与 UI 合并:Jaeger v2 正在探索将 Query 和 UI 合并为单一二进制,降低部署复杂度。
  • 存储抽象层:通过 gRPC 存储插件,支持更多后端(如 ClickHouse、S3)。