多租户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

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 多租户数据库设计是指在一个数据库中同时存储多个租户(tenant)的数据,其中每个租户拥有自己独立的数据空间,相互之间互不干扰。在SaaS(Software as a Service)应用中,多租户数据库设计是非常常见的,因为这种设计可以有效地节省资源、降低成本,简化维护和升级等操作。 下面是一些常见的多租户数据库设计思路: 1. Schema per Tenant 这种设计思路是为每个租户创建一个独立的数据库模式(schema),在这个模式中存储该租户的所有数据。这种设计思路的优点是简单、容易维护,因为每个租户的数据都是相互独立的。缺点是在租户数量大的情况下,需要频繁地创建和删除模式,可能会影响数据库性能。 2. Shared Database, Shared Schema 这种设计思路是将所有租户的数据存储在同一个数据库中,但是使用相同的模式(schema)来存储数据。在每个表中,增加一个租户ID列,用来标识不同的租户。这种设计思路的优点是简单、易于扩展,但是在查询和索引数据时需要考虑租户ID,可能会影响查询性能。 3. Shared Database, Separate Schemas 这种设计思路是将所有租户的数据存储在同一个数据库中,但是为每个租户创建一个独立的模式(schema),在这个模式中存储该租户的所有数据。这种设计思路的优点是简单、易于维护,但是在查询和索引数据时需要考虑租户ID,并且需要在不同的模式之间切换,可能会影响查询性能。 4. Hybrid Approach 这种设计思路是将上述三种设计思路进行结合,根据实际情况选择最合适的方案。例如,可以为小型租户使用“Schema per Tenant”设计思路,为大型租户使用“Shared Database, Separate Schemas”设计思路,以此来平衡设计的复杂度和查询性能。 总之,多租户数据库设计需要根据具体的业务需求和技术架构来进行选择,需要考虑到数据的安全性、稳定性、可扩展性、性能等多个方面的因素。 ### 回答2: SaaS(Software as a Service,软件即服务)是一种以在线方式交付软件应用程序的业务模式。在这种模式下,多个用户可以共享同一个软件应用程序,每个用户都被分配一个独立的虚拟环境,即多租户。 在设计SaaS租户数据库时,需要考虑以下几个关键因素: 1. 数据隔离:在多租户环境下,每个用户的数据需要进行隔离,以保证数据的安全性和私密性。可以使用数据库模式设计来实现数据的隔离,例如每个用户拥有独立的数据库实例。 2. 多租户访问控制:为了保证每个用户只能访问和操作自己的数据,需要设计适当的访问控制机制。可以在数据库层面实现访问权限控制,以及在应用层面实现身份认证和授权机制。 3. 数据共享:尽管在多租户环境下,每个用户的数据是隔离的,但有时候也需要实现数据的共享。可以通过定义公共数据模型或者共享数据表来实现数据的共享,使得多个租户之间可以共享一部分数据。 4. 扩展性和性能:多租户数据库需要支持大规模用户和数据的增长。为了实现良好的扩展性和性能,可以采用分布式数据库架构,将数据分散存储在多个节点上,通过负载均衡和数据分片技术来提高系统的性能和可扩展性。 5. 备份和恢复:多租户数据库需要定期进行备份和恢复操作,以防止数据丢失和灾难发生。可以使用数据库备份和恢复工具,通过设定合适的备份策略和周期,来保证数据的安全性和完整性。 综上所述,设计SaaS租户数据库需要考虑数据隔离、多租户访问控制、数据共享、扩展性和性能以及备份和恢复等因素,以提供稳定、安全、高效的服务。 ### 回答3: SaaS(Software as a Service)即软件即服务,是一种基于云计算的软件交付模式,用户通过互联网访问和使用软件,而不需要购买和安装在本地服务器上。在SaaS的多租户数据库设计中,多租户是指多个客户共享同一个应用实例和数据库,但彼此之间的数据是相互隔离和保密的。 在多租户数据库设计中,首先需要明确每个租户所需的数据模型和功能,以及他们之间的共享和隔离要求。接下来,需要选择适合多租户的数据架构,常见的有共享数据库和分离数据库两种方式。 共享数据库是将所有租户的数据存储在同一个数据库中,通过在数据表中添加租户ID来区分不同租户的数据。这种方式可以实现资源共享和成本节约,但需要考虑数据隔离和性能问题。 分离数据库是为每个租户分配独立的数据库实例,每个租户有自己的数据表和数据库连接。这种方式可以提供更高的隔离性和性能,但需要更多的资源和成本投入。 无论选择哪种方式,多租户数据库设计需要考虑以下几个方面: 1. 数据隔离:为每个租户保证数据的安全性和隐私性,防止不同租户之间的数据交叉和泄露。 2. 可伸缩性:设计数据库架构和存储方案,以满足不同租户的扩展需求和负载变化。 3. 备份和恢复:建立可靠的备份机制和灾难恢复方案,以保证数据的安全性和可用性。 4. 安全性:采取必要的安全措施,如访问控制、身份验证和加密等,保护数据库免受潜在的安全威胁。 5. 性能优化:通过索引、分区、缓存和查询优化等技术手段,提高数据库的性能和响应速度,满足租户的需求。 总结来说,saas租户数据库设计需要综合考虑数据隔离、可伸缩性、备份恢复、安全性和性能优化等方面的需求,选择合适的数据架构和存储方案,以满足不同租户的需求,并提供安全可靠的服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值