多租户配置
介绍
多租户(Multi-tenancy)是分布式追踪系统中的一个重要概念,它允许同一个Jaeger实例为多个独立的团队或项目(称为"租户")提供服务,同时保持各自数据的隔离性。对于初学者来说,可以将其想象为一栋公寓大楼:每个租户拥有自己的独立空间,共享相同的基础设施(如水电),但彼此的数据和资源互不干扰。
在Jaeger中实现多租户通常需要以下组件协同工作:
- 租户标识(如HTTP请求头)
- 存储后端支持(如Elasticsearch索引或Cassandra键空间)
- 查询服务的路由逻辑
何时需要多租户?
- 多个团队共享同一个Jaeger实例
- 需要满足不同部门的数据隔离需求
- 实现基于项目的访问控制
基础配置
1. 基于HTTP头的租户识别
Jaeger可以通过检查传入请求的HTTP头来确定租户。最常见的做法是使用 X-Scope-OrgId
头:
yaml
# jaeger-collector 配置示例
query:
multi-tenancy:
enabled: true
header: "X-Scope-OrgId"
2. 存储后端配置
不同的存储后端需要不同的多租户配置方式:
Elasticsearch 方案
yaml
storage:
type: elasticsearch
elasticsearch:
index-prefix: "jaeger-tenant-"
multi-tenancy:
enabled: true
这会为每个租户创建独立的索引,例如:
jaeger-tenant-teamA-*
jaeger-tenant-teamB-*
Cassandra 方案
yaml
storage:
type: cassandra
cassandra:
keyspace: "jaeger_tenant_{tenant}"
实际案例
场景:电商平台的多团队追踪
假设一个电商平台有三个团队:
- 订单服务团队
- 支付服务团队
- 推荐系统团队
每个团队在发送追踪数据时,需要在请求头中添加自己的租户标识:
go
// Go语言示例
func createTraces() {
req, _ := http.NewRequest("POST", jaegerCollectorURL, bytes.NewBuffer(traceData))
req.Header.Set("X-Scope-OrgId", "payments") // 支付团队标识
client := &http.Client{}
resp, _ := client.Do(req)
// 处理响应...
}
高级配置
租户特定的采样策略
可以为不同租户配置不同的采样率:
yaml
sampling:
strategies:
- service: "payment-service"
type: probabilistic
param: 0.1
tenant: "payments"
- service: "order-service"
type: probabilistic
param: 0.5
tenant: "orders"
跨租户查询(管理员功能)
注意
跨租户查询需要特殊权限,通常只应授予管理员
yaml
query:
multi-tenancy:
admin-access:
enabled: true
header: "X-Admin-Access"
总结
多租户配置是Jaeger在企业环境中部署的关键功能,它能够:
- 实现数据隔离与安全
- 优化资源利用率
- 简化多团队协作管理
扩展学习
-
实践练习:
- 在本地Jaeger实例中配置两个租户
- 使用不同租户标识发送追踪数据
- 验证数据是否被正确隔离
-
进一步阅读:
- Jaeger官方文档中的多租户章节
- OpenTelemetry中的租户标识最佳实践
- 分布式追踪系统的访问控制模型
-
常见问题排查:
- 确保所有组件(collector/query/agent)使用相同的租户配置
- 验证存储后端是否支持所需的隔离级别
- 检查HTTP头是否被中间件意外移除