3. Tempo 部署模式:单体模式、微服务模式、Serverless 模式的选择与对比

Grafana Tempo 支持三种部署模式:单体模式 (Single Binary)、微服务模式 (Microservices) 和 Serverless 模式。选择哪种模式取决于你的追踪数据规模、运维团队能力、成本预算以及弹性需求。本章将深入对比这三种架构,帮助你为值班台选择最合适的部署方案。

值班台建议: 对于大多数中小规模团队(日处理追踪数据 < 5TB),单体模式是性价比最高的起点。当数据量持续增长或需要独立扩缩容特定组件时,再平滑迁移至微服务模式。

3.1 三种模式架构总览

下图展示了三种部署模式的组件边界与通信关系。核心组件(Distributor、Ingester、Querier、Compactor)在所有模式中均存在,但部署密度和网络拓扑不同。

Tempo 三种部署模式架构对比 Tempo 三种部署模式架构对比 单体模式 Tempo (单一进程) Distributor Ingester Querier Compactor Query Frontend 所有组件运行在同一个进程中 共享内存与 CPU 资源 微服务模式 独立部署的微服务 Distributor Ingester Querier Compactor Query Frontend 每个组件独立部署 可独立扩缩容 通过 gRPC/HTTP 通信 需要服务发现 (K8s Service) Serverless 模式 无服务器函数 Distributor Ingester Querier Compactor Query Frontend 组件作为 Lambda/FaaS 运行 按调用次数计费 自动从 0 扩展到 N 适合极低负载或突发流量

3.2 核心差异对比表

下表从运维、性能、成本和扩展性四个维度,对三种模式进行详细对比:

对比维度 单体模式 微服务模式 Serverless 模式
部署复杂度 极低:单进程部署,无外部依赖 高:需管理多个服务、服务发现、负载均衡 中:需配置云函数触发器与权限
资源隔离 无隔离:组件争抢 CPU/内存 完全隔离:每个组件独立资源 函数级隔离:冷启动可能影响延迟
扩缩容粒度 整体扩缩:无法单独扩容 Ingester 组件级:可独立扩容 Ingester/Querier 函数级:自动弹性,粒度最细
运维成本 低:单一日志/监控/告警 高:需监控多个服务实例 中:依赖云厂商基础设施
查询延迟 低:进程内通信无网络开销 中:gRPC 网络延迟约 1-5ms 高:冷启动 + 网络延迟可达 100ms+
成本模型 固定:按实例付费,空闲时浪费 固定:按组件实例付费 按需:按调用次数和时长计费
适用规模 日处理 < 5TB,节点数 < 10 日处理 5TB-50TB,节点数 10-100 日处理 < 1TB 或突发流量场景
典型场景 开发测试、中小团队生产环境 大型生产环境、多租户场景 边缘追踪、低频查询、事件驱动

3.3 单体模式详解

单体模式将所有 Tempo 组件打包到一个二进制文件中运行,是上手最快、运维最简单的部署方式。

3.3.1 配置示例

# tempo-single.yaml
target: all  # 启动所有组件
server:
  http_listen_port: 3200

distributor:
  receivers:
    otlp:
      protocols:
        grpc:
          endpoint: 0.0.0.0:4317

ingester:
  lifecycler:
    ring:
      kvstore:
        store: inmemory  # 单体模式使用内存存储环信息

storage:
  trace:
    backend: s3
    s3:
      bucket: tempo-traces
      endpoint: s3.amazonaws.com
    pool:
      max_workers: 100

compactor:
  compaction:
    block_retention: 48h

3.3.2 适用条件

  • 数据量:日处理追踪数据 < 5TB
  • 节点数:Ingester 副本数 < 10
  • 团队规模:运维人员 < 3 人
  • 可用性要求:允许分钟级故障恢复
注意: 单体模式下,所有组件共享进程资源。如果 Ingester 因内存压力 OOM,会导致 Distributor、Querier 同时不可用。建议为单体模式配置 cgroup 内存限制,并设置合理的 GOMEMLIMIT 环境变量。

3.4 微服务模式详解

微服务模式将每个 Tempo 组件部署为独立服务,是生产环境最常用的部署方式。每个组件可以独立扩缩容、独立配置资源限制。

3.4.1 组件通信架构

下图展示了微服务模式下各组件的网络拓扑与数据流:

Tempo 微服务模式组件通信架构 Tempo 微服务模式组件通信架构 负载均衡器 (LB) Distributor (x2) Ingester 集群 (x3, 带复制因子) 对象存储 (S3/GCS) Query Frontend Querier (x2) Compactor (x1) 说明:Distributor 负责接收追踪数据并转发给 Ingester;Querier 从 Ingester 和对象存储查询数据;Compactor 负责合并后端存储中的块

3.4.2 关键配置参数

# tempo-microservices.yaml
# 每个组件使用独立的配置文件,以下为 Ingester 示例
target: ingester

ingester:
  lifecycler:
    ring:
      kvstore:
        store: consul  # 生产环境使用 Consul/Etcd
        consul:
          host: consul:8500
      replication_factor: 3  # 数据复制因子

storage:
  trace:
    backend: s3
    s3:
      bucket: tempo-traces
      endpoint: s3.amazonaws.com

overrides:
  max_traces_per_user: 100000

3.5 Serverless 模式详解

Serverless 模式将 Tempo 组件部署为云函数(如 AWS Lambda、Google Cloud Functions),适合极低负载或突发流量场景。该模式通过 Tempo Serverless 项目实现,将 Ingester、Querier 等组件包装为函数。

3.5.1 架构特点

  • 零闲置成本:无流量时函数不运行,不产生费用
  • 自动弹性:流量突增时自动创建数百个函数实例
  • 冷启动延迟:首次调用或长时间空闲后,函数启动需 1-5 秒
  • 有状态限制:Ingester 需将数据持久化到外部存储,无法利用本地磁盘

3.5.2 适用场景

场景 说明 推荐模式
开发/测试环境 低负载、非持续运行 单体模式
中小规模生产 日处理 1-5TB,团队运维能力有限 单体模式
大规模生产 日处理 > 5TB,需要组件级扩缩容 微服务模式
边缘/物联网 间歇性上报,流量波动极大 Serverless 模式
事件驱动追踪 基于 CI/CD 事件触发追踪 Serverless 模式

3.6 模式选择决策树

以下决策树可以帮助你快速确定最适合的部署模式:

  1. 数据量是否 < 5TB/天?
    • 是 → 进入第 2 步
    • 否 → 选择 微服务模式
  2. 是否有专职 SRE 团队?
    • 是 → 选择 微服务模式(为未来扩展预留空间)
    • 否 → 进入第 3 步
  3. 流量是否高度突发?
    • 是 → 选择 Serverless 模式
    • 否 → 选择 单体模式
值班台最佳实践: 建议从单体模式开始,使用 Docker Compose 或单节点 Kubernetes Deployment 部署。当 Ingester 的 CPU 使用率持续超过 70% 或内存使用率超过 80% 时,考虑迁移到微服务模式。迁移过程可以逐步进行:先独立部署 Distributor 和 Ingester,再逐步分离 Querier 和 Compactor。

3.7 迁移路径建议

从单体模式迁移到微服务模式时,建议遵循以下步骤:

阶段 操作 风险等级
1. 准备 将后端存储从 inmemory 切换到 S3/GCS;配置 Consul/Etcd 作为 KV 存储 低
2. 分离 Distributor 将 Distributor 部署为独立服务,指向原有的 Ingester 地址 低
3. 分离 Ingester 将 Ingester 部署为独立 StatefulSet,配置复制因子 中
4. 分离 Querier 将 Querier 部署为独立 Deployment,配置查询路径 低
5. 分离 Compactor 将 Compactor 部署为独立 Deployment,配置压缩策略 低
6. 优化 调整各组件资源限制、配置 HPA 自动扩缩容 低

选择正确的部署模式是 Tempo 运维的第一步。单体模式提供最低的运维成本,微服务模式提供最佳的扩展性和隔离性,Serverless 模式则适合极低负载或突发流量场景。值班台应根据实际数据规模和团队能力,选择最合适的模式,并规划好未来的迁移路径。