✅SaaS系统中,多租户如何实现?

✅SaaS系统中,多租户如何实现?

典型回答

在SaaS系统中,多租户是个基本功能了,就是你服务的每一个公司有一个自己的租户,系统要同时支持多个租户一起使用,并且他们之间要互相隔离。

SaaS多租户的实现方案主要涉及数据隔离和资源共享的平衡

最常见的方案就是共享数据库,然后通过租户id来做逻辑隔离。


即所有租户共享同一数据库和Schema,通过tenant_id字段区分不同租户的数据。每条记录均包含tenant_id,应用层在查询时自动附加WHERE tenant_id = ?条件。这个方案是最常见的,因为他足够简单,只需要加个字段就行了。但是缺点是他只是逻辑隔离,存在数据泄露的风险,并且多个租户共用一个数据库,可能会存在互相影响的情况。比如某个租户数据量大、请求量大可能占用一些公共的数据库资源。

那么,好一点的方案是共享数据库,独立分区(分表)。


每个租户在同一个数据库中拥有独立分区(分表)。应用层根据租户标识动态切换分区(分表)。这个方案就比在一个数据库同一个分区中要好一点,因为至少大家是不同的分区,数据在物理上是隔离开的。但是他还是有一个瓶颈,那就是大家用的还是同一个数据库,单数据库连接数还是可能成为瓶颈。

那么,进一步的方案就是独立数据库


每个租户拥有独立的数据库实例,应用层通过租户标识路由到对应数据库连接。这么做就是完完全全的物理隔离,大家数据也不在一起,底层用到的硬件资源也都不在一起,完全做到互相不影响。但是缺点就是贵。。。

但是实际很多公司,并不一定要采用一套固定的方案,有可能采用混合模式


比如根据租户规模或需求动态选择隔离级别,针对小型租户,大家共用一个公共数据库,对于一些大客户,VIP客户,给他独立的分期,对于一些数据安全性要求比较高,受监管,愿意给更多钱的用户,给他独立部署。

方案对比

方案 隔离性 扩展性 成本 适用场景
共享数据库,租户id逻辑隔离 小型应用,快速试错
共享数据库,独立分区(分表) 中等规模,需一定隔离性
独立数据库 高安全性需求(金融、医疗)
混合模式 灵活 中高 租户规模差异大