2. Jaeger 架构深度解析:组件、数据流与部署模式
在生产环境中落地分布式追踪,首先需要理解 Jaeger 的架构设计。本章将深入拆解 Jaeger 的四大核心组件(Agent、Collector、Query、UI),分析端到端的数据流,并对比 All-in-one 与 Production 两种部署模式的适用场景与配置要点。
2.1 核心组件与职责
Jaeger 遵循“客户端-代理-收集器-存储-查询”的经典链路。每个组件职责清晰,可独立扩展。
| 组件 | 角色 | 关键职责 | 通信协议 |
|---|---|---|---|
| Jaeger Client | 应用内嵌库 | 创建 Span、注入/提取上下文、采样决策 | Thrift / gRPC |
| Jaeger Agent | 本地守护进程 | 接收 Client 数据、批处理、转发至 Collector | UDP (Thrift) / HTTP |
| Jaeger Collector | 后端服务 | 验证、清洗、存储 Span;支持采样策略下发 | gRPC / HTTP |
| Jaeger Query | API 服务 | 提供查询 API、聚合 Trace、服务依赖图 | HTTP / gRPC |
| Jaeger UI | Web 前端 | 可视化 Trace 搜索、Span 详情、火焰图 | HTTP (Query API) |
| Storage Backend | 持久化层 | 支持 Cassandra、Elasticsearch、Kafka + 后端 | — |
架构要点: Agent 作为“边车”进程,通过 UDP 接收 Client 数据,避免阻塞应用主线程。Collector 是无状态服务,可通过 Kafka 做缓冲层,应对流量尖峰。
2.2 端到端数据流
一次完整的 Trace 从应用发起请求开始,到 UI 展示结束。下图展示了标准生产环境的数据流转路径。
性能关键路径: Agent → Collector 段使用 gRPC 流式传输,减少连接开销。如果 Collector 成为瓶颈,优先扩容 Collector 实例或引入 Kafka 缓冲。
2.3 部署模式对比
Jaeger 提供两种官方部署模式:All-in-one 用于开发测试,Production 用于生产环境。下表从多个维度进行对比。
| 维度 | All-in-one | Production |
|---|---|---|
| 组件形态 | 单进程包含 Agent + Collector + Query + UI + 内存存储 | 各组件独立部署,可水平扩展 |
| 存储 | 内存 (Badger) / 临时文件 | Cassandra / Elasticsearch / Kafka + 后端 |
| 持久化 | 重启丢失 | 持久化存储,支持长期查询 |
| 采样管理 | 静态配置 | 动态采样策略,支持远程配置 |
| 高可用 | 单点故障 | 多副本 + 负载均衡 |
| 适用场景 | 本地开发、功能验证、Demo | 生产环境、大规模集群、SLA 保障 |
| 启动复杂度 | 一条命令 | 需部署多个服务 + 存储 + 配置 |
避坑提醒: 切勿在生产环境使用 All-in-one 模式。内存存储无法持久化,且单进程无法承载高吞吐。生产环境至少需要 Collector + Query + 外部存储三件套。
2.4 生产部署架构图
下面展示一个典型的生产部署架构,包含多副本 Collector、Kafka 缓冲层、Elasticsearch 集群以及负载均衡器。
2.5 组件通信协议与端口
在生产环境中配置防火墙或 Service Mesh 时,需要明确各组件使用的端口与协议。
| 通信方向 | 协议 | 默认端口 | 说明 |
|---|---|---|---|
| Client → Agent | UDP (Thrift) | 6831 / 6832 | 批量发送 Span,低延迟 |
| Client → Collector | gRPC / HTTP | 14250 / 14268 | 直连模式,跳过 Agent |
| Agent → Collector | gRPC | 14250 | 推荐生产使用 gRPC 流 |
| Collector → Storage | HTTP / gRPC | 9200 (ES) / 9042 (Cassandra) | 取决于后端存储 |
| Query → Storage | HTTP / gRPC | 同上 | 读取 Trace 数据 |
| UI → Query | HTTP | 16686 | 浏览器访问端口 |
性能调优建议: 如果 Agent 与 Collector 之间网络延迟较高,可增大 Agent 的批处理大小(
--jaeger.agent.batch-size)和发送间隔(--jaeger.agent.batch-timeout),减少网络往返次数。
2.6 本章小结
Jaeger 的架构设计体现了分布式系统组件化的最佳实践:
- Agent 作为轻量级代理,将采样与传输逻辑从应用中剥离。
- Collector 无状态设计,支持水平扩展和缓冲层集成。
- Query + UI 提供标准 API 和可视化界面,便于问题定位。
- All-in-one 适合开发调试,Production 模式必须使用外部存储和组件分离。
掌握这些组件及其数据流,是后续进行采样策略配置、性能调优和 SLI 口径设计的基础。