SaaS多租户数据隔离
租户给SaaS平台付租金就能使用平台提供的功能服务。
隔离方案
一个租户一个数据库,或者将一群租户统一放在一个数据库里
一个租户一个数据库,此时SaaS系统需要连接多个数据库,这种实现方案其实就和分库分表架构设计是一样的,好处就是数据隔离级别高、安全性好,毕竟一个租户单用一个数据库,但是物理硬件成本,维护成本也变高了。
共享数据库、不同的数据表:独立的表空间
所有租户共用一个数据库系统,但是每个租户在数据库系统中拥有一个独立的表空间。Schema隔离使用PostgreSQL来实现非常简单,因为他天生支持这种方式,具体可以去PostgreSQL了解。
共享数据库、共享数据表:按租户id字段隔离租户(使用较多)
最简单的数据隔离方法,即在每张表中都添加一个用于区分租户的字段(如tenant_id或org_id啥的)来标识每条数据属于哪个租户,当进行查询的时候每条语句都要添加该字段作为过滤条件,其特点是所有租户的数据全都存放在同一个表中,数据的隔离性是最低的,完全是通过字段来区分的,很容易把数据搞串或者误操作。
隔离方案 | 成本 | 支持租户数量 | 优点 | 缺点 |
---|---|---|---|---|
独立数据库系统 | 高 | 少 | 数据隔离级别高,安全性,可以针对单个租户开发个性化需求 | 数据库独立安装,物理成本和维护成本都比较高 |
独立的表空间 | 中 | 较多 | 提供了一定程度的逻辑数据隔离,一个数据库系统可支持多个租户 | 数据库管理比较困难,表繁多,同时数据修复稍复杂 |
按租户id字段区分 | 低 | 多 | 维护和购置成本最低,每个数据库能够支持的租户数量最多 | 隔离级别最低,安全性也最低 |
实现方案
- mybatis-plus
- mybatis-flex
- 基于mybatis拦截器统一处理表的路由
其他
如果应用规模进一步扩大,租户数量在持续增加,应用服务器层和数据库层都在持续地水平扩展。但是由于其彼此之间没有任何对应关系,导致所有的应用服务器要与所有的数据库服务器关联(以m 台应用服务器和n 台数据库服务器为例,它们之间的关联有 mxn 个,也是就是每台应用服务器至少要有n个数据库链接 )。
所有的应用服务器不应该是完全平等的,应该与数据库服务器对应。也就是说,不同的租户可能不仅有不同的应用服务器,还有可能有不同的数据库服务器。每组应用服务器都仅连接对应的数据库服务器。