你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 上的多租户 SaaS

Microsoft Entra ID
Azure 应用服务
Azure DNS
Azure Front Door
Azure Kubernetes 服务 (AKS)

如果确定你的企业软件解决方案的某一部分可以无品牌标记并可销售给其他企业,这会为公司增加一个全新的收入来源。 但是,配置解决方案以解决大量租户带来的负载通常是一个具有挑战性的难题。 此解决方案演示了一套 Azure 技术,这些技术可以保护和平衡流量。

体系结构

显示在两个不同区域的 Azure 中设置的多租户 SaaS 体系结构的图片。

下载此体系结构的 Visio 文件

工作流

一套 Azure 技术可保护流量并实现负载均衡。

  1. Microsoft Azure Front Door 处理一些初始任务:

    • 处理初始请求

    • 在区域间实现负载均衡

    • SSL(HTTPS) 终止和卸载

    • 发生区域性服务中断时进行故障转移

  2. Azure DNS 管理 DNS 记录并确保路由到正确的 Azure Front Door 终结点。

  3. 体系结构使用 Microsoft Entra ID 作为标识提供者进行身份验证。

  4. 一旦路由到适当的区域,应用程序网关就会进行路由和负载均衡,从而将请求定向到适当的 Azure 应用程序服务。

  5. 对于此体系结构,使用应用程序服务是以下项的首选服务:

    • 任何基于 HTTP 的应用程序。

    • 提供 Web 内容。

    • 公开 RESTful API。

    • 在前端应用程序后面实现业务逻辑。

    可以将应用程序服务配置为自动纵向扩展和横向扩展。 这让应用程序服务非常适合按需缩放一系列租户 HTTP 驱动的请求。

  6. 数据访问层服务也根据负载独立缩放。 数据服务管理数据模型、连接客户端和驱动程序。 数据服务还为希望在应用程序中使用数据的所有更高级别服务提供一致的数据接口。 可以使用 Azure Kubernetes 服务 (AKS) 部署和扩展这些数据服务。 每个 AKS 群集负责层中的一组相关功能。 AKS 可以实现一个微服务体系结构,它具有一系列容器,每个容器都封装了群集中的特定功能。 这样可以实现代码内的高度抽象和解耦。 还允许集群单独向外扩展,以应对来自多个租户的负载增加。 如果群集上的负载增加,每个群集都可以扩展其资源。 只要资源组中的其他集群没有遇到相同的增长,纵向扩展就不会影响它们。

  7. 在应用程序框架之外存储和管理关系数据。 这样做可以为任一区域提供单点数据输入。 利用 Azure SQL 弹性池的优势,可以实现复制、可用性、可伸缩性和安全性。 为每个租户预配池中的一个数据库。 在负载和请求进入时,将池中可用的资源按需分配给数据库。 这样可以根据预算优化租户可用的数据库资源。

组件

主要组件是此解决方案中体系结构的建议组件。 如果任何主要组件不适合你的体系结构,请参阅替代组件列表。

主要组件

  • Azure Front Door:将客户端流量路由到正确区域的区域负载均衡器。 如果发生区域故障,它可以故障转移到第二个区域,并且可以通过 Azure Web 应用程序防火墙来保护面向 Internet 的入口点。

  • Microsoft Entra ID:充当整个应用程序的标识提供者,对应用程序中的请求强制执行身份验证和端到端授权。

  • Azure DNS:Azure 中用于域名解析的托管服务。 在多租户解决方案中,多个客户端通过各自的域访问该解决方案。 使用 Azure DNS 配置客户端请求并将其解析到正确的应用程序堆栈。

  • 应用程序网关:将应用程序内部的流量进行负载均衡并路由到满足客户端业务需求的各种服务。 尽管 Azure Front Door 可以跨高级区域进行均衡负载,但应用程序网关可以感知组中单个服务的负载。 Azure Front Door 与应用程序网关相结合,可在多租户解决方案的所有级别提供复杂的负载均衡。 有关 Azure 中的负载均衡选项的详细信息,请访问 Azure 负载均衡概述

  • 应用程序服务:Azure 为 Web 应用程序和基于 Web 的 API 提供的首要服务。 安全性与 Microsoft Entra ID 和 Azure 密钥保管库等服务集成。 可以配置自动缩放。 此外,可供缩放的资源量可以在应用能够运行的各种应用程序服务计划之间灵活切换。 应用程序服务还可以利用集成的 DevOps 功能来持续集成和部署到多个环境。 Azure 平台的这些和其他支持功能能够让开发人员专注于其应用程序的开发。

  • Azure Kubernetes 服务 (AKS):编排部署到群集的容器映像的实例。 管理多个客户的数据通常涉及实施一套组件来管理:

    • 数据建模

    • 数据源连接性

    • 提取、转换、加载 (ETL)

    • 导入/导出活动

    通过将这些许多较小的组件开发为基于容器的微服务,这为部署到 AKS 群集创建了一个理想的场景。 框架中内置了用于自动缩放、负载均衡和可升级性的工具。 AKS 使用可用的 DevOps 功能和 Azure 容器注册表与持续集成/持续交付 (CI/CD) 策略完善地集成。

  • Azure SQL Elastic Pools:提供一种利用资源池灵活管理一组数据库的解决方案。 服务按需向数据库分配资源。 它使多租户 SaaS 体系结构的开发人员能够根据需要向客户提供数据库资源。 该服务还减少了维护具有大量未使用计算资源的多个 SQL Server 的预算和开销。

  • Azure 认知搜索(先前称为 Azure 搜索):一种为你的应用程序添加强大的索引和查询引擎的服务。 该服务使客户可以访问强大的查询功能。 它们还可使用 Azure 的 AI 功能来扩充和增强查询功能。 Azure 认知搜索可以使用每租户索引或每租户服务策略来解决多租户问题。

  • Azure Cache for Redis:将缓存层作为服务应用到解决方案,提供内存管理缓存以减少延迟并提高客户端的性能。 高吞吐量允许处理访问系统的多个租户的大量请求。 你可以随着应用程序负载的增加而灵活地扩展服务。 它还支持静态加密,以保护和隔离缓存的租户数据。

替代组件

  • Azure 虚拟机规模集:允许将服务部署到可根据需要自动缩放的 VM 环境。 虚拟机规模集与负载均衡器或应用程序网关完善地集成,以随着规模集的增长自动重新平衡负载。 虚拟机规模集提供了此解决方案所需的可扩展性。 但许多情况下都无需管理完整的 VM 环境,我们可以将该级别的堆栈推迟到应用程序服务或 AKS。

  • Azure SQL 数据库:作为单独的专用实例实现,以替代弹性池。 使用 Azure SQL 数据库会增加直接管理实例的开销,并会导致分配资源产生更多成本。 也就是说,当租户需要专用服务器时,这是一种可接受的替代方案。 特别是,客户端可能需要对实例和专用可用资源进行更多控制。 需要专用 SQL Server 的租户可以与弹性池配置中的租户并存。 在购买 SaaS 许可证时,可以将 SQL 数据库层作为租户可用的定价选项之一。

  • 虚拟机上的 SQL Server:另一种部署 SQL 数据库的选择。 租户可能具有预先存在的 IT 基础结构和现有的本地 SQL Server。 在这种情况下,租户可能希望将其当前许可证用作完整迁移或混合方案。 由于 SaaS 的解耦特性,应用程序的数据层可以通过配置而以任何 SQL 数据库为目标。

方案详细信息

如果确定你的企业软件解决方案的某一部分可以无品牌标记并可销售给其他企业,这会为公司增加一个全新的收入来源。 但是,配置解决方案以解决大量租户带来的负载通常是一个具有挑战性的难题。

Azure 提供了一系列用于管理软件解决方案的服务,这些服务可以:

  • 灵活地维护所有客户端的数据库。

  • 缩放解决方案的业务逻辑和逻辑层,以防止计算层出现瓶颈。

  • 集成可用性和区域故障转移。

  • 在解决方案的所有级别提供端到端安全性。

可能的用例

这些用例的设计模式可以受益于 Azure 上托管的多租户 SaaS 解决方案:

  • 开发一套客户关系管理 (CRM) 解决方案,以便客户可以向买家进行营销。

  • 实施内容管理系统 (CMS) 并使用此体系结构将 CMS 交付给多个用户。

注意事项

这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改善工作负载质量的指导原则。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架

多租户

多租户解决方案是此解决方案中的关键考虑因素。 该解决方案可同时处理多个客户端。 它还分配足够的资源来有效地处理所有客户端请求。 在处理请求时,该解决方案保护来自全球端点的流量并隔离客户端数据以防止违规和交叉污染。 根据客户的主要位置将客户部署到一对区域资源组。 这样做可以优化区域可用性。

可以将许多客户端部署到单个计算组,因为系统会根据身份验证和客户端密钥隔离请求,从而根据这些唯一标识符区分请求。 系统可以通过它们的密钥分别加密所有客户端请求,这样就没有客户端可以解密任何其他客户端的数据。 在单个计算堆栈上管理多个客户端使您能够优化资源分配,从而以成本为客户提供所需的响应能力。

可以在计算堆栈之外以类似的方式管理客户端数据库,因为客户端请求可能来自任一区域堆栈。 许多客户端数据库可以存在于同一个弹性池上,通过透明数据加密 (TDE) 进行隔离和保护。 可以将每个数据库配置为使用客户端管理的密钥加密数据,并实时 (JIT) 解密数据。 JIT 解密可保护来自开发人员和其他客户端的客户端数据。 该系统利用弹性池为分配给它的客户按需提供资源,同时降低成本。 可以为每个弹性池分配复制策略,从而为客户端数据提供备份和故障转移。 在将更多客户端加入系统时,让更多弹性池联机。

有关多租户解决方案的详细信息,请参阅在 Azure 上构建多租户解决方案

可靠性

可靠性可确保应用程序符合你对客户的承诺。 有关详细信息,请参阅可靠性支柱概述

可伸缩性和可用性

该解决方案旨在考虑大量使用 SaaS 的租户。 该解决方案利用大量可缩放的组件和服务,根据负载来增长。 该体系结构不适用于为少数租户或少量请求和数据提供服务的解决方案。 它可能会强调针对单个客户端或更小负载的解决方案的预算。 在不需要高度全局可用性的情况下,也不需要多区域开销,因为这会增加不必要的复杂性和成本。

安全性

安全性针对蓄意攻击及滥用宝贵数据和系统提供保障措施。 有关详细信息,请参阅安全性支柱概述

该系统在应用程序的每个级别从端到端解决安全问题:

  • Azure Front Door 为其域提供内置 HTTPS 支持。 这意味着系统可以加密流向 SaaS 应用程序的所有流量。 Azure Front Door 还实现了 Azure Web 应用程序防火墙,在系统将请求路由到应用程序之前保护 SaaS 堆栈免受边缘攻击。

  • 每个区域中的每个应用程序堆栈都位于 Azure 虚拟网络中。 系统将限制进入虚拟网络的流量接受来自 Azure Front Door 的请求,从而保护所有应用程序服务免受外部流量的影响。 一旦进入安全防火墙,应用程序网关就可以终止 SSL 并在应用程序内提供高性能的负载平衡和路由。

  • 可使用 Azure Key Vault 安全管理所有凭据、机密和连接字符串。 通过将这些敏感数据作为机密进行管理,开发人员可以在部署时将凭据注入应用程序。 这样做可以确保代码不会被敏感信息污染。 使用机密可确保代码泄露或中间人攻击无法访问租户数据库,从而保护客户端数据。

  • 在这种情况下,多个租户的数据可能在同一个数据库服务器上(即使不是同一个数据库)并存。 使用 TDE 和 JIT 解密可保护数据库上的数据。 系统对数据库上的所有静态数据进行加密,并且仅在租户请求时对其进行解密。 客户端可以提供自己的密钥,你可以将所有客户端密钥存储在 Azure 密钥保管库中,以管理多个租户的加密。 这样可以端到端保护客户端数据,防止开发人员访问客户端数据,隔离租户之间的数据,并有助于满足安全和数据的合规性要求。

成本优化

成本优化是关于寻找减少不必要的费用和提高运营效率的方法。 有关详细信息,请参阅成本优化支柱概述

Azure 应用程序服务将根据所需的预期计算资源提供多个定价层。 对于多租户 SaaS,高可用性和横向扩展功能是选择服务计划的关键组成部分。 如果预计要托管很多租户,则可能需要选择高级或隔离层以提供解决高流量所需的计算资源。 标准层、高级层和隔离层都是专用 VM 实例。 可以通过自己指定的上述层的虚拟机数量来计算每单位时间的成本。 有关更多信息,请访问应用程序服务定价计划概述

Azure Kubernetes 服务提供了一种经济高效的容器服务。 AKS 节点的费用仅在使用时产生,因此只需支付以下费用:

  • VM

  • 已使用的存储和网络资源

  • 与使用量直接相关的缩放成本

如果希望降低成本,则使用 AKS 作为数据层服务是理想的选择。 有关 AKS 实例层级定价的估算值,请访问 Kubernetes 服务计算器

根据设计,Azure SQL 弹性池定价在多租户方案中具有很高的成本效益。 弹性池中的租户数据库将共享可用资源。 随着租户之间的需求逐渐发生变化,资源也会随之发生变化。 Azure SQL 弹性池为所需的数据库提供最大的可用资源,而无需在所有数据库上产生资源开销。 该服务为 SaaS 的开发者和租户保持低成本。 使用 Azure SQL 数据库定价计算器确定价格并确定为租户及其数据提供服务所需的资源层级和数量。

  • 使用虚拟核心 (vCore) 定价模型可在扩展以满足所需资源方面提供更大的灵活性。 此外还可以利用 Azure 混合权益。 现有 SQL Server 许可证为云中的 vCore SQL 资源提供折扣。 因此,如果本地服务器已经是开发人员基础结构的一部分,则可以通过使用这些折扣来进一步管理成本。 可以使用 Azure 混合权益节省计算器来估算可能节约的成本。

  • 还可以通过购买 Azure SQL 数据库预留容量来节省 SQL Server 资源成本。 购买预留容量标志着长期使用 SQL 数据库的承诺。 期限通常在一到三年之间。 作为回报,你可以获得预留资源的计算成本折扣。 例如,可以预留一年 32 个常规用途 vCore,这将降低该年份这 32 个 vCore 的成本。 让多个租户购买 SaaS 许可证是一个强有力的指标,表明使用预留容量适合该解决方案,并且是该工作负载的理想成本节省方案。

可以在 Azure Cache for Redis 定价页面上找到 Azure Cache for Redis 的定价结构。 根据需要随时在基本、标准和高级层之间调整缓存层级。 你将看到更高的缓存限制和其他功能(如复制和灾难恢复)的定价。 Azure Cache for Redis 还提供了长期使用承诺的预留容量定价。

Azure Front Door 的定价取决于传入和传出服务的数据量。 对于出站数据,定价因区域而异。 不同的区域会产生不同的成本。 如果遇到价格差异,请单独估算成本。 价格包括一些路由和域容量,但系统会产生超出初始限制的成本。 Azure Web 应用程序防火墙会按每个应用的策略或规则产生少量额外费用。 您可以在 Azure Front Door 定价页面上找到 Azure Front Door 的定价详细信息。

Azure 认知搜索的定价是一个完全分层的系统。 免费层级适用于开发和测试。 之后,每一层级都会为每个分配的认知搜索实例产生每小时成本。 随着层级的增加,总存储、索引数量和横向扩展限制也会增加。 Azure 认知搜索以相同的费率向所有付费层级提供图像提取即服务。

后续步骤