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

在使用分片多租户数据库的 SaaS 应用程序中管理架构

适用于: Azure SQL 数据库

本教程探讨在软件即服务 (SaaS) 应用程序中维护大批量数据库时存在的挑战。 介绍有关跨大批量数据库规划架构更改的解决方案。

与任何应用程序一样,Wingtip Tickets SaaS 应用也会随时间不断改进,并且会不时需要对数据库进行更改。 这些更改可能会影响架构或引用数据,或需要实施数据库维护任务。 如果 SaaS 应用程序使用“每租户一个数据库”模式,则有可能必须在数目庞大的租户数据库中协调更改。 此外,必须将这些更改并入数据库预配过程,以确保新数据库在创建时便包含这些更改。

两种方案

本教程探讨以下两种方案:

  • 为所有租户部署引用数据更新。
  • 对包含引用数据的表格重新构建索引。

使用 Azure SQL 数据库的弹性作业功能跨租户数据库执行这些操作。 此外,还要针对“模板”租户数据库运行作业。 在 Wingtip Tickets 示例应用中,将复制此模板数据库,用于预配新租户数据库。

本教程介绍如何执行下列操作:

  • 创建作业代理。
  • 在多个租户数据库上执行 T-SQL 查询。
  • 更新所有租户数据库中的引用数据。
  • 在所有租户数据库中的表上创建索引。

先决条件

  • 须已部署 Wingtip Tickets 多租户数据库应用:

    • 有关说明,请参阅第一篇教程,其中介绍了 Wingtip Tickets SaaS 多租户数据库应用:
      部署和浏览使用 Azure SQL 数据库的分片多租户应用程序
      • 在五分钟内可以完成部署过程。
    • 必须已安装 Wingtip 的分片多租户版本。 “独立”版本和“基于租户的数据库”版本不支持此教程中的操作。
  • 必须已安装最新版本的 SQL Server Management Studio (SSMS)。 下载并安装 SSMS

  • 必须已安装 Azure PowerShell。 有关详细信息,请参阅 Azure PowerShell 入门

SaaS 架构管理模式简介

此示例中使用的分片多租户数据库模型使租户数据库能够包含一个或多个租户。 此示例探索将多租户和单租户数据库混用,实现混合租户管理模式的潜在可能性。 管理这些数据库的更改可能会比较复杂。 弹性作业有利于大批量数据库的管理。 可以使用作业,以任务的形式安全可靠地针对一组租户数据库运行 T-SQL 脚本。 这些任务不需要用户交互或输入。 可以使用此方法跨应用程序中的所有租户部署对架构和常见引用数据所做的更改。 此外,还可以使用弹性作业来维护数据库的黄金模板副本。 该模板用于创建新租户,始终确保使用最新的架构和引用数据。

屏幕

弹性作业

2024 年,弹性作业作为一种具有新功能的正式发布产品发布。 Azure SQL 数据库的一种集成功能,请参阅弹性数据库作业

获取 Wingtip Tickets SaaS 多租户数据库应用程序源代码和脚本

可在 GitHub 上的 WingtipTicketsSaaS-MultiTenantDB 存储库中查看 Wingtip Tickets SaaS 多租户数据库脚本和应用程序源代码。 有关下载和取消阻止 Wingtip Tickets SaaS 脚本的步骤,请参阅常规指南

创建作业代理数据库和新的作业代理

本教程要求使用 PowerShell 来创建作业代理数据库和作业代理。 与 SQL 代理使用的 msdb 数据库一样,作业代理使用 Azure SQL 数据库中的数据库来存储作业定义、作业状态和历史记录。 创建作业代理后,即可立刻创建和监视作业。

  1. 在 PowerShell ISE 中,打开 ...\Learning Modules\Schema Management\Demo-SchemaManagement.ps1。
  2. F5 运行脚本。

Demo-SchemaManagement.ps1 脚本调用 Deploy-SchemaManagement.ps1 脚本,以便在目录服务器上创建名为 jobagent 的数据库。 然后该脚本创建作业代理,将 jobagent 数据库作为参数传递。

创建一个将新的引用数据部署到所有租户的作业

准备

每个租户数据库在 VenueTypes 表中包含一组地点类型。 每个地点类型用于定义可在某个地点托管的事件种类。 这些地点类型对应于在租户事件应用中看到的背景图。 在本练习中,将一个更新部署到所有数据库,以便添加两种额外的地点类型:“赛车”和“游泳俱乐部”

首先,查看每个租户数据库中包含的地点类型。 连接 SQL Server Management Studio (SSMS) 中的一个租户数据库,并检查 VenueTypes 表。 还可在通过数据库页访问的 Azure 门户的查询编辑器中查询此表。

  1. 打开 SSMS 并连接到租户服务器:tenants1-dpt-<user>.database.windows.net
  2. 要确认“赛车”和“游泳俱乐部”当前包含在内,请浏览到 contosoconcerthall 数据库(tenants1-dpt-<user> 服务器上),然后查询 VenueTypes 表。

步骤

现在请创建一个作业,以通过添加两个新的地点类型来更新每个租户数据库中的 VenueTypes 表。

若要创建新作业,可以使用在 jobagent 数据库中创建的作业集系统存储过程。 这些存储过程是在创建作业代理时创建的。

  1. 在 SSMS 中连接至租户服务器:tenants1-mt-<user>.database.windows.net

  2. 浏览到 tenants1tenants1 数据库。

  3. 查询 VenueTypes 表以确认“赛车”和“游泳俱乐部”是否不在结果列表中。

  4. 连接到目录服务器:catalog-mt-<user>.database.windows.net

  5. 连接到目录服务器中的 jobagent 数据库。

  6. 在 SSMS 中,打开 ...\Learning Modules\Schema Management\DeployReferenceData.sql 文件。

  7. 修改语句 set @User = <user>,并将其替换为部署 Wingtip 票证 SaaS 多租户数据库应用程序时所用的用户值。

  8. F5 运行脚本。

观察

DeployReferenceData.sql 脚本中观察以下项:

  • sp_add_target_group 创建目标组名称 DemoServerGroup,并将目标成员添加到该组。

  • sp_add_target_group_member 添加以下项:

    • server 目标成员类型。
      • 这是包含租户数据库的 tenants1-mt-<user> 服务器。
      • 包含服务器指包括作业执行时存在的租户数据库。
    • 位于 catalog-mt-<user> 服务器上的模板数据库 (basetenantdb) 的 database 目标成员类型,
    • database 目标成员类型,用于包含本教程稍后使用的 adhocreporting 数据库。
  • sp_add_job 创建名为“参考数据部署”的新作业。

  • sp_add_jobstep 创建包含 T-SQL 命令文本的作业步骤,该文本用于更新引用表 VenueTypes

  • 脚本中的剩余视图显示存在的对象以及监视作业执行情况。 使用这些查询查看“生命周期”列中的状态值,确定何时作业完成。 该作业将更新租户数据库,并更新包含引用表的其他两个数据库。

在 SSMS 中,浏览到 tenants1-mt-<user> 服务器上的租户数据库。 查询 VenueTypes 表以确认“赛车”和“游泳俱乐部”现在是否已添加到表中。 地点类型的总计数应已增加两个。

创建管理引用表索引的作业

本练习在所有租户数据库上创建了一个作业用于根据引用表主键重建索引。 索引重建是一个典型的数据库管理操作,载入大量数据负载后,管理员可以运行该操作来提高性能。

  1. 在 SSMS 中,连接到 catalog-mt-<user>.database.windows.net 服务器中的 jobagent 数据库。

  2. 在 SSMS 中,打开 ...\Learning Modules\Schema Management\OnlineReindex.sql 文件。

  3. F5 运行脚本。

观察

OnlineReindex.sql 脚本中观察以下项:

  • sp_add_job 创建一个名为 Online Reindex PK__VenueTyp__265E44FD7FD4C885 的新作业。

  • sp_add_jobstep 创建包含 T-SQL 命令文本的作业步骤,该文本用于更新索引。

  • 脚本监视器作业执行中的剩余视图。 使用这些查询查看“生命周期”列中的状态值,确定何时作业成功地在目标组会员上完成lifecycle

其他资源

后续步骤

本教程介绍了如何:

  • 创建作业代理跨多个数据库运行 T-SQL 作业
  • 更新所有租户数据库中的引用数据
  • 在所有租户数据库中的表上创建索引

接下来,请试用特别报告教程,了解如何跨租户数据库运行分布式查询。