4. 数据隔离模式全景对比:独立数据库、共享数据库独立Schema、共享库共享表、混合模式
4.1 模式概述与边界定义
多租户数据隔离的核心矛盾在于:隔离安全性与资源利用率之间的动态平衡。业界归纳出四种主流模式,每种模式划定了租户数据的逻辑与物理边界:
| 模式 | 物理边界 | 逻辑边界 | 典型场景 |
|---|---|---|---|
| 独立数据库 | 每个租户独占一个数据库实例或数据库 | 数据库级 | 金融、医疗等强合规行业 |
| 共享数据库独立Schema | 共用一个数据库实例,每个租户拥有独立Schema | Schema级 | 中型SaaS,租户数100~1000 |
| 共享库共享表 | 所有租户共用同一数据库、同一表集合 | 行级(tenant_id列) | 超大规模低成本SaaS,租户万级+ |
| 混合模式 | 按租户等级或业务域混合使用上述模式 | 动态分层边界 | 大型平台、分级定价或高合规客户定制 |
4.2 分层架构与组件职责
无论哪种模式,数据访问层均需插入租户路由中间件,该组件负责将租户标识解析为物理存储位置。下表给出各层关键职责:
| 层次 | 组件 | 职责说明 |
|---|---|---|
| 接入层 | 租户识别器 | 从请求Header/Token/域名提取tenant_id |
| 路由层 | 数据源路由器 | 根据元数据表将tenant_id映射到具体数据库/Schema/表 |
| 执行层 | 查询拦截器 | 在SQL前追加过滤条件(共享表模式)或动态切换连接(独立模式) |
| 元数据层 | 租户配置库 | 存储租户与数据源的映射关系、连接串、密钥 |
| 审计层 | 隔离校验器 | 定期扫描是否发生跨租户数据泄露(仅共享模式) |
4.3 数据流 / 控制流 / 信任链路
- 数据流:租户操作 → 应用层SQL → 路由层读取元数据 → 执行层切换/加条件 → 存储层返回结果 → 应用层清理上下文。
- 控制流:租户上下文注入(Filter/Interceptor)→ 数据源选择器根据tenant_id查映射表 → 建立连接/重写SQL → 执行并返回。
- 信任链路:独立数据库 信任边界在数据库连接层面,数据库用户隔离;共享Schema 信任边界依赖Schema级权限;共享表 完全依赖应用层正确的tenant_id过滤,风险最高。
关键约束:共享表模式中,所有SQL必须显式带
WHERE tenant_id = ?,且该条件不能被用户输入覆盖。4.4 四模式内联SVG框架图
解读:混合模式并非第四种隔离方式,而是将前三种按租户等级或业务域组合的架构策略。上图中独立DB区域用蓝色表示安全性最高,共享表区域用红色示意风险最高。
4.5 选型权衡关键点
- 收入 vs 成本:大客户(高合规要求)用独立DB,中小客户用共享Schema,免费层用共享表——这是混合模式最常见的落地形态。
- 租户数量级:低于100租户可全量独立,100~5000用共享Schema,超万级必须引入共享表以防止连接数爆炸。
- 隔离强度需求:金融、政务场景必须独立DB;企业级SaaS可接受Schema级;消费级SaaS可接受行级。
- 运维能力:独立DB需要自动化创建/备份/监控脚本,否则DBA将成为瓶颈。
4.6 风险点
1. 共享表模式的SQL注入危害放大:若tenant_id字段被篡改,所有租户数据暴露。必须使用参数化查询,ORM框架中禁止拼接tenant_id。
2. 共享Schema模式下的Schema名冲突:动态建Schema时需使用统一命名规范,如
tenant_${tenant_id},避免特殊字符。3. 混合模式的路由逻辑爆炸:多个数据源切换时,事务管理、分布式查询、全局锁都变得复杂,需引入分布式事务协调器或放弃跨库事务。
4. 独立数据库模式的备份风暴:同时备份数百个数据库会导致I/O雪崩,建议使用快照式备份并错峰执行。
4.7 落地步骤
- 步骤一:租户分级 建立租户等级(免费/标准/专业/企业),确定各等级采用的隔离模式。
- 步骤二:元数据设计 创建租户配置表,存储tenant_id、模式类型、数据库连接串、Schema名称。
- 步骤三:路由中间件开发 实现DatasourceRouter接口,根据租户配置动态选择数据源/重写SQL。
- 步骤四:隔离验证 开发自动化测试用例,模拟跨租户访问并断言阻断。
- 步骤五:数据迁移工具 对于从共享表升级为独立DB的租户,提供不停机迁移脚本。
- 步骤六:监控与告警 采集各数据源连接数、QPS、延迟,当单库租户数接近阈值时触发扩容建议。
4.8 验收标准
| 验收项 | 验收方法 | 通过条件 |
|---|---|---|
| 租户数据隔离 | 租户A的API key访问租户B的数据 | 返回403或空结果 |
| 路由准确率 | 所有租户的CRUD分别记录目标库/表 | 100%匹配元数据分配 |
| 动态模式切换 | 将某个租户从共享表升级为独立DB | 切换后数据完整,无丢失 |
| 性能基线 | 共享表模式P99查询延迟 | 不超过独立DB模式的1.5倍 |
| 运维自动化 | 新租户注册后自动创建对应数据隔离单元 | 30秒内完成创建并返回 |