何谓多租户模式 ?

1、什么是多租户模式sql

多租户模式的定义:单个产品实例为多个用户提供服务,同时用户可按需购买使用产品资源,用户数据相互隔离。数据库

定义里的用户即租户,租户狭义上理解就是使用系统的人。广义上来讲还应该包括建立的系统、数据等一切与当前租户有关的系统资源。微信

 

2、举个栗子架构

2.1 传统模式blog

假设咱们有一个学生管理系统,有课程查询、成绩查询两个功能,每一个学生都有帐号能够登录,使用系统中的这两个功能。而后咱们把这个系统卖给不少个学校去使用,这时候须要给每一个学校去部署一套系统。资源

 

2.2 多租户模式路由

仍是上面的系统,结合第一章节的定义,咱们看多租户模式下的系统架构,这时候咱们只有一个学生管理系统实例,每一个学校使用的时候首先以学校为单位进行租户建立,而后能够按需购买系统功能,好比只须要成绩查询,这里的每一个学校就是一个租户。开发

 

3、几种数据隔离模式部署

3.1 共享数据表,租户ID隔离产品

这种模式也是咱们平日里系统隔离用户使用的模式,既在表中加一个用户ID字段,多租户这里就是在表中多加一个租户ID字段进行数据区分,登录哪一个租户就经过ID查询到对应租户的数据。拿成绩表的查询SQL举例就是:

select * from t_score where tenantid = '租户的ID' 

 

3.2 共享数据库,Schema隔离

该模式就是共享一个数据库实例,而后根据租户创建多个Schema,以Mysql数据库为例,就是创建多个Mysql用户,每一个Mysql用户下都有完整的系统表。这里在系统开发时就须要根据租户动态进行数据源切换,获取对应租户的Schema。

 

3.3 独立数据库

该模式就是彻底独立数据库实例,还以Mysql数据库为例,就是装有不少个Mysql服务,每一个租户对应一个实例 ,每一个实例下具备相同的Schema和表 。这里也须要在系统开发时根据租户动态进行数据源切换,获取对应租户的数据库实例。

 

4、实现多租户系统的几个关键点

将一个传统模式的系统,改为多租户架构,大的方面来讲,只须要作好这两点便可实现,也是最关键的两点。

4.1 租户管理

上面3.1 给了一个SQL,这个SQL在实际开发时,会发现是不可用的,知足不了需求,为何呢?回到上面的学生管理系统,想一想看,学校管理员购买了一个租户系统,而具体使用系统的人是学生,是学生在查成绩,先想一个问题,学生的数据从哪来?

 

(1)学校管理员添加

也就是学校管理员建立了租户系统后,在后台经过学生添加功能进行学生信息录入,这不就有了学生信息了,也容易关联上租户ID,看着好像没有问题,咱们来捋一下执行过程。

学生访问系统 -> 输入帐号密码,点登录后 -> 3.1 模式由于数据源是一个,因此直接连上查t_student表 -> 对比用户名、密码 - > 找到且密码正确即认为登录成功。

例外状况1:假如学生张三由学校A转到了学校B,这时候学校A的租户和学校B的租户都有了张三的信息,这时候有两条数据,怎么比对?这时候就不对了,租户ID还没法肯定。这时候就须要下面的两种方案。

例外状况2:假如使用的是3.2 或 3.3 的数据隔离模式,至关于有多个数据源,这时候登录时链接哪个数据源查?这时候也就不对了。租户ID还没法肯定。这时候一样须要下面的两种方案。

 

(2)学生注册为租户

方式一:学校想添加学生A,能够输入学生A的邮箱地址,发送邀请,学生A收到邮件邀请,登录平台注册为租户(不建立系统),注册后自动进入发送邀请学校的学生库。

方式二:学生A直接登录平台注册为租户,学生A将注册信息提供给学校管理员,学校管理员添加到学生库。

存储租户的租户表自己是共享的。而后须要 「租户学生表」 (建立系统的租户ID,学生租户ID)

这时候登录并查询成绩流程就是:学生输入用户名、密码 -> 查询租户表 -> 登录成功 -> 查询租户学生表 -> 选择对应的租户学校 -> 进入租户系统首页 -> 查询成绩

 

(3)特定登录地址

即给每一个租户购买系统后,生成特定独有的登录地址,带有学校的租户ID,而后将登录地址共享给学生便可。这也能够解决租户ID没法肯定的问题。并且无需学生注册为租户。

 

4.2 数据路由

数据路由是数据隔离后的关键点,3.1 模式下即实现SQL的包装,作一层AOP,查询的时候在原来的SQL上附加

 where tenantid = '' and studentid = '' 

3.二、3.3 则须要根据租户ID动态切换数据源,代码层面即获取不一样的Connection,实现细节限于篇幅,此处不展开了。 

 

5、总结

其实若是抛开商业模式来讲,淘宝、京东包括咱们常见的系统从技术架构上看均可以算是一种多租户系统,为何?

由于首先是单实例能够支持多用户的,其次数据是能够根据用户ID隔离的(同第三章节「共享数据表,租户ID隔离」 模式)。

 

从总体架构上看又不是,为何?首先不知足的是系统功能不是按需付费,像淘宝每一个会员进去功能都是同样的,不能按需挑选功能,你说我不要订单功能,可能吗?显然不可能,你要不要订单功能就在那。另外功能免费。

还有就是商业模式的问题,不是将软件自己做为服务销售,还拿淘宝来讲,它售卖的是淘宝上的商品,而不是淘宝软件自己的功能。因此模式上不是SAAS,严格上就不算多租户系统。

 

最后给你们一个公式,完整的多租户模式 = 多租户商业模式 + 多租户技术架构。

 

PS  :可关注「风象南讲全栈」公众号,有机会成为做者微信私人好友

相关文章
相关标签/搜索