4. 多租户模型设计:基于 Tenant ID 的隔离策略、数据平面与控制平面分离

在多租户可观测性架构中,核心挑战在于如何让多个租户共享同一套基础设施,同时保证数据隔离、资源公平和运维安全。本章聚焦于基于 Tenant ID 的隔离策略,以及将系统拆分为 数据平面 与 控制平面 的设计方法。

4.1 基于 Tenant ID 的隔离策略

Tenant ID 是贯穿整个可观测性管道的唯一租户标识。从数据采集、传输、存储到查询,每个环节都必须携带并校验该标识。常见的隔离粒度包括:

隔离层级 实现方式 隔离强度 资源开销
软隔离(逻辑隔离) 在数据标签或属性中注入 tenant.id,查询时通过过滤器限制可见范围 低 低
硬隔离(物理隔离) 为每个租户部署独立的 Collector、存储后端或索引表 高 高
混合隔离 控制平面共享,数据平面按租户分组或分片 中 中
推荐策略: 在大多数生产场景中,采用混合隔离模式。控制平面(配置管理、API 网关、认证授权)全局共享;数据平面(Collector、存储、查询)按租户或租户组进行逻辑或物理分片,以平衡隔离性与资源利用率。

4.2 数据平面与控制平面分离

将系统拆分为数据平面与控制平面,是多租户可观测性架构的关键设计原则。这种分离带来了以下好处:

  • 故障隔离: 数据平面的故障(如 Collector 崩溃、存储延迟)不会影响控制平面的可用性,租户仍可进行配置变更。
  • 弹性伸缩: 数据平面可按租户流量独立扩缩,控制平面则按租户数量和管理请求扩缩。
  • 安全边界: 控制平面持有全局配置和认证密钥,数据平面仅处理带 Tenant ID 的遥测数据,降低横向移动风险。

下图展示了数据平面与控制平面的典型交互流程:

数据平面与控制平面分离架构 数据平面与控制平面分离架构 控制平面(全局共享) 租户管理 API 认证 / 授权 配置下发 租户元数据 数据平面(按租户隔离) OTel Collector 数据管道 存储分片 查询引擎 说明:控制平面下发租户配置和认证令牌,数据平面根据 Tenant ID 将遥测数据路由到对应的存储分片。 查询时,控制平面验证租户身份,数据平面仅返回该租户的数据。

4.3 Tenant ID 在 OTel 管道中的传递

在 OpenTelemetry 生态中,Tenant ID 通常通过 Resource 属性 或 Span/Log/Metric 属性 传递。推荐的做法是在 SDK 初始化阶段注入 tenant.id,并在 Collector 中通过处理器进行校验和路由。

以下是一个典型的 Collector 配置片段,展示如何基于 Tenant ID 进行数据路由:

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

processors:
  attributes/tenant:
    actions:
      - key: tenant.id
        action: extract
        pattern: ^.*$
  filter/tenant:
    error_mode: ignore
    traces:
      span:
        - 'attributes["tenant.id"] == nil'
    metrics:
      datapoint:
        - 'attributes["tenant.id"] == nil'
    logs:
      log_record:
        - 'attributes["tenant.id"] == nil'

exporters:
  otlp/tenant_a:
    endpoint: "storage-tenant-a:4317"
    headers:
      "x-tenant-id": "tenant-a"
  otlp/tenant_b:
    endpoint: "storage-tenant-b:4317"
    headers:
      "x-tenant-id": "tenant-b"

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [attributes/tenant, filter/tenant]
      exporters: [otlp/tenant_a, otlp/tenant_b]
注意: 如果租户 ID 缺失或无效,应使用 filter/tenant 处理器丢弃该数据,避免未授权数据进入存储层。同时,建议在 Collector 入口处记录告警日志,以便运维人员及时发现异常。

4.4 隔离策略对比与选型建议

下表总结了不同隔离策略在关键维度上的表现,帮助你在架构设计时做出选择:

维度 软隔离(逻辑) 硬隔离(物理) 混合隔离
数据隐私 依赖查询过滤,存在泄露风险 完全物理隔离,安全性最高 按敏感度分级,平衡安全与成本
运维复杂度 低,统一管理 高,每租户独立运维 中,需维护租户分组策略
资源利用率 高,共享资源池 低,资源碎片化 中,分组共享
故障爆炸半径 大,单点故障影响所有租户 小,故障仅影响单个租户 中,故障影响租户组
适用场景 开发测试环境、低敏感度业务 金融、医疗等强合规行业 大多数生产环境

4.5 数据平面内部隔离架构

在数据平面内部,可以进一步将隔离策略落实到 Collector 集群、存储后端和查询服务中。下图展示了一个基于 Tenant ID 分片的 Collector 集群架构:

基于 Tenant ID 分片的 Collector 集群 基于 Tenant ID 分片的 Collector 集群 入口网关(负载均衡) Collector 分片 A Tenant ID: 001-100 Collector 分片 B Tenant ID: 101-200 Collector 分片 C Tenant ID: 201-300 存储集群 A 索引表: tenant_001_100 存储集群 B 索引表: tenant_101_200 存储集群 C 索引表: tenant_201_300 说明:入口网关根据请求中的 Tenant ID 哈希值,将流量路由到对应的 Collector 分片。 每个 Collector 分片只处理特定范围的租户数据,并写入对应的存储集群。 当新增租户时,只需调整分片范围或增加新分片,不影响已有租户。

4.6 关键设计要点

  • Tenant ID 注入点: 在 SDK 初始化、Collector 入口、API 网关三个位置强制注入或校验 Tenant ID,确保端到端链路完整。
  • 控制平面无状态化: 控制平面组件应设计为无状态,便于水平扩展和故障转移。租户元数据存储在外部数据库(如 etcd 或 Redis)中。
  • 数据平面健康检查: 控制平面应定期探测数据平面各组件的健康状态,当某个分片不可用时,自动将流量切换到备用分片或降级处理。
  • 审计与计量: 在控制平面记录每个租户的数据量、查询次数和错误率,为后续的计费和容量规划提供依据。
实践建议: 在初期阶段,先实现软隔离 + 控制平面与数据平面分离,快速验证多租户模型。随着租户数量增长,逐步将高敏感度租户迁移到硬隔离分片,实现渐进式演进。