在SaaS系统中,多租户是个基本功能了,就是你服务的每一个公司有一个自己的租户,系统要同时支持多个租户一起使用,并且他们之间要互相隔离。
SaaS多租户的实现方案主要涉及数据隔离和资源共享的平衡。
最常见的方案就是共享数据库,然后通过租户id来做逻辑隔离。
即所有租户共享同一数据库和Schema,通过tenant_id字段区分不同租户的数据。每条记录均包含tenant_id,应用层在查询时自动附加WHERE tenant_id = ?条件。这个方案是最常见的,因为他足够简单,只需要加个字段就行了。但是缺点是他只是逻辑隔离,存在数据泄露的风险,并且多个租户共用一个数据库,可能会存在互相影响的情况。比如某个租户数据量大、请求量大可能占用一些公共的数据库资源。
那么,好一点的方案是共享数据库,独立分区(分表)。
每个租户在同一个数据库中拥有独立分区(分表)。应用层根据租户标识动态切换分区(分表)。这个方案就比在一个数据库同一个分区中要好一点,因为至少大家是不同的分区,数据在物理上是隔离开的。但是他还是有一个瓶颈,那就是大家用的还是同一个数据库,单数据库连接数还是可能成为瓶颈。
那么,进一步的方案就是独立数据库。
每个用户拥有独立的数据库实例,应用层通过用户标识路由到对应数据库连接。这么做就是完完全全的物理隔离,大家数据也不在一起,底层用到的硬件资源也都不在一起,完全做到互相不影响。但是缺点就是贵。。。
但是实际很多公司,并不一定要采用一套固定的方案,有可能采用混合模式。
比如根据用户规模或需求动态选择隔离级别,针对小型用户,大家共用一个公共数据库,对于一些大客户,VIP客户,给他独立的分区,对于一些数据安全性要求比较高,受监管,愿意给更多钱的用户,给他独立部署。
方案对比:
| 方案 | 隔离性 | 扩展性 | 成本 | 适用场景 |
|---|---|---|---|---|
| 共享数据库,租户id逻辑隔离 | 低 | 低 | 低 | 小型应用,快速试错 |
| 共享数据库,独立分区(分表) | 中 | 中 | 中 | 中等规模,需一定隔离性 |
| 独立数据库 | 高 | 高 | 高 | 高安全性需求(金融、医疗) |
| 混合模式 | 灵活 | 高 | 中高 | 租户规模差异大 |
SaaS多租户实现方案解析
9057

被折叠的 条评论
为什么被折叠?



