多租户模型

Posted 田攀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多租户模型相关的知识,希望对你有一定的参考价值。

 

真正意义上的SaaS一定是多租户的,但是多租户根据隔离程度的不同又分为不同模式。

 

多租户根据隔离程度和共享程度分为三种模型,其实就是在共享程度与隔离程度的权衡选择。

共享程度越高,租户成本自然越低,技术实现难度越高,运维难度越大。

隔离程度越高,租户成本自然越高,技术实现难度越低,运维难度越低。

 

三种多租户模式

第一个示例使用每租户的独立应用程序和其自己的数据库。 

第二个示例使用多租户应用,并且每个租户都具有一个数据库。 

第三个示例使用多租户应用,并且具有分片式多租户数据库。

三种模型,从左向右,资源共享程度依次变高,当然成本也就逐步下降,但与之带来的就是技术难度也在大幅增加。

Standalone APP :“每租户一个独立应用程序”模式

“每租户一个独立应用程序”模式使用单个租户应用程序,并且每个租户具有一个数据库。 每个租户的应用,包括其数据库,均部署到单独的资源组。 可在服务提供商的订阅或租户的订阅中部署资源组,并由提供程序代表租户进行管理。 每租户独立应用程序模式提供了最佳的租户隔离,但是它的经济成本通常是最高的,因为无法跨多个租户共享资源。 此模式非常适合于较为复杂并部署到较小数量的租户的应用程序。 相较其他模式,使用独立部署,能够更轻松地为每个租户自定义应用程序。

Database per Tenant:“每个租户一个数据库”模式

“每个租户一个数据库”模式适用于注重租户隔离并想要运行集中式服务以经济高效地使用共享资源的服务提供商。 将为每个场所或租户创建数据库,并集中管理所有数据库。 数据库可以托管在弹性池中,以便可以均衡无法预测的租户工作负载模式,轻松并经济高效地进行性能管理。目录数据库将保管租户与其数据库之间的映射。 使用弹性数据库客户端库的分片映射管理功能管理此映射,从而为应用程序提供高效的连接管理功能。

Sharded Multi-tenant:分片式多租户数据库模式

多租户数据库适用于希望降低每个租户的成本并可接受租户隔离性降低的服务提供商。 此模式可将大量租户封装到单个数据库,从而降低每个租户的成本。 可以通过跨多个数据库将租户分片来实现几乎无限制的缩放。 目录数据库将租户映射到数据库。

此模式还可实现混合模型,在此模型中可以通过将多个租户置于一个数据库中来优化成本,或通过将单个租户置于他们自己的数据库中来优化隔离。 在预配租户时或在此之后,可以根据租户做出选择,并且不会影响此应用程序。 如果需要以不同的方式处理不同租户组,使用此模式可获得良好效果。 例如,可将低成本租户分配到共享数据库,而将高级租户分配到其自己的数据库。

 

 

 

多租户技术实现

通用的多租户,从 SaaS 角度讲,多租户牵涉到多个层面:底层硬件、操作系统、应用服务器、数据层、应用代码等。每个层面的虚拟化策略,甚至是没有任何虚拟化仅仅是逻辑上的分离策略,都是这个架构的一部分。

 

多租户的设计牵涉到两层:

  • 数据

  • 应用 / 平台

 

数据层的多租户

数据层的三种多租户架构:

 

1、独立数据库

2、共享数据库、独立 Schema

3、共享数据库、共享 Schema、共享数据表

独立数据库是一个租户独享一个数据库实例,它提供了最强的分离度,租户的数据彼此物理不可见,备份与恢复都很灵活;共享数据库、独立 Schema 将每个租户关联到同一个数据库的不同 Schema,租户间数据彼此逻辑不可见,上层应用程序的实现和独立数据库一样简单,但备份恢复稍显复杂; 最后一种模式则是租户数据在数据表级别实现共享,它提供了最低的成本,但引入了额外的编程复杂性(程序的数据访问需要用 tenantId 来区分不同租户),备份与恢复也更复杂。这三种模式的特点可以用一张图来概括:

 

三种部署模式的异同

上图所总结的是一般性的结论,而在常规场景下需要综合考虑才能决定那种方式是合适的。例如,在占用成本上,认为独立数据库会高,共享模式较低。但如果考虑到大租户潜在的数据扩展需求,有时也许会有相反的成本耗用结论。

 

而多租户采用的选择,主要是成本原因,对于多数场景而言,共享度越高,软硬件资源的利用效率更好,成本也更低。但同时也要解决好租户资源共享和隔离带来的安全与性能、扩展性等问题。毕竟,也有客户无法满意于将数据与其他租户放在共享资源中。

 

参考

多租户 SaaS 数据库租户模式

https://docs.microsoft.com/zh-cn/azure/sql-database/saas-tenancy-app-design-patterns

企业级PAAS平台-多租户

https://blog.csdn.net/u013407595/article/details/34440435

使用 IBM 中间件实现 SaaS 解决方案

https://www.ibm.com/developerworks/cn/webservices/ws-middleware/

使用 IBM 中间件实现 SaaS 解决方案,第 2 部分: 启用多租户的方法

http://www.uml.org.cn/soa/200909102.asp

从定制开发,到多租户架构 ¦ 看SAAS 的4级成熟度模型

https://www.jianshu.com/p/a401f951d560

浅析多租户在 Java 平台和某些 PaaS 上的实现

https://www.ibm.com/developerworks/cn/java/j-lo-mutiltenancy/index.html

数据层的多租户浅谈

https://www.ibm.com/developerworks/cn/java/j-lo-dataMultitenant/

 

以上是关于多租户模型的主要内容,如果未能解决你的问题,请参考以下文章

彻底理解微商城多租户Saas架构设计

实现saas多租户方案比较

带有 sequelize 和 nest.js 的多租户

在使用弹簧数据存储库之前更改当前模式 - 多租户

权限系统设计学习总结—— SaaS 平台多租户模式下权限设计

什么是多租户模式?