2、多租户架构基础:SaaS多租户概念、租户模型、ThingsBoard中的租户层级结构
2.1 SaaS多租户核心概念
多租户(Multi-Tenancy)是SaaS(Software as a Service)架构的基石。它允许单个软件实例同时服务于多个独立的租户(Tenant),每个租户在逻辑上拥有完全隔离的数据、配置和用户体系,但共享同一套底层基础设施与应用程序代码。
关键定义: 租户 ≠ 用户。一个租户代表一个组织、企业或业务单元,可以包含成百上千个用户。数据隔离是租户之间的硬边界,租户A无法访问租户B的任何数据。
2.2 多租户数据隔离模型对比
根据隔离粒度与成本,主流的多租户模型分为以下三种。ThingsBoard 默认采用独立数据库(Isolated Database)与共享数据库+独立Schema的混合策略,确保租户间数据强隔离。
| 隔离模型 | 数据存储方式 | 隔离强度 | 运维成本 | 适用场景 |
|---|---|---|---|---|
| 独立数据库 | 每个租户拥有独立的物理/虚拟数据库实例 | 最高 | 高(备份、扩容按租户管理) | 金融、医疗、高合规要求企业 |
| 共享数据库 + 独立Schema | 同一数据库实例,每个租户拥有独立的表空间/Schema | 高 | 中(共享实例,逻辑隔离) | ThingsBoard 默认推荐模式 |
| 共享数据库 + 共享表 | 所有租户数据存放在同一张表中,通过 tenant_id 字段区分 | 低 | 低(最节省资源) | 低安全要求、内部工具、POC验证 |
ThingsBoard 实践: 在 ThingsBoard 中,每个租户的数据(设备、资产、告警、遥测)在数据库层通过
tenant_id 进行物理或逻辑隔离。系统管理员可以按需为不同租户分配不同的数据库实例(PostgreSQL/TimescaleDB/Cassandra),实现混合部署。
2.3 ThingsBoard 三层租户层级结构
ThingsBoard 的权限体系围绕系统管理员 → 租户 → 客户三层模型构建。每一层拥有不同的管理边界与可见范围,形成严格的树形数据隔离。
2.4 各层级职责与权限边界
理解每一层的职责是进行租户管理的前提。下表总结了系统管理员、租户、客户的核心能力与限制。
| 层级 | 核心职责 | 可管理资源 | 不可操作项 |
|---|---|---|---|
| 系统管理员 | 平台全局运维、租户生命周期管理 | 所有租户、系统设置、邮件模板、OAuth2、全局告警 | 不能直接管理租户内部的设备与客户数据 |
| 租户 | 自有业务运营、设备接入、规则链编排 | 设备、资产、仪表板、规则链、告警、客户账户 | 不能查看其他租户数据,不能修改系统级配置 |
| 客户 | 查看被授权的设备状态与仪表板 | 被分配的设备、仪表板、告警(只读或受限操作) | 不能创建设备、修改规则链、管理用户 |
2.5 租户模型中的关键实体关系
在 ThingsBoard 的数据模型中,租户是所有业务实体的根容器。以下列表展示了租户与核心实体之间的从属关系:
- 租户 → 设备: 一个租户可以拥有无限数量的设备(受许可证限制),设备通过
tenant_id归属。 - 租户 → 资产: 资产(如建筑、生产线)同样属于租户,用于对设备进行逻辑分组。
- 租户 → 仪表板: 仪表板是租户级别的可视化工具,可以共享给客户。
- 租户 → 规则链: 规则链处理租户内所有设备的数据流,租户之间规则链完全隔离。
- 租户 → 客户: 租户可以创建多个客户账户,每个客户只能看到被授权的设备与仪表板。
常见误区: 不要将“客户”视为最终用户。在 ThingsBoard 语境中,客户是租户的下级组织单位,通常代表租户的终端客户或分支机构。真正的平台使用者(如设备操作员)是客户下的用户(Customer User)。
2.6 租户数据隔离的底层实现
ThingsBoard 通过实体ID前缀与数据库查询过滤器实现数据隔离。每个实体(设备、资产、仪表板等)的 UUID 中嵌入了租户标识,所有数据库查询自动附加 tenant_id = ? 条件,确保跨租户数据无法泄露。
-- 示例:查询当前租户下的所有设备(伪代码)
SELECT * FROM device
WHERE tenant_id = '当前租户的UUID'
AND customer_id IS NULL OR customer_id = '当前客户UUID';
-- 系统管理员视角:可以查询所有租户的设备
SELECT * FROM device; -- 仅限系统管理员角色
性能提示: 在共享数据库模式下,务必为
tenant_id 字段建立索引。ThingsBoard 默认在 PostgreSQL 中为所有核心表的 tenant_id 列创建了 B-tree 索引,确保多租户查询不会导致全表扫描。
2.7 租户层级结构总结
多租户架构是 ThingsBoard 平台安全性与可扩展性的核心。通过系统管理员 → 租户 → 客户三层模型,平台实现了:
- 强数据隔离: 租户之间数据完全不可见,满足企业级安全合规要求。
- 灵活授权: 租户可以自主创建客户并分配资源,无需系统管理员介入。
- 水平扩展: 每个租户可以独立扩容(如分配独立数据库实例),不影响其他租户。
- 运维简化: 系统管理员只需管理租户生命周期,无需关注租户内部业务细节。