SaaS多租户数据隔离

租户给SaaS平台付租金就能使用平台提供的功能服务。

隔离方案

  • 一个租户一个数据库,或者将一群租户统一放在一个数据库里

    一个租户一个数据库,此时SaaS系统需要连接多个数据库,这种实现方案其实就和分库分表架构设计是一样的,好处就是数据隔离级别高、安全性好,毕竟一个租户单用一个数据库,但是物理硬件成本,维护成本也变高了。

  • 共享数据库、不同的数据表:独立的表空间

    所有租户共用一个数据库系统,但是每个租户在数据库系统中拥有一个独立的表空间。Schema隔离使用PostgreSQL来实现非常简单,因为他天生支持这种方式,具体可以去PostgreSQL了解。

  • 共享数据库、共享数据表:按租户id字段隔离租户(使用较多)

    最简单的数据隔离方法,即在每张表中都添加一个用于区分租户的字段(如tenant_id或org_id啥的)来标识每条数据属于哪个租户,当进行查询的时候每条语句都要添加该字段作为过滤条件,其特点是所有租户的数据全都存放在同一个表中,数据的隔离性是最低的,完全是通过字段来区分的,很容易把数据搞串或者误操作。

隔离方案成本支持租户数量优点缺点
独立数据库系统数据隔离级别高,安全性,可以针对单个租户开发个性化需求数据库独立安装,物理成本和维护成本都比较高
独立的表空间较多提供了一定程度的逻辑数据隔离,一个数据库系统可支持多个租户数据库管理比较困难,表繁多,同时数据修复稍复杂
按租户id字段区分维护和购置成本最低,每个数据库能够支持的租户数量最多隔离级别最低,安全性也最低

实现方案

  1. mybatis-plus
  2. mybatis-flex
  3. 基于mybatis拦截器统一处理表的路由

其他

如果应用规模进一步扩大,租户数量在持续增加,应用服务器层和数据库层都在持续地水平扩展。但是由于其彼此之间没有任何对应关系,导致所有的应用服务器要与所有的数据库服务器关联(以m 台应用服务器和n 台数据库服务器为例,它们之间的关联有 mxn 个,也是就是每台应用服务器至少要有n个数据库链接 )。

所有的应用服务器不应该是完全平等的,应该与数据库服务器对应。也就是说,不同的租户可能不仅有不同的应用服务器,还有可能有不同的数据库服务器。每组应用服务器都仅连接对应的数据库服务器。

Last Updated:
Contributors: 拔土豆的程序员