什么是多租户模式?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是多租户模式?相关的知识,希望对你有一定的参考价值。
八百客的SaaS具有多租户模式的性能优势,不太明白什么是多租户模式。请帮忙解决一下迷惑。
低代码平台多租户模式可为集团下属各个机构开通企业域提供多租户服务,每个租户之间可以设定上下级关系,同时企业域可创建多级管理员,允许次级管理员独立维护子公司或子部门用户情况,对集团型企业大大缓解组织用户管理工作量压力。
参考技术A 多租户架构(Multi-tenancy)是一种软件开发架构,采用这种方式开发的应用软件,一个实例可以同时处理多个用户的请求;也就是说所有的应用共享一个高性能的server,成千上万的客户通过这个server访问应用,共享一套代码,同时又可以通过配置的方式改变特性。多租户构架作为SaaS的核心技术之一,是SaaS区别与传统软件模式的关键。目前,多租户架构已成为软件行业的一个口号,被广泛用于软件系统中。 参考技术B SaaS现在已成为一股潮流,它将颠覆传统的软件交付方式
其实从架构层面来分析,SaaS区别于传统技术的重要差别就是Multi-Tenant模式。多租户就是说多个租户共用一个实例,租户的数据既有隔离又有共享,说到底就是如何解决数据存储的问题。
现在SaaS Multi-Tenant在数据存储上存在三种主要的方案,分别是—
方案一:独立数据库
这是第一种方案,即一个Tenant一个Database(见图3-14),这种方案的用户数据隔离级别最高,安全性最好,但成本也高。
优点:
为不同的租户提供独立的数据库,有助于简化数据模型的扩展设计,满足不同租户的独特需求;如果出现故障,恢复数据比较简单。
缺点:
增大了数据库的安装数量,随之带来维护成本和购置成本的增加。
这种方案与传统的一个客户、一套数据、一套部署类似,差别只在于软件统一部署在运营商那里。如果面对的是银行、医院等需要非常高数据隔离级别的租户,可以选择这种模式,提高租用的定价。如果定价较低,产品走低价路线,这种方案一般对运营商来说是无法承受的。
方案二:共享数据库,隔离数据架构.即多个或所有租户共享Database,但一个Tenant一个Schema。
优点:
为安全性要求较高的租户提供了一定程度的逻辑数据隔离,并不是完全隔离;每个数据库可以支持更多的租户数量。
缺点:
如果出现故障,数据恢复比较困难,因为恢复数据库将牵扯到其他租户的数据;如果需要跨租户统计数据,存在一定困难。
方案三:共享数据库,共享数据架构.即租户共享同一个Database、同一个Schema,但在表中通过TenantID区分租户的数据。这是共享程度最高、隔离级别最低的模式。
优点:
三种方案比较,第三种方案的维护和购置成本最低,允许每个数据库支持的租户数量最多。
缺点:
隔离级别最低,安全性最低,需要在设计开发时加大对安全的开发量;数据备份和恢复最困难,需要逐表逐条备份和还原。如果希望以最少的服务器为最多的租户提供服务,并且租户接受以牺牲隔离级别换取降低成本,这种方案最适合。
CRM系统未来将以中低端市场为主,所以采用第三种方案,只要做好数据隔离比较好了。千万不可掉以轻心,SaaS下的安全性设计很重要。一般常见的安全性设计分为两类:系统级和程序级。
系统级:
使用HTTPS协议以SSL(Security Socket Layer)交换数据,增强通信安全;通过数字签名防止传输过程篡改;对用户身份识别的UserToken使用DES算法数据加密;业务数据定时自动备份。
程序级:
完整的权限配置,包括功能权限和数据权限;客户端输入校验,防止JS攻击、XSS攻击、SQL注入等;辅助安全设计,比如密码控件、图片验证码、手机确认码等。
参考资料:http://blog.csdn.net/broadview2006/archive/2008/11/27/3388480.aspx
本回答被提问者采纳何谓多租户模式 ?
原文:何谓多租户模式 ?一、什么是多租户模式
多租户模式的定义:单个产品实例为多个用户提供服务,同时用户可按需购买使用产品资源,用户数据相互隔离。
定义里的用户即租户,租户狭义上理解就是使用系统的人。广义上来说还应该包括创建的系统、数据等一切与当前租户有关的系统资源。
二、举个栗子
2.1 传统模式
假设我们有一个学生管理系统,有课程查询、成绩查询两个功能,每个学生都有账号可以登陆,使用系统中的这两个功能。然后我们把这个系统卖给很多个学校去使用,这时候需要给每个学校去部署一套系统。
2.2 多租户模式
还是上面的系统,结合第一章节的定义,我们看多租户模式下的系统架构,这时候我们只有一个学生管理系统实例,每个学校使用的时候首先以学校为单位进行租户创建,然后可以按需购买系统功能,比如只需要成绩查询,这里的每个学校就是一个租户。
三、几种数据隔离模式
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.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.2、3.3 则需要根据租户ID动态切换数据源,代码层面即获取不同的Connection,实现细节限于篇幅,此处不展开了。
五、总结
其实如果抛开商业模式来说,淘宝、京东包括我们常见的系统从技术架构上看都可以算是一种多租户系统,为什么?
因为首先是单实例可以支持多用户的,其次数据是可以根据用户ID隔离的(同第三章节「共享数据表,租户ID隔离」 模式)。
从整体架构上看又不是,为什么?首先不满足的是系统功能不是按需付费,像淘宝每个会员进去功能都是一样的,不能按需挑选功能,你说我不要订单功能,可能吗?显然不可能,你要不要订单功能就在那。另外功能免费。
还有就是商业模式的问题,不是将软件本身作为服务销售,还拿淘宝来说,它售卖的是淘宝上的商品,而不是淘宝软件本身的功能。所以模式上不是SAAS,严格上就不算多租户系统。
最后给大家一个公式,完整的多租户模式 = 多租户商业模式 + 多租户技术架构。
PS :可关注「风象南讲全栈」公众号,有机会成为作者微信私人好友
以上是关于什么是多租户模式?的主要内容,如果未能解决你的问题,请参考以下文章