2. Jaeger 架构与组件:Agent、Collector、Query、UI、Storage 的角色与交互

Jaeger 作为云原生场景下最成熟的分布式追踪系统之一,其架构设计遵循“轻量采集 → 异步批处理 → 持久化存储 → 灵活查询”的经典管道模式。理解每个组件的职责与数据流,是值班期间快速定位“追踪数据丢失”“查询超时”“存储压力”等故障的前提。

2.1 整体架构总览

下图展示了 Jaeger 的核心组件及其数据流转路径。应用程序通过 Agent 上报 Span,Collector 校验并写入 Storage,Query 与 UI 提供检索能力。

Jaeger 核心组件架构图 Jaeger 核心组件与数据流 应用程序 Jaeger Agent Jaeger Collector Storage 后端 Jaeger Query Jaeger UI 说明: Agent 通常以 DaemonSet 或 Sidecar 方式部署,与应用程序同节点;Collector 无状态可水平扩展;Storage 支持 Elasticsearch / Cassandra / Badger。

2.2 组件角色与职责

每个组件在追踪管道中承担明确的职责,值班排查时需要区分“哪个环节出了问题”。

组件 部署形态 核心职责 常见故障信号
Jaeger Agent DaemonSet / Sidecar 接收应用 UDP 上报的 Span,批量压缩后转发给 Collector Agent 端口不可达、UDP 丢包、转发延迟高
Jaeger Collector 无状态 Deployment 校验 Span、采样决策、构建 Trace、写入 Storage OOM、GC 频繁、写入背压、队列积压
Storage 后端 有状态集群 持久化 Span 与索引,支持按 TraceID/Service/Operation 检索 磁盘 I/O 高、分片失衡、查询超时、写入拒绝
Jaeger Query 无状态 Deployment 接收 UI 请求,从 Storage 读取 Trace 并组装返回 查询延迟飙升、连接池耗尽、结果不完整
Jaeger UI Web 服务 提供 Trace 搜索、Trace 详情瀑布图、服务依赖图 页面加载慢、API 超时、依赖图不更新

2.3 组件间交互流程

一次完整的追踪数据从产生到可视化,经历以下 5 个步骤。值班排查时,可以按此链路逐段验证。

  1. 应用端注入与发送:应用程序通过 Jaeger Client SDK 创建 Span,通过 UDP 协议发送到本地 Agent(默认端口 6831/6832)。
  2. Agent 批处理与转发:Agent 将收到的 Span 按 Collector 地址进行缓冲、压缩,通过 gRPC 或 Thrift 协议批量发送给 Collector。
  3. Collector 校验与存储:Collector 对 Span 进行合法性校验、采样过滤、Trace 组装,然后调用 Storage 后端的写入接口持久化数据。
  4. Query 读取与缓存:当用户通过 UI 发起查询时,Query 服务从 Storage 读取 Span 数据,按 TraceID 聚合后返回给 UI。
  5. UI 渲染与展示:UI 将 JSON 格式的 Trace 数据渲染为瀑布图、服务拓扑图、时间线等可视化视图。
值班提示: 如果发现“部分服务有追踪数据,部分没有”,优先检查 Agent 部署是否覆盖了所有节点,以及 Agent 与 Collector 之间的网络连通性。UDP 协议本身不保证可靠传输,高负载下丢包是常见原因。

2.4 Storage 后端选型对比

Jaeger 支持多种存储后端,生产环境最常用的是 Elasticsearch 和 Cassandra。选型直接影响查询性能、运维成本和故障模式。

维度 Elasticsearch Cassandra
数据模型 文档型,按索引分片 宽列存储,按 Partition Key 分布
查询能力 全文检索、聚合分析、DSL 灵活 仅支持按 TraceID / Service + 时间范围查询
写入性能 依赖分片数与 refresh 间隔,批量写入优 线性扩展,写入吞吐高且稳定
运维复杂度 需要管理分片、索引生命周期、滚动索引 需要管理节点拓扑、压缩策略、修复
典型故障 分片过多导致 GC 压力、索引写入拒绝 节点宕机后数据分布不均、Hinted Handoff 积压
注意: 如果使用 Elasticsearch 作为存储后端,务必配置索引生命周期管理(ILM),避免索引无限增长导致磁盘满或查询性能劣化。Cassandra 场景下,建议定期执行 nodetool repair 保证数据一致性。

2.5 组件交互时序图

下面以一次典型的 Trace 查询为例,展示 Query 与 Storage、UI 之间的交互时序。

Trace 查询交互时序图 Trace 查询交互时序 用户/UI Jaeger Query Storage 后端 GET /api/traces?service=...&limit=20 查询索引 / 读取 Span 数据 返回 Span 列表 / Trace 聚合结果 JSON Trace 数据 排查要点: 如果 UI 返回“查询超时”,先检查 Query 到 Storage 的网络延迟和 Storage 的查询队列深度;如果返回结果为空,检查 Collector 是否正常写入以及索引是否存在。

2.6 组件配置与端口速查

值班时经常需要检查端口监听状态或调整 Agent/Collector 参数。下表列出各组件的默认端口与常用配置项。

组件 默认端口 协议 关键配置项
Agent 6831 (UDP Thrift Compact)
6832 (UDP Thrift Binary)
5778 (HTTP 采样配置)
UDP / HTTP --collector.host-port
--processor.jaeger-compact.server-queue-size
Collector 14269 (HTTP 健康检查)
14250 (gRPC)
14267 (Thrift TChannel)
gRPC / Thrift / HTTP --span-storage.type
--es.server-urls
--collector.queue-size
Query 16686 (HTTP UI + API)
16687 (HTTP 健康检查)
HTTP --span-storage.type
--es.server-urls
--query.max-clock-skew-adjustment
UI 16686 (与 Query 同端口) HTTP 通过 Query 配置 --query.ui-config 指定菜单、搜索默认值
最佳实践: 生产环境建议将 Agent 的 --collector.host-port 配置为 Collector 的 gRPC 端点(端口 14250),并启用负载均衡。Collector 的 --collector.queue-size 默认值为 2000,高流量场景建议调整为 10000 以上,避免背压导致 Span 丢弃。