saas系统多租户数据隔离的实现(一)数据隔离方案

0. 前言

前几天跟朋友聚会的时候,朋友说他们公司准备自己搞一套saas系统,以实现多个第三方平台的业务接入需求。聊完以后,实在手痒难耐,于是花了两天时间自己实现了两个saas系统多租户数据隔离实现方案。俗话说“独乐乐不如众乐乐”,所以我把我的“研究成果”写出来,让大家乐呵乐呵。

在分享我的研究成果之前,我们先了解一下相关的定义吧。如果对这部分内容熟悉的同学,可以直接略过。

 

1. 什么是saas系统

引用百度百科上面的描述, “SaaS平台是运营saas软件的平台。SaaS提供商为企业搭建信息化所需要的所有网络基础设施及软件、硬件运作平台,并负责所有前期的实施、后期的维护等一系列服务,企业无需购买软硬件、建设机房、招聘IT人员,即可通过互联网使用信息系统。SaaS 是一种软件布局模型,其应用专为网络交付而设计,便于用户通过互联网托管、部署及接入。”

也就是说,我只需要能连接上互联网,并且给saas平台交租金,我就能用saas平台给我提供的系统服务。这方面最典型的例子就是各种云平台,例如阿里云。既然我能通过互联网使用saas平台提供的服务,那么其他人当然也是可以的。于是这就产生了一个多租户的问题。

 

2. 什么是多租户

多租户问题,简单来说,是一种架构设计方式,就是在一台或者一组服务器上运行的saas系统,可以为多个租户(客户)提供服务,目的是为了让多个租户在互联网环境下使用同一套程序,且保证租户间的数据隔离。从这种架构设计的模式上,不难看出来,多租户架构的重点就是同一套程序下多个租户数据的隔离。由于租户数据是集中存储的,所以要实现数据的安全性,就是看能否实现对租户数据的隔离,防止租户数据不经意或被他人恶意地获取和篡改。

 

3. 数据隔离方案 

目前saas多租户系统的数据隔离有三种解决方案,即为每个租户提供独立的数据库、独立的表空间、按字段区分租户,每种方案都有其各自的适用情况。下面我们依次讲解这3种方案。

3.1 每个租户提供独立的数据库系统

这种方案的实现方式是所有租户共享同一个应用,但应用后端会连接多个数据库系统,一个租户单独使用一个数据库系统。这种方案的用户数据隔离级别最高,安全性最好,租户间的数据能够实现物理隔离。但成本较高。

 

 

 

 

3.2 每个租户提供独立的表空间

这种方案的实现方式,就是所有租户共享同一个应用,应用后端只连接一个数据库系统,所有租户共享这个数据库系统,每个租户在数据库系统中拥有一个独立的表空间。

 

 

 

 

3.3 按租户id字段区分租户

这种方案是多租户方案中最简单的设计方式,即在每张表中都添加一个用于区分租户的字段(如租户id或租户代码)来标识每条数据属于哪个租户,其作用很像外键。当进行查询的时候每条语句都要添加该字段作为过滤条件,其特点是所有租户的数据全都存放在同一个表中,数据的隔离性是最低的,完全是通过字段来区分的。

 

 

4. 三种数据隔离方案的优劣势分析

隔离方案

成本

支持租户数量

优点

不足

独立数据库系统 隔离级别最高,安全性最好,能够满足不同租户的独特需求,出现故障时恢复数据比较容易 数据库需要独立安装,维护成本和购置成本高
共享数据库,独立表空间 较多 提供了一定程度的逻辑数据隔离,一个数据库系统可支持多个租户 出现故障的情况下,数据恢复相对而言比较复杂
按租户id字段区分 非常多 维护和购置成本最低,每个数据库能够支持的租户数量最多 隔离级别最低,安全性也最低,数据备份和恢复非常复杂,需要逐表逐条备份和还原

 

5. 为土豪准备的解决方案

前面咱们说的那三种数据隔离解决方案,都是多个租户共享一个应用实例的。如果你是土豪,非常的不差钱,那这里就还有一种一个租户一个应用实例的解决方案,直接为土豪量身定制,纯24k钛合金的。

 

这种方案是在多实例系统的基础上进行负载均衡,将租户的访问请求路由到其专属的租户系统上去。这种多实例的部署架构,可以为每个租户定制代码,以及提供特色服务。当然,使用这种解决方案提供服务的租户,那也肯定不差钱,能负担高额租金的“大客户”了。

 

总结

saas系统中需要解决的最核心的问题是租户的数据隔离问题,我们看到解决这个问题有好几种方式,这就需要我们在业务场景中去根据实际情况进行选择。

下一篇文章,我们就来看一下,如何根据租户id字段来实现同一张表中不同租户的数据的crud(即增删改查)。提前剧透一下,我们将使用 springboot + mybatis plus 来实现这种数据隔离方案。

 

参考资料

https://www.mingzhe.org/blog/2017/08/01/multiple-tenants-architecture-introduction/

posted @ 2020-02-18 12:30  DarJeely  阅读(5456)  评论(0编辑  收藏  举报