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

部署并探索一个多租户 SaaS 应用,该应用通过 Azure SQL 数据库使用“每租户一个数据库”模式

适用于: Azure SQL 数据库

本教程中,你将部署并探究 Wingtip Tickets SaaS“每租户一个数据库”应用程序 (Wingtip)。 该应用使用“每租户一个数据库”模式存储多个租户的数据。 该应用设计用于展示简化了 SaaS 方案的启用方式的 Azure SQL 数据库功能。

选择“部署到 Azure”后,五分钟即生成一个多租户 SaaS 应用程序。 该应用包括在 Azure SQL 数据库中运行的数据库。 该应用部署有三个示例租户,每个租户具有其自己的数据库。 所有数据库都部署到一个 SQL 弹性池中。 该应用会部署到 Azure 订阅。 用户具有完全访问权限,可以浏览并处理该应用的各个组件。 WingtipTicketsSaaS-DbPerTenant GitHub 存储库中提供了应用程序 C# 源代码和管理脚本。

本教程介绍以下内容:

  • 如何部署 Wingtip SaaS 应用程序。
  • 从何处获取应用程序源代码和管理脚本。
  • 关于构成该应用的服务器、池和数据库。
  • 如何通过目录将租户映射到其数据。
  • 如何预配新租户。
  • 如何在应用中监视租户的活动。

可通过观看相关教程系列,了解各种 SaaS 设计和管理模式。 除了初始部署相关内容,这些教程还提供其他丰富的内容延展。 使用这些教程时,可以观察所提供的脚本来了解不同的 SaaS 模式是如何实现的。 脚本演示 SQL 数据库的功能如何简化 SaaS 应用程序的开发。

先决条件

若要完成本教程,请确保安装 Azure PowerShell。 有关详细信息,请参阅 Azure PowerShell 入门

部署 Wingtip Tickets SaaS 应用程序

对名称进行计划

在本部分的步骤中,你将提供一个用来确保资源名称全局唯一的用户值。 你还将为包含由应用部署创建的所有资源的资源组提供一个名称。 对于名为 Ann Finley 的虚构人员,建议输入以下名称:

  • 用户af1 由 Ann Finley 的首字母加一个数字构成。 如果是第二次部署应用,则使用不同的值。 例如 af2。
  • 资源组wingtip-dpt-af1 指示这是“每租户一个数据库”应用。 追加用户名 af1 来将资源组名称与它包含的资源的名称相关联。

现在请选择自己的名称,并将其写下来。

步骤

  1. 若要在 Azure 门户中打开 Wingtip Tickets SaaS“每租户一个数据库”部署模板,请选择“部署到 Azure”。

    图像显示标记为“部署到 Azure”的按钮。

  2. 在模板中输入必需参数的值。

    重要

    出于演示目的,某些身份验证和服务器防火墙已有意取消保护。 建议创建一个新的资源组。 不要使用现有资源组、服务器或池。 不要将此应用程序、脚本或所部署的任何资源用于生产。 使用完该应用程序时请删除此资源组,以停止相关计费。

    • 资源组:选择“新建”,并为资源组提供之前所选的唯一名称。
    • 位置:从下拉列表中选择一个位置。
    • 用户:使用之前所选的用户名值。
  3. 部署应用程序。

    a. 选择“我同意上述条款和条件”。

    b. 选择“购买”。

  4. 若要监视部署状态,请选择“通知”(搜索框右侧的钟形图标)。 部署 Wingtip Tickets SaaS 应用大约需要 5 分钟。

    部署成功

下载和取消阻止 Wingtip Tickets管理脚本

在部署应用程序的同时,下载源代码和管理脚本。

重要

从外部源下载 zip 文件并将其解压缩时,可执行内容(脚本和 DLL)可能会被 Windows 阻止。 在提取脚本前,请执行相关步骤来取消阻止 .zip 文件。 取消阻止可确保允许运行这些脚本。

  1. 浏览到WingtipTicketsSaaS-DbPerTenant GitHub 存储库
  2. 选择“克隆或下载” 。
  3. 选择“下载 ZIP”,然后保存文件
  4. 右键单击“WingtipTicketsSaaS-DbPerTenant-master.zip”文件,然后选择“属性”
  5. 在“常规”选项卡上,选择“取消阻止”>“应用”。
  6. 选择”确定”,并提取文件

脚本位于 ...\WingtipTicketsSaaS-DbPerTenant-master\Learning Modules 文件夹中。

更新此部署的用户配置文件

运行任何脚本之前,在 UserConfig 文件中更新“资源组”和“用户”值。 将这些变量设置为部署期间使用的值。

  1. 在 PowerShell ISE 中,打开 ...\Learning Modules\UserConfig.psm1
  2. 使用部署(仅限 10 和 11 行)的特定值,更新 ResourceGroupName 和 Name
  3. 保存更改。

几乎每个脚本中都会引用这些值。

运行此应用程序

举办活动的应用展示场所。 场所类型包括音乐厅、爵士乐俱乐部和运动俱乐部。 在 Wingtip Tickets 中,场所注册为租户。 注册为租户可让场所轻松列出活动,以及向其客户销售门票。 每个场所有个性化的网站用于列出其活动和售票。

在应用内部,每个租户均获得一个部署到弹性池的数据库。

中间的“事件中心”页提供你的部署中租户的链接列表。

  1. 使用以下 URL 在 Web 浏览器中打开事件中心:http://events.wingtip-dpt.<user>.trafficmanager.net。 使用你的部署的用户值替换 <user>。

    事件中心

  2. 在事件中心内选择“Fabrikam Jazz Club”

    事件

Azure 流量管理器

Wingtip 应用程序使用 Azure 流量管理器控制传入请求的分配。 特定租户的事件页的 URL 使用以下格式:

  • http://events.wingtip-dpt.<user>.trafficmanager.net/fabrikamjazzclub

    下表中对前述格式的各部分进行了说明。

    URL 部分 说明
    events.wingtip-dpt Wingtip 应用的事件部分。

    -dpt 部分将 Wingtip Tickets 的“每租户一个数据库”实现与其他实现区分开来。 例如,单个“每租户应用”(-sa) 实现,或多租户数据库 (-mt) 实现。
    . <user> 在示例中为 af1
    .trafficmanager.net/ 流量管理器、基 URL。
    fabrikamjazzclub 标识名为 Fabrikam Jazz Club 的租户。
  • 租户名称是由事件应用通过该 URL 分析得到的。

  • 租户名称用于创建密钥。

  • 密钥用于访问目录,以获取租户数据库的位置。

    • 目录是通过使用分片映射管理实现的
  • 事件中心使用目录中的扩展元数据为每个租户构造事件页 URL 的列表。

在生产环境中,通常要创建一条 CNAME DNS 记录,用以将公司 Internet 域指向流量管理器 DNS 名称。

注意

在本教程中,流量管理器的用途可能不是非常明显。 此系列教程的目标是展示可以处理复杂生产环境规模的各种模式。 在这种情况下,例如,你将具有分布在全球的多个 Web 应用,并且它们与数据库共存于相同的位置,你将需要使用流量管理器在这些实例之间进行路由。 另一系列教程展示了流量管理器的用途,它们是异地还原异地复制教程。 在这些教程中,流量管理器用来在发生区域性服务中断时帮助切换到 SaaS 应用的恢复实例。

开始在租户数据库上生成负载

现在已部署了应用,接下来让我们将其投入使用。

Demo-LoadGenerator PowerShell 脚本将启动针对所有租户数据库运行的工作负荷。 许多 SaaS 应用上的实际负载是偶发性的且不可预测。 为模拟此类型的负载,生成器会在每个租户上生成负载,这些负载具有随机峰值或激增的活动区间。 这些活动激增区间按随机的时间间隔发生。 负载模式需要几分钟的时间才会显现出来。 让生成器先运行至少三四分钟,然后再监视负载。

  1. 在 PowerShell ISE 中,打开 ...\Learning Modules\Utilities\Demo-LoadGenerator.ps1 脚本。
  2. 按 F5 运行脚本并启动负载生成器。 暂时保留默认参数值。
  3. 登录到你的 Azure 帐户,如有必要,选择要使用的订阅。

负载生成器脚本为目录中的每个数据库启动一个后台作业,然后停止该作业。 如果重新运行该负载生成器脚本,它会先停止任何正在运行的后台作业,然后再启动新的作业。

监视后台作业

如果要控制和监视后台作业,请使用以下 cmdlet:

  • Get-Job
  • Receive-Job
  • Stop-Job

Demo-LoadGenerator.ps1 操作

Demo-LoadGenerator.ps1 模拟客户事务的活动工作负载。 以下步骤描述 Demo-LoadGenerator.ps1 所启动的操作的顺序

  1. Demo-LoadGenerator.ps1 在前台启动 LoadGenerator.ps1

    • 这两个 .ps1 文件都存储在 Learning Modules\Utilities\ 文件夹下。
  2. LoadGenerator.ps1 循环访问目录中的所有租户数据库

  3. LoadGenerator.ps1 为每个租户数据库启动一个后台 PowerShell 作业:

    • 默认情况下,后台作业运行 120 分钟。
    • 每个作业通过执行 sp_CpuLoadGenerator,在一个租户数据库上引发一个基于 CPU 的负载。 负载的强度和持续时间会有所不同,具体取决于 $DemoScenario
    • sp_CpuLoadGenerator 循环访问 SQL SELECT 语句,该语句引发高 CPU 负载。 SELECT 问题之间的时间间隔会根据参数值而有所不同,以此创建可控的 CPU 负载。 负载级别和间隔是随机的,旨在更加真实地模拟负载。
    • 此 .sql 文件存储在 WingtipTenantDB\dbo\StoredProcedures\ 下。
  4. 如果 $OneTime = $false,则负载生成器将启动后台作业,然后继续运行。 每隔 10 秒钟,它将监视是否预配了任何新租户。 如果设置了 $OneTime = $true,则负载生成器将启动后台作业,然后停止在前台运行。 在本教程中,保留为 $OneTime = $false

    如果要停止或重启负载生成器,可使用 Ctrl-C 或停止操作 Ctrl-Break。

    如果要让负载生成器在前台继续运行,可使用另一个 PowerShell ISE 实例来运行其他 PowerShell 脚本。

 

继续执行下一部分之前,让负载生成器在作业调用状态下运行。

预配新租户

初始部署会创建三个示例租户。 现在,请创建另一个租户,看看这对已部署的应用程序的影响。 在 Wingtip 应用中,用于预配新租户的工作流在预配和目录教程中进行了说明。 在此阶段,要创建新的租户,此过程不超过 1 分钟。

  1. 打开一个新的 PowerShell ISE。

  2. 打开 ...\Learning Modules\Provision and Catalog\Demo-ProvisionAndCatalog.ps1。

  3. 若要运行脚本,请按 F5。 暂时保留默认值。

    注意

    许多 Wingtip SaaS 脚本都使用 $PSScriptRoot 来浏览文件夹,以调用其他脚本中的函数。 只有按 F5 执行完整脚本时,才会计算该变量。 使用 F8 突出显示并运行所选项可能会发生错误。 若要运行脚本,请按 F5。

新的租户数据库:

  • 在 SQL 弹性池中创建。
  • 已初始化。
  • 已在目录中注册。

成功预配后,新租户的“事件”站点会显示在浏览器中。

新租户

刷新事件中心,使新租户出现在列表中。

浏览服务器、池以及租户数据库

现在,你已针对该组租户运行了加载,下面让我们看看一些已部署的资源。

  1. Azure 门户中,浏览到你的 SQL 服务器列表。 然后打开 catalog-dpt-<USER> 服务器。

    • 目录服务器包含两个数据库:tenantcatalogbasetenantdb(为了创建新租户而复制的模板数据库)。

    屏幕截图显示了包含两个数据库的目录服务器“概览”页。

  2. 返回到 SQL 服务器列表。

  3. 打开保存租户数据库的 tenants1-dpt-<USER> 服务器

  4. 查看以下项:

    • 每个租户数据库都是 50 eDTU 标准池中的一个“弹性标准”数据库。
    • Red Maple Racing 数据库是以前预配的租户数据库。

    屏幕截图显示了服务器中的四个数据库,其中突出显示了红枫赛车数据库。

监视池

LoadGenerator.ps1 运行几分钟后,可提供足够的数据,用于开始查看某些监视功能。 这些功能内置于池和数据库中。

浏览到服务器 tenants1-dpt-<user>,然后选择 Pool1 来查看池的资源利用率。 在以下图表中,负载生成器已运行一个小时。

监视池

  • 第一个图表标记为“资源利用率”,显示池 eDTU 利用率
  • 第二个图表显示池中最活跃的前五个数据库的 eDTU 利用率。

这两个图表说明了弹性池和 SQL 数据库非常适合用于不可预测的 SaaS 应用程序工作负载。 这些图表表明,四个数据库中的每个数据库都激增到高达 40 eDTU,但所有数据库均可由一个 50 eDTU 池轻松提供支持。 50-eDTU 池甚至还可支持更大的工作负载。 如果将这些数据库预配为单一数据库,则每一个数据库都需要是 S2 (50 DTU) 才能支持激增情况。 四个单一 S2 数据库的成本几乎是池价格的三倍。 在实际情况下,SQL 数据库客户在 200 eDTU 的池中最多可运行 500 个数据库。 有关详细信息,请参阅性能监视教程

其他资源

后续步骤

本教程介绍了以下内容:

  • 如何部署 Wingtip Tickets SaaS 应用程序。
  • 关于构成该应用的服务器、池和数据库。
  • 如何通过目录将租户映射到其数据。
  • 如何预配新租户。
  • 如何通过查看池使用率来监视租户活动。
  • 如何删除示例资源以停止相关计费。

接下来,请尝试预配和编录教程