Scaling out with Azure SQL Database(使用 Azure SQL 数据库进行扩展)

适用于:Azure SQL 数据库

可以使用“弹性数据库”工具轻松地扩展 Azure SQL 数据库中的数据库。 借助这些工具和功能,可以使用 Azure SQL 数据库中的数据库资源来为事务工作负荷,尤其是服务型软件 (SaaS) 应用程序创建解决方案。 弹性数据库包括:

  • 弹性数据库客户端库:客户端库是一项功能,可用于创建和维护分片数据库。 请参阅弹性数据库工具入门
  • 弹性数据库拆分/合并工具:在分片数据库之间移动数据。 此工具对于将数据从多租户数据库移动到单租户数据库很有用(反之亦然)。 请参阅弹性数据库拆分/合并工具教程
  • 弹性数据库作业(预览版):使用作业来管理 Azure SQL 数据库中的大量数据库。 轻松执行管理操作,例如,使用作业更改架构、管理凭据、更新引用数据、收集性能数据,或收集租户(客户)遥测数据。
  • 弹性数据库查询(预览版):可跨多个数据库运行 Transact-SQL 查询。 这样,便可以连接到 Excel、Power BI、Tableau 等报表工具。
  • 弹性事务:使用此功能可跨多个数据库运行事务。 弹性数据库事务适用于使用 ADO .NET 的 .NET 应用程序,并且与你熟悉的使用 System.Transaction类的编程体验相集成。

下图显示了一种体系结构,它包含与数据库集合有关的弹性数据库功能。

在此图中,数据库颜色表示架构。 颜色相同的数据库具有相同的架构。

  1. 一组使用分片体系结构的 SQL 数据库托管在 Azure 上。
  2. 弹性数据库客户端库 用于管理分片集。
  3. 一个数据库子集已放入弹性池。 (请参阅什么是池?)。
  4. 弹性数据库针对所有数据库运行计划的或即席的 T-SQL 脚本。
  5. 拆分/合并工具用于将数据从一个分片移到另一个分片。
  6. 使用 弹性数据库查询 可以编写跨分片集中所有数据库运行的查询。
  7. 弹性事务允许跨多个数据库运行事务。

Elastic Database tools

为什么使用这些工具?

VM 和 blob 存储可以轻松实现云应用程序的弹性和缩放需求 - 只需添加或减少单位,或者增加功率。 但对于关系数据库中的有状态数据处理,这仍是一个挑战。 在这些情况下出现的难题:

  • 增加和缩小工作负载的关系数据库部分的容量。
  • 管理可能会影响特定数据子集的热点 - 例如,繁忙的最终客户(租户)。

过去以来,在解决此类情况时,一般都是投资更大规模的服务器来支持应用程序。 但是,在预定义商品硬件上执行所有处理的云中,此选项受限制。 将数据和处理负载分散到许多结构相同的数据库(一种称为“分片”的向外缩放模式),无论在成本还是弹性上,都是超越传统向上缩放方法的另一种选择。

横向缩放与纵向缩放

下图显示了缩放的横向和纵向维度,即弹性数据库的基本缩放方法。

Horizontal versus vertical scale-out

水平缩放是指添加或删除数据库,以调整容量或整体性能,也称为“横向扩展”。 分片是常用的横向缩放实现方法,它会将数据分区到结构相同的一组数据库上。

垂直缩放是指增加或减少单个数据库的计算大小,也称为“纵向扩展”。

大多数云规模的数据库应用程序都使用这两种策略的组合。 例如,软件即服务应用程序可能使用横向缩放来预配新的最终客户,使用纵向缩放来允许每个最终客户的数据库根据工作负荷的需要增加或缩减资源。

  • 可以使用弹性数据库客户端库来管理水平缩放。
  • 可以通过使用 Azure PowerShell cmdlet 更改服务层级或者通过将数据库放入弹性池中,来实现纵向缩放。

分片

分片是一项可跨许多独立数据库、分发大量相同结构数据的技术。 这项技术尤其受到最终客户或企业创建软件即服务 (SAAS) 产品的云开发人员的欢迎。 这些最终客户通常称为“租户”。 需要分片的原因有很多:

  • 数据总量过大,超出单一数据库的约束范围
  • 整个工作负载的事务吞吐量超出单一数据库的容量
  • 租户可能需要与其他租户物理隔离,因此每个租户都需要单独的数据库
  • 由于符合性、性能或地理政治的原因,不同的数据库部分可能需要驻留在不同的地域中。

在其他方案(例如从分布式设备中引入数据)中,分片可用于填充临时组织的一组数据库。 例如,可以在每天或每周专门使用某个单独的数据库。 在该情况下,分片键可以是一个表示日期的整数(显示在分片表的所有行中),应用程序必须将用于检索有关日期范围的信息的查询路由到涉及相关范围的数据库子集。

当应用程序中的每个事务均受限于分片键的单个值时,分片效果最佳。 这确保了所有事务对特定数据库而言都是本地的。

多租户和单租户

某些应用程序使用最简单的方法为每个租户创建一个单独的数据库。 此方法是单租户分片模式,它提供了隔离、备份/还原功能,还可根据租户粒度进行资源缩放。 借助单租户分片,每个数据库都将与特定租户 ID 值(或客户键值)关联,而该键无需始终出现在数据本身中。 应用程序负责将每个请求路由到相应的数据库 - 客户端库可以简化这种操作。

Single tenant versus multi-tenant

其他方案是将多个租户一同打包到数据库中,而非将其隔离到单独的数据库中。 此模式是典型的多租户分片模式,该模式可能取决于应用程序可管理大量极小型租户这一情况。 在多租户分片中,数据库表中的行全都被设计为带有可标识租户 ID 的键或分片键。 同样,应用程序层负责将租户的请求路由到相应的数据库,而弹性数据库客户端库可以支持这种操作。 另外,可以使用低级别安全性来筛选每个租户可以访问的行。 多租户分片模式可能需要在数据库之间重新分配数据,而弹性数据库拆分/合并工具可帮助实现此目的。

将数据从多租户数据库移到单租户数据库

在创建 SaaS 应用程序时,通常会给潜在客户提供试用版本。 在此情况下,使用多租户数据库来处理数据较符合成本效益。 不过,当潜在客户成为真正客户后,单租户数据库就更好,因为它提供更好的性能。 如果客户在试用期间创建了数据,可以使用拆分/合并工具将数据从多租户数据库移到新的单租户数据库。

注意

无法从多租户数据库还原到单个租户。

后续步骤

有关演示客户端库的示例应用,请参阅弹性数据库工具入门

若要转换现有的数据库以使用该工具,请参阅迁移要扩展的现有数据库

若要查看弹性池的具体信息,请参阅弹性池的价格和性能注意事项,或者参考弹性池创建新池。

其他资源

尚未使用弹性数据库工具? 请查看入门指南