2. Jaeger 架构深度解析:核心组件与数据流
Jaeger 作为云原生链路追踪的事实标准,其架构设计遵循“采集-缓冲-处理-存储-查询”的经典管道模式。本章深入拆解 jaeger-agent、jaeger-collector、jaeger-query、jaeger-ingester 四大核心组件,并完整呈现一条 Span 从产生到可视化的全链路数据流。
2.1 整体架构总览
下图展示了 Jaeger 的典型部署拓扑,包含客户端 SDK、Agent、Collector、Ingester、存储后端及 Query 服务之间的数据流向。
2.2 核心组件详解
2.2.1 jaeger-agent:本地代理与数据缓冲
Agent 是部署在每台宿主机或 Pod 中的轻量级守护进程,主要职责包括:
- 接收 Span:通过 UDP(Thrift 协议)或 gRPC 接收来自 SDK 的 Span 数据。
- 数据压缩与批处理:将多个 Span 合并为更大的批次,减少网络连接次数。
- 服务发现:自动发现 Collector 集群地址,实现负载均衡。
- 自适应采样:配合 Collector 下发的采样策略,在本地执行概率采样或速率限制。
| 通信方式 | 协议 | 适用场景 | 性能特征 |
|---|---|---|---|
| UDP (Thrift) | Compact / Binary | 高吞吐、低延迟、可容忍少量丢包 | 极低 CPU 开销,无连接管理 |
| gRPC | Protobuf | 需要可靠传输、大 Span 或 TLS 加密 | 稍高 CPU,支持流式传输 |
2.2.2 jaeger-collector:无状态接收与处理枢纽
Collector 是 Jaeger 架构中的核心处理层,负责接收来自 Agent 或 SDK 直连的 Span 数据,执行以下操作:
- 数据校验:检查 Span 的 TraceID、SpanID、时间戳等必填字段是否合法。
- 采样决策:根据配置的采样策略(概率采样、速率限制、远程采样)决定是否保留该 Trace。
- 存储路由:将 Span 写入后端存储(Elasticsearch / Cassandra / Badger),或写入 Kafka 缓冲队列。
- 依赖分析:在内存中维护服务间调用关系的临时统计,定期刷新到存储。
Collector 为无状态设计,可通过水平扩展 Pod 副本数来提升吞吐量。典型部署会前置负载均衡器(如 Nginx / Envoy)或使用 Kubernetes Service 的轮询机制。
2.2.3 jaeger-ingester:Kafka 消费与批量写入
当引入 Kafka 作为缓冲层时,Ingester 组件负责从 Kafka Topic 中消费 Span 数据,并批量写入存储后端。其核心价值在于:
- 削峰填谷:应对业务突发流量,避免存储后端被瞬时写入压垮。
- 解耦采集与存储:Collector 只负责写入 Kafka,写入速度不受存储性能影响。
- 重试与容错:Kafka 提供持久化,Ingester 消费失败后可重新消费。
| 配置项 | 默认值 | 说明 |
|---|---|---|
| kafka.brokers | localhost:9092 | Kafka 集群地址 |
| kafka.topic | jaeger-spans | Span 数据写入的 Topic |
| ingester.flush-interval | 1s | 批量写入存储的时间间隔 |
| ingester.flush-bytes | 4MB | 触发批量写入的数据量阈值 |
2.2.4 jaeger-query:检索 API 与可视化 UI
Query 组件对外提供链路检索能力,包含两个核心接口:
- HTTP API:RESTful 接口,支持按 TraceID、服务名、标签、时间范围等条件查询。
- gRPC API:用于 Jaeger UI 后端与 Query 服务之间的高效通信。
Query 服务内嵌 Jaeger UI(React 前端),提供 Trace 详情页、服务拓扑图、性能分析等可视化能力。Query 本身也是无状态服务,可水平扩展以应对高并发查询。
2.3 完整数据流详解
一条 Span 从业务代码中产生到最终在 UI 上展示,经历以下完整路径:
2.4 组件对比与选型建议
| 组件 | 状态 | 水平扩展 | 关键依赖 | 推荐部署方式 |
|---|---|---|---|---|
| jaeger-agent | 有状态(本地缓存) | 随 Node 自动扩展 | 无 | DaemonSet / Sidecar |
| jaeger-collector | 无状态 | 支持(HPA) | 存储 / Kafka | Deployment + Service |
| jaeger-ingester | 有状态(消费偏移) | 支持(需分区) | Kafka | Deployment + 固定分区 |
| jaeger-query | 无状态 | 支持(HPA) | 存储 | Deployment + Service |
2.5 本章小结
Jaeger 的组件化设计实现了采集、处理、缓冲、存储、查询的职责分离。Agent 负责本地接入与压缩,Collector 负责无状态处理与路由,Kafka + Ingester 提供弹性缓冲,Query 负责检索与可视化。理解各组件的数据流与部署约束,是后续进行服务画像、配置发布和故障定位的基础。