4. 多租户模型设计:基于 Tenant ID 的隔离策略、数据平面与控制平面分离
在多租户可观测性架构中,核心挑战在于如何让多个租户共享同一套基础设施,同时保证数据隔离、资源公平和运维安全。本章聚焦于基于 Tenant ID 的隔离策略,以及将系统拆分为 数据平面 与 控制平面 的设计方法。
4.1 基于 Tenant ID 的隔离策略
Tenant ID 是贯穿整个可观测性管道的唯一租户标识。从数据采集、传输、存储到查询,每个环节都必须携带并校验该标识。常见的隔离粒度包括:
| 隔离层级 | 实现方式 | 隔离强度 | 资源开销 |
|---|---|---|---|
| 软隔离(逻辑隔离) | 在数据标签或属性中注入 tenant.id,查询时通过过滤器限制可见范围 |
低 | 低 |
| 硬隔离(物理隔离) | 为每个租户部署独立的 Collector、存储后端或索引表 | 高 | 高 |
| 混合隔离 | 控制平面共享,数据平面按租户分组或分片 | 中 | 中 |
推荐策略: 在大多数生产场景中,采用混合隔离模式。控制平面(配置管理、API 网关、认证授权)全局共享;数据平面(Collector、存储、查询)按租户或租户组进行逻辑或物理分片,以平衡隔离性与资源利用率。
4.2 数据平面与控制平面分离
将系统拆分为数据平面与控制平面,是多租户可观测性架构的关键设计原则。这种分离带来了以下好处:
- 故障隔离: 数据平面的故障(如 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 集群架构:
4.6 关键设计要点
- Tenant ID 注入点: 在 SDK 初始化、Collector 入口、API 网关三个位置强制注入或校验 Tenant ID,确保端到端链路完整。
- 控制平面无状态化: 控制平面组件应设计为无状态,便于水平扩展和故障转移。租户元数据存储在外部数据库(如 etcd 或 Redis)中。
- 数据平面健康检查: 控制平面应定期探测数据平面各组件的健康状态,当某个分片不可用时,自动将流量切换到备用分片或降级处理。
- 审计与计量: 在控制平面记录每个租户的数据量、查询次数和错误率,为后续的计费和容量规划提供依据。
实践建议: 在初期阶段,先实现软隔离 + 控制平面与数据平面分离,快速验证多租户模型。随着租户数量增长,逐步将高敏感度租户迁移到硬隔离分片,实现渐进式演进。