3. Tempo 部署模式:单体模式、微服务模式、Serverless 模式对比与适用场景

Grafana Tempo 支持三种部署模式:单体模式、微服务模式和Serverless 模式。不同模式在资源消耗、运维复杂度、扩展能力和成本结构上差异显著。选择哪种模式取决于你的追踪数据规模、SLA 要求以及基础设施成熟度。

3.1 三种部署模式架构总览

下图展示了三种部署模式的核心组件分布与网络边界。单体模式将所有进程打包为一个二进制;微服务模式按职责拆分为独立组件;Serverless 模式则将后端存储与查询层分离,利用函数计算处理无状态任务。

Tempo 三种部署模式架构对比 单体模式 tempo (单一进程) distributor + ingester + querier + compactor 后端存储 (S3/GCS/Azure) 微服务模式 distributor ingester querier compactor + query-frontend 后端存储 Serverless 模式 distributor + ingester Lambda (querier) Lambda (compactor) S3 对象存储 关键差异说明 • 单体模式:所有组件运行在同一个进程中,适合开发测试和小规模生产(< 100GB/天)。 • 微服务模式:每个组件独立部署,可单独扩缩容,适合中大规模生产(100GB ~ 10TB/天)。 • Serverless 模式:查询和压缩任务由 Lambda 函数执行,存储与计算分离,适合突发流量和低成本场景。 • 三种模式共享相同的后端存储抽象(S3/GCS/Azure Blob),数据格式完全兼容。 • 从单体模式迁移到微服务模式无需数据迁移,只需调整配置和部署拓扑。 • Serverless 模式目前仅支持 AWS Lambda,且查询延迟通常比常驻进程高 200~500ms。 • 推荐路径:开发测试用单体 → 小规模生产用微服务 → 大规模或成本敏感场景评估 Serverless。

3.2 三种模式详细对比

对比维度 单体模式 微服务模式 Serverless 模式
部署复杂度 低:单个二进制 + 配置文件 中:需编排多个服务(K8s 或 Nomad) 中高:需管理 Lambda 函数 + 事件触发
组件隔离 无隔离,一个组件 OOM 影响全局 完全隔离,故障域独立 查询/压缩无状态,写入组件仍为常驻
扩缩容粒度 整体扩缩,资源浪费 按组件独立扩缩,资源利用率高 查询层自动弹性,写入层需手动扩缩
查询延迟 低(进程内通信) 中低(gRPC 内网通信) 中高(Lambda 冷启动 + 网络开销)
运维成本 低:单进程监控 中:需监控多个服务 + 链路依赖 中:需管理 Lambda 日志 + 并发限制
适用数据规模 < 100 GB/天 100 GB ~ 10 TB/天 < 1 TB/天(查询量波动大)
典型场景 开发环境、POC、小团队 生产环境、多租户、高可用要求 成本敏感、查询频率低、突发流量

3.3 单体模式部署架构

单体模式将所有 Tempo 内部组件打包为一个进程,适合快速验证和小规模场景。所有组件共享内存和 CPU,配置简单,但缺乏隔离性。

单体模式部署架构 应用 / 服务 Tempo 单体进程 distributor | ingester | querier | compactor 对象存储 单体模式配置示例 (tempo.yaml) target: all # 启动所有组件 distributor: receivers: otlp: protocols: grpc: 4317 http: 4318
实践建议:单体模式适合每日追踪数据量小于 100GB 的场景。如果使用 Docker Compose 部署,建议设置内存限制(如 --memory=4g)防止 ingester 组件占用过多内存导致 OOM。单体模式下,target: all 是默认配置,但也可以指定 target: scalable-single-binary 启用无状态写入模式。

3.4 微服务模式部署架构

微服务模式将 distributor、ingester、querier、compactor、query-frontend 拆分为独立部署单元。每个组件可以独立扩缩容,适合生产环境。通常使用 Kubernetes 部署,每个组件对应一个 Deployment 或 StatefulSet。

组件 职责 扩缩容策略 资源需求
distributor 接收追踪数据,进行哈希分片和负载均衡 水平扩展(无状态) CPU 密集型,2~4 核
ingester 将追踪数据写入后端存储,构建内存索引 水平扩展(有状态,需持久化) 内存密集型,8~32 GB
querier 从存储中读取数据并执行查询 水平扩展(无状态) CPU + 内存均衡,4~8 核
compactor 合并小文件,清理过期数据 单实例或少量实例 CPU 密集型,2~4 核
query-frontend 查询缓存、分片、合并结果 水平扩展(无状态) 内存密集型,4~8 GB
注意:微服务模式下,ingester 组件是有状态的,需要配置持久卷(PVC)来存储 WAL 文件。如果 ingester 重启后 WAL 丢失,会导致最近几分钟的追踪数据不可用。建议为 ingester 配置 ingester.lifecycler.ring.store: consul 或 etcd 来管理成员状态。

3.5 Serverless 模式部署架构

Serverless 模式将查询和压缩任务卸载到 AWS Lambda 函数中执行,写入组件(distributor + ingester)仍然作为常驻服务运行。这种模式适合查询频率低、成本敏感的场景,但查询延迟会因 Lambda 冷启动而增加。

组件 部署方式 触发方式 注意事项
distributor 常驻服务(ECS / K8s) 持续运行 需要配置 Lambda 作为后端存储
ingester 常驻服务(ECS / K8s) 持续运行 WAL 写入 S3 或 EFS
querier (Lambda) AWS Lambda 函数 API Gateway / ALB 触发 冷启动延迟 200~500ms,建议预留并发
compactor (Lambda) AWS Lambda 函数 S3 事件通知触发 执行时间限制 15 分钟,大文件需分片
成本对比参考:以每日 500GB 追踪数据、每月查询 10 万次为例:单体模式约 $800/月(4 台 8 核 32GB 实例),微服务模式约 $1200/月(6~8 个 Pod),Serverless 模式约 $500/月(常驻 2 台实例 + Lambda 按量计费)。Serverless 模式在查询量低时成本优势明显,但查询量超过 50 万次/月后,微服务模式更经济。

3.6 模式选择决策树

根据你的实际需求,可以按照以下决策树选择部署模式:

  1. 数据量 < 100 GB/天 且 查询量 < 1 万次/天? → 单体模式(最简单,运维成本最低)
  2. 数据量 100 GB ~ 10 TB/天 或 需要高可用? → 微服务模式(隔离性好,扩缩容灵活)
  3. 数据量 < 1 TB/天 且 查询频率低 且 成本敏感? → Serverless 模式(按量付费,无需常驻查询资源)
  4. 已有 AWS 基础设施且希望减少运维? → Serverless 模式(Lambda + S3 原生集成)
  5. 需要多租户隔离或跨区域部署? → 微服务模式(每个租户独立 querier 或独立 ingester)
迁移路径:推荐从单体模式开始,当数据量增长到 100 GB/天时,切换到微服务模式。Tempo 的配置结构在两种模式之间高度兼容,只需将 target: all 改为 target: <component> 并调整网络配置即可。Serverless 模式适合作为查询层的补充,例如将历史数据查询卸载到 Lambda,常驻服务只处理最近 7 天的热数据。