2. Jaeger 架构与组件:Agent、Collector、Query、UI、Storage 的角色与交互
Jaeger 作为云原生场景下最成熟的分布式追踪系统之一,其架构设计遵循“轻量采集 → 异步批处理 → 持久化存储 → 灵活查询”的经典管道模式。理解每个组件的职责与数据流,是值班期间快速定位“追踪数据丢失”“查询超时”“存储压力”等故障的前提。
2.1 整体架构总览
下图展示了 Jaeger 的核心组件及其数据流转路径。应用程序通过 Agent 上报 Span,Collector 校验并写入 Storage,Query 与 UI 提供检索能力。
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 个步骤。值班排查时,可以按此链路逐段验证。
- 应用端注入与发送:应用程序通过 Jaeger Client SDK 创建 Span,通过 UDP 协议发送到本地 Agent(默认端口 6831/6832)。
- Agent 批处理与转发:Agent 将收到的 Span 按 Collector 地址进行缓冲、压缩,通过 gRPC 或 Thrift 协议批量发送给 Collector。
- Collector 校验与存储:Collector 对 Span 进行合法性校验、采样过滤、Trace 组装,然后调用 Storage 后端的写入接口持久化数据。
- Query 读取与缓存:当用户通过 UI 发起查询时,Query 服务从 Storage 读取 Span 数据,按 TraceID 聚合后返回给 UI。
- 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 之间的交互时序。
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 丢弃。