多租户SaaS的数据库设计模式

前言

在设计多租户SaaS应用程序时,您必须仔细选择最适合您应用程序需求的租户模型。租户模型确定每个租户的数据如何映射到存储。您选择的租户模式会影响应用程序设计和管理。以后切换到另一个模型有时代价昂贵。

关于可选择的租户模型的讨论如下。

A,怎么选择一个合适的租户模型

一般来说,租赁模式不会影响应用程序的功能,但它可能会影响整体解决方案的其他方面。以下标准用于评估每个模型:

可扩展性(Scalability)
  • 租户的数量级
  • 每个租户的存储级别
  • 整体存储
  • 工作负载
租户隔离性(Tenant isolation)
  • 数据隔离和性能(是否一个租户的负载会影响到其他租户)
单租户成本(Per-tenant cost)
  • 数据库成本
开发复杂度(Development complexity)
  • 数据结构的变化
  • 查询语句的变化
运维复杂度(Operational complexity)
  • 性能监控
  • 数据结构schema管理
  • 租户数据恢复
  • 灾备
可定制化程度(Customizability)
  • 根据租户的需求自定义架构的容易程度

这个租户的讨论集中在数据层。但考虑一下应用层。应用程序层被视为一个整体实体。如果将应用程序划分为许多小型组件,您的租户模型选择可能会发生变化。对于租户和存储技术或使用的平台,您可以对其他组件进行不同的处理

B,独立的单租户应用+独立的单租户数据库

应用层隔离

在这个模型中,对于每一个租户,整个应用程序需要重复安装一次。应用程序的每个实例都是独立实例,因此它不会与任何其他独立实例交互。每个应用程序实例只有一个租户,因此只需要一个数据库。租户拥有自己的数据库。 

每个应用程序实例都安装在独立的Azure资源组中。资源组可以属于软件供应商或租户拥有的订阅。无论哪种情况,供应商都可以为租户管理软件。每个应用程序实例都配置为连接到其相应的数据库。

每个租户数据库都作为独立数据库进行部署。该模型提供了最大的数据库隔离。但隔离需要为每个数据库分配足够的资源来处理其高峰负载。这里重要的是, 弹性池不能用于部署在不同资源组或不同订阅中的数据库。这种限制使得这种独立的单租户应用程序模型成为从整体数据库成本角度来看最昂贵的解决方案。

供应商管理

即使应用程序实例安装在不同的租户订阅中,供应商也可以访问所有独立应用程序实例中的所有数据库。访问是通过SQL连接实现的。这种跨实例访问可以 使供应商能够集中化架构管理和跨数据库查询以用于报告或分析目的。如果需要这种集中式管理,则必须部署一个目录,将租户标识符映射到数据库URI。 Azure SQL数据库提供了与SQL数据库一起使用以提供目录的分片库。分区库被正式命名为弹性数据库客户端库( Elastic Database Client Library)。

C,支持多租户的应用+每一个租户独立数据库

这个模式使用具有多个数据库的多租户应用程序,均为一个租户一个数据库。为每个新租户提供一个新的数据库。通过为每个节点添加更多资源来垂直扩展应用程序层。或者通过添加更多节点来横向扩展应用程序层。缩放基于应用程序的工作负载,并且与个体数据库的数量或规模无关。 

租户的可定制化 
与独立的应用程序模式一样,使用单租户数据库可以提供强大的租户隔离。可以为租户定制和优化任何给定数据库的模式。此自定义不会影响应用中的其他租户。也许租户可能需要超出所有租户所需的基本数据字段的数据。此外,额外的数据字段可能需要一个索引。

使用每个租户一个数据库,为一个或多个独立租户定制架构很容易实现。应用程序供应商必须设计程序来小心管理架构自定义。

弹性池

当数据库部署在同一资源组中时,可以将它们分组为弹性数据库池。这些池提供了跨多个数据库共享资源的具有成本效益的方式。该池选项比要求每个数据库足够大以容纳它所经历的使用高峰要便宜。即使汇集的数据库共享资源访问权限,他们仍然可以实现高度的性能隔离。

Azure SQL数据库提供了配置,监视和管理共享所需的工具。池级别和数据库级别的性能指标均可在Azure门户中以及通过Log Analytics获得。这些指标可以深入了解总体和租户特定的性能。各个数据库可以在池之间移动,为特定租户提供预留资源。这些工具使您能够以经济高效 的方式确保良好的性能。

运维的可伸缩性

Azure SQL Database平台具有许多旨在管理大量数据库的管理功能,例如超过100,000个数据库。这些功能使每租户数据库模式合理。

例如,假设系统只有一个1000租户数据库作为其唯一的一个数据库。数据库可能有20个索引。如果系统转换为拥有1000个单租户数据库,则索引数 量将增至20,000。在SQL Database中,作为自动调整(Automatic tuning)的一部分,默认情况下启用自动索引功能。自动索引为您管理所有20,000个索引及其正在进行的创建和删除优化。这些自动化操作发生在单个 数据库中,并且不会被其他数据库中的类似操作所协调或限制。自动索引处理繁忙数据库中的索引与繁忙数据库中的索引不同。如果这种巨大的管理任务必须手动完 成,那么这种类型的索引管理定制对于每租户数据库规模而言将是不切实际的。

另外在可伸缩性管理上,还拥有以下特色: 
* 内置备份 
* 高可用 
* 磁盘加密 
* 性能遥测

自动化 
管理操作可以通过devops模型编写和提供。这些操作甚至可以自动化并在应用程序中公开。

例如,您可以自动将单个租户恢复到较早的时间点。恢复只需要恢复存储租户的一个单租户数据库。这种恢复对其他租户没有影响,这证实了管理运营处于每个租户的细粒度级别。

D,支持多租户的单应用+支持多租户的单数据库

另一种可用模式是将多租户存储在多租户数据库中。应用程序实例可以具有任意数量的多租户数据库。多租户数据库的模式必须具有一个或多个租户标识符 列,以便可以选择性地检索来自任何给定租户的数据。此外,该模式可能需要一些仅由租户子集使用的表或列。但是,静态代码和参考数据仅存储一次,并由所有租 户共享。

牺牲了租户的隔离

数据:多租户数据库必然会牺牲租户隔离。多个租户的数据一起存储在一个数据库中。在开发过程中,确保查询不会暴露来自多个租户的数据。 SQL数据库支持行级安全性,它可以强制将查询返回的数据限定为单个租户。

处理:多租户数据库跨所有租户共享计算和存储资源。数据库作为一个整体可以被监控,以确保它的性能可以接受。但是,Azure系 统没有内置的方法来监视或管理单个租户使用这些资源。因此,多租户数据库会增加遭遇嘈杂邻居的风险,其中一个过于活跃的租户的工作负载会影响同一数据库中 其他租户的性能体验。附加的应用程序层的监视可以监视租户层的性能。

更低的成本

一般来说,多租户数据库的租户成本最低。独立数据库的资源成本低于同等规模的弹性池。此外,对于租户只需要有限存储的情况,潜在的数百万租户可能存 储在单个数据库中。没有弹性池可以包含数百万个数据库。但是,每个池中包含1000个数据库的解决方案(包含1000个池)可能会达到数百万的规模,有可 能变得难以管理。

以下将讨论多租户数据库模型的两种变体,分片多租户模型是最灵活和可扩展的。

E,支持多租户的单应用+支持多租户的单数据库(不分片)

最简单的多租户数据库模式使用单独的独立数据库来为所有租户托管数据。随着越来越多的租户被添加,数据库被扩大了更多的存储和计算资源。这种放大可能是所需要的,尽管总是有一个最终的限制。但是,在达到这个限制之前,数据库变得难以管理。

针对单个租户的管理操作在多租户数据库中实施起来要复杂得多。大规模的这些行动可能会变得无法接受地缓慢。一个很坏的例子就是尝试只恢复某一个租户的某一时间点的数据。

F,支持多租户的单应用+支持多租户的单数据库(分片)

大多数SaaS应用程序一次只能访问一个租户的数据。此访问模式允许租户数据分布在多个数据库或分片中,其中任何一个租户的所有数据都包含在一个分片中。结合多租户数据库模式,分片模型允许几乎无限的规模。

管理分片

分片增加了设计和运营管理的复杂性。需要在其中维护租户和数据库之间的映射的目录。此外,还需要管理程序来管理碎片和租户人口。例如,必须设计程序 以添加和删除分片,并在分片之间移动租户数据。一种扩大规模的方法是添加一个新的分片并将其填入新租户。在其他时候,您可能会将人口稠密的分片分成两个密 度较小的分片。几个租户搬迁或停产后,可能会将人口稀少的分片合并在一起。合并将导致更具成本效益的资源利用率。租户也可能在分片之间移动以平衡工作量。

SQL数据库提供了一个拆分/合并工具,与分片库和目录数据库一??起使用。提供的应用程序可以拆分和合并分片,并可以在分片之间移动租户数据。该 应用程序还在这些操作过程中维护目录,在移动它们之前将受影响的分片租户标记为离线。移动后,应用程序再次使用新映射更新目录,并将租户标记为重新联机。

更小的数据库更容易管理

通过将租户分布在多个数据库中,分片多租户解决方案可生成更轻松管理的小型数据库。例如,将特定租户恢复到以前的时间点现在涉及从备份恢复单个较小的数据库,而不是包含所有租户的较大数据库。可以选择数据库大小和每个数据库的租户数量来平衡工作负载和管理工作。

shema中的租户标识符ID 
根据所使用的分片方法,可能会对数据库模式施加额外的约束。 SQL Database拆分/合并应用程序要求Schema包含分片KEY,通常是租户标识符ID。租户标识符ID是所有分片表主键中的主要元素。租户标识符使 分离/合并应用程序能够快速定位和移动与特定租户相关联的数据。

分片的弹性池

分片多租户数据库可以放置在弹性池中。一般来说,在一个池中拥有许多单租户数据库的成本效率与在少数多租户数据库中拥有许多租户相当。当有大量相对不活跃的租户时,多租户数据库是有利的。

G,混合分片多租户数据库

在混合模型中,所有数据库在其Schema中都有租户标识符。这些数据库都能够存储多个租户,并且数据库可以被分割。所以在架构意义上说,它们都是多租户数据库。然而在实践中,其中一些数据库只包含一个租户。无论如何,存储在给定数据库中的租户数量对数据库架构没有影响。

移动租户

在任何时候,您都可以将特定租户迁移到自己的多租户数据库。在任何时候,您都可以改变主意并将租户移回包含多个租户的数据库。在供应新数据库时,您还可以将租户分配给新的单租户数据库。

当可识别的租户群体的资源需求存在较大差异时,混合模式就会发光。例如,假设参与免费试用的租户无法保证与订购租户相同的高性能水平。该政策可能适 用于免费试用阶段的租户存储在所有免费试用租户共享的多租户数据库中。当免费试用租户订阅基本服务级别时,租户可以转移到另一个租户较少的多租户数据库。 支付高级服务级别的用户可以转移到其新的单租户数据库。

在这种混合模式中,用户租户的单租户数据库可以放置在资源池中,以降低每个租户的数据库成本。这也是在数据库每租户模型中完成的。

H,租户模型的比较

指标 独立应用 单租户单数据库 分片多租户
可扩展性 中等1-100s 非常高1-100000s 无限1-1000000s
租户隔离性 非常高
每一个租户的数据库成本 低,使用池 最低
性能监控和管理 只能一个一个租户进行 综合和单个 综合和单个(偏综合)
开发复杂度 中等
运维复杂度 从低到高,取决于租户规模 从低到中等 从低到高,单租户的管理比较复杂

原文地址:https://www.cnblogs.com/niuben/p/11063777.html

时间: 2024-11-09 18:40:42

多租户SaaS的数据库设计模式的相关文章

多租户SaaS平台的数据库方案

1.1 多租户是什么 多租户技术(Multi-TenancyTechnology)又称多重租赁技术:是一种软件架构技术,是实现如何在多用户环境下 (此处的多用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用户间数据的隔离性.简单讲: 在一台服务器上运行单个应用实例,它为多个租户(客户)提供服务.从定义中我们可以理解:多租户是一种架 构,目的是为了让多用户环境下使用同一套程序,且保证用户间数据隔离.那么重点就很浅显易懂了,多租户的重 点就是同一套程序下实现多用户数据的隔离 1.2 需

EF core (code first) 通过自定义 Migration History 实现多租户使用同一数据库时更新数据库结构

前言 写这篇文章的原因,其实由于我写EF core 实现多租户的时候,遇到的问题. 具体文章的链接: Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下利用EF core实现从数据实现多租户(2) : 按表分离   (主要关联文章) 这里我遇到的最主要问题是:由于多租户的表使用的是同一个数据库.由于这个原因,无法通过 Database.EnsureCreated() 自动创建多个结构相同但名字不同的表. 所以我在文中提到,需要自己跑脚本去创建多有的

简明的数据库设计模式

设计一个数据库存储模式时,要仔细分析数据模式,不要把所有的数据都放在一起.否则对系统的可用性,高效能,扩展性都会有严重的影响.当然你设计的系统非常小,完全可以用最简单的方法. 要通过对业务的熟练,从不同的角度对数据进行多维度分析,一般可以从如下几个方向分析: 1.       数据流向 2.       数据访问特点 3.       数据量的大小 4.       数据的增长量 5.       数据的生命周期 根据以上数据特点,综合数据模式对数据表进行分类: 1.       恒数表 2. 

[ 转载 ] [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

http://www.cnblogs.com/wang-meng/p/5898837.html 原文地址:https://www.cnblogs.com/ILoke-Yang/p/8137408.html

SaaS模式应用之多租户系统开发(单数据库多Schema设计)

SaaS是Software-as-a-Service(软件即服务)的简称,这边具体的解释不介绍. 多租户的系统可以应用这种模式的思想,将思想融入到系统的设计之中. 一.多租户的系统,目前在数据库存储上,一般有三种解决方案: 1.独立数据库 2.共享数据库,隔离数据架构 3.共享数据库,共享数据架构 这里我就系统的实际需求情况,选择了第二种解决方案,下面简单介绍下 二.数据库我选用的是SqlServer,因为SqlServer自带的Schema刚好符合这种需求.至于Mysql,Oracle的Sch

java工程积累——saas之multi-tenancy解析

最近做的项目涉及到比较深入的一部分,就是定义客户关系,在我们的商讨中,我们决定,采用服务商的模式,就是我们是基础服务商,由客户组合服务,向客户提供基于云端的服务支持!这就自然引出了以下概念: saas百科: SaaS是Software-as-a-Service(软件即服务)的简称,随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴起的一种完全创新的软件应用模式.它与"on-demand software"(按需软件),the application service provide

1.5 多租户

多租户 什么是多租户? 数据库和部署架构 多部署-多数据库 单部署-多数据库 单部署-单数据库 单部署-混合数据库 多部署-单/多/混合数据库 ABP的多租户 启用多租户 租主和租户 会话 决定当前租户 租户仓库 数据过滤器 IMustHaveTenant Interface IMayHaveTenant Interface 附加注意事项 切换租主与租户 什么是多租户? “软件多租户技术指的是一种软件架构,这种架构可以使用软件的单实例运行并为多个租户提供服务.租户是通过软件实例的特定权限共享通用

云平台之多租户

云平台之多租户 在云领域我们常常会听到一个词:多租户.这个词在不同的语境中有着不同的含义.本文将介绍云平台中的多租户的概念以及实现多租户支持的思路. 什么是租户 刚開始接触这个概念时,你肯定感觉"租户"这个词怪怪的.但假设我们换个词,我相信你立即就有感觉了.这个词就是"客户"(这里的客户指的就是商业上面的客户). 一个租户就是一个客户,比方我们开发的服务是给 XXX 企业使用的,那该企业就是我们的一个客户/租户:假设这个服务是面向互联网的,那么使用该服务的每一个互联

aaS软件的必要特征分析,一定是多租户特性吗

本篇文章讲述了SaaS软件的必要特征一定是多租户特性?对于许多小型企业来说,SaaS是采用先进技术的最好途径,它消除了企业购买.构建和维护基础设施和应用程序的需要 课课家教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦! 当用户选择一个SaaS技术路线的时候,会面临"多租户SaaS"和"单租户SaaS"两个选择.尽管大部分的ISV提供的是多租户的SaaS,但开发者同样需要知道这两种架构的区别,以保证选择了正确的路线.当前和未来的功能需求,行业的细分