← 中文资源

简体中文版本

多租户

多租户要求每条数据路径都携带租户身份,并通过行级安全、隔离模型和按租户配额控制越权与噪音邻居。

阅读英文原文

租户身份必须出现在每条路径

在共享池模型中,多个租户的行共处一张表。查询必须按租户过滤,而不只是按资源 id,否则用户猜中 id 就能读到其他租户的记录。同样的规则适用于缓存键、对象存储前缀、队列消息、搜索索引和分析导出。

ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON orders
  USING (tenant_id = current_setting('app.tenant_id')::uuid);

行级安全是有用的兜底,但它依赖会话设置正确。应用查询仍应包含租户谓词,让索引和执行计划显式可见。用两个租户和一个跨租户 id 测试,证明边界有效。

选择隔离模型

共享池租户最大化效率并减少按租户运维;独立租户提供强隔离和更简单的按租户备份恢复,但成本更高;桥接模型把租户分组到 schema 或数据库。选择取决于合同、法规、噪音邻居容忍度和数据泄露成本。混合模式可以把高价值租户放进专用基础设施,同时让长尾租户共享池。

保护共享容量

一个租户可能占满共享工作池、连接池或队列。要实施按租户配额、公平调度,并为昂贵操作设置隔离舱。监控按租户的延迟和错误率,而不只是聚合值;聚合仪表盘可能掩盖某个客户的故障。

何时使用

当许多客户可以共享基础设施且不违反隔离要求时,使用多租户。优点是成本与运维效率;代价是持续存在漏写租户过滤器的风险,以及噪音邻居效应。与单租户部署相比,共享池需要更强的自动化测试和清晰的隔离模型。