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

Azure SQL 数据库中的超大规模弹性池概述

适用于: Azure SQL 数据库

本文概述了 Azure SQL 数据库中的超大规模弹性池。

Azure SQL 数据库弹性池可使软件即服务 (SaaS) 开发人员在规定的预算内优化一组数据库的价格性能比,同时为每个数据库提供性能弹性。 Azure SQL 数据库超大规模弹性池为超大规模数据库引入了共享资源模型。

有关使用 Azure CLI 或 PowerShell 创建、缩放数据库或将数据库移动到超大规模弹性池的示例,请参阅使用命令行工具处理超大规模弹性池

注意

超大规模弹性池目前处于预览状态。

概述

将超大规模数据库部署到弹性池,可以在池中的数据库之间共享资源,并优化具有不同使用模式的多个数据库的成本。

将弹性池与超大规模数据库配合使用的场景:

  • 当你需要在一个可预测的时间内缩放分配给弹性池的计算资源(与分配的存储量无关)时。
  • 当你要通过添加一个或多个读取缩放副本来横向扩展分配给弹性池的计算资源时。
  • 当你要将高事务日志吞吐量用于写入密集型工作负载(即使计算资源较低)时。

将非超大规模数据库添加到超大规模弹性池,会将数据库转换为超大规模服务层级。

体系结构

传统上,独立的超大规模数据库的体系结构由三个主要的独立组件组成:计算、存储(“页面服务器”)和日志(“日志服务”)。 当你为超大规模数据库创建弹性池时,池中的数据库将共享计算和日志资源。 此外,如果选择配置高可用性,则会为每个高可用性池创建一组等效且独立的计算和日志资源。

下面描述了超大规模数据库弹性池的体系结构:

  • 超大规模弹性池包含一个托管主超大规模数据库的主池,并且还有最多四个额外的高可用性池(如果配置的话)。
  • 主弹性池中托管的主超大规模数据库共享 SQL Server 数据库引擎 (sqlservr.exe) 计算进程、vCore、内存和 SSD 缓存。
  • 为主池配置高可用性会创建额外的高可用性池,其中包含主池中数据库的只读数据库副本。 每个主池最多可以有四个高可用性副本池。 每个高可用性池共享池中的所有辅助只读数据库的计算、SSD 缓存和内存资源。
  • 主弹性池中的超大规模数据库都共享同一个日志服务。 由于高可用性池中的数据库没有写入工作负载,因此它们不利用日志服务。
  • 每个超大规模数据库都有自己的一组页面服务器,这些页面服务器在主池中的主数据库与高可用性池中的所有次要副本数据库之间共享。
  • 可以将异地复制的辅助超大规模数据库放置在另一个弹性池中。
  • 在数据库连接字符串中指定 ApplicationIntent=ReadOnly,会将你路由到其中一个高可用性池中的只读副本数据库。

下图描述了超大规模数据库弹性池的体系结构:

显示超大规模弹性池体系结构的示意图。

管理超大规模弹性池数据库

可以使用相同的命令来管理共用的超大规模数据库,将其作为其他服务层中的共用数据库。 只需在创建超大规模弹性池时,确保为版本指定 Hyperscale

唯一的区别是能够修改现有超大规模弹性池的高可用性 (H/A) 副本数。 为此,请执行以下操作:

可以使用以下客户端工具来管理弹性池中的超大规模数据库:

将非超大规模数据库转换为超大规模弹性池

将数据库转换为超大规模时,可以将数据库添加到现有的超大规模弹性池。 在进行此类转换时,超大规模弹性池需要与源数据库位于同一逻辑服务器上。

将数据库转换为超大规模弹性池时,请注意每个超大规模弹性池的最大数据库数

使用 T-SQL 将非超大规模数据库转换为超大规模弹性池

可以使用 T-SQL 命令转换多个常规用途数据库,并将其添加到名为 hsep1 的现有超大规模弹性池:

ALTER DATABASE gpepdb1 MODIFY (SERVICE_OBJECTIVE = ELASTIC_POOL(NAME = [hsep1]))
ALTER DATABASE gpepdb2 MODIFY (SERVICE_OBJECTIVE = ELASTIC_POOL(NAME = [hsep1]))
ALTER DATABASE gpepdb3 MODIFY (SERVICE_OBJECTIVE = ELASTIC_POOL(NAME = [hsep1]))
ALTER DATABASE gpepdb4 MODIFY (SERVICE_OBJECTIVE = ELASTIC_POOL(NAME = [hsep1]))

在此示例中,通过指定目标 SERVICE_OBJECTIVE 为“超大规模”弹性池,隐式请求从“常规用途”到“超大规模”的转换。 上述每个命令都会开始将相应的常规用途数据库转换为“超大规模”。 这些 ALTER DATABASE 命令返回速度快,不需要等待转换完成。 在所示的示例中,将有四个此类转换从“常规用途”迁移到并行运行的“超大规模”。

可以查询 sys.dm_operation_status 动态管理视图来监视这些后台转换操作的状态。

使用 PowerShell 将非超大规模数据库转换为超大规模弹性池

可以使用 PowerShell 命令转换多个常规用途数据库,并将其添加到名为 hsep1 的现有超大规模弹性池。 作为示例,以下示例脚本执行以下步骤:

  1. 使用 Get-AzSqlElasticPoolDatabase cmdlet 列出名为 gpep1 的“常规用途”弹性池中的所有数据库。
  2. Where-Object cmdlet 会对此列表进行筛选,以仅显示以 gpepdb 开头的数据库名称。
  3. Set-AzSqlDatabase cmdlet 为每个数据库启动转换。 在此示例中,通过指定名为 hsep1 的目标超大规模弹性池,隐式请求转换到超大规模服务层级。
    • -AsJob 参数允许每个 Set-AzSqlDatabase 请求并行运行。 如果希望逐个运行转换,可以删除参数 -AsJob
$dbs = Get-AzSqlElasticPoolDatabase -ResourceGroupName "myResourceGroup" -ServerName "mylogicalserver" -ElasticPoolName "gpep1"
$dbs | Where-Object { $_.DatabaseName -like "gpepdb*" } | % { Set-AzSqlDatabase -ResourceGroupName "myResourceGroup" -ServerName "mylogicalserver" -DatabaseName ($_.DatabaseName) -ElasticPoolName "hsep1" -AsJob }

除了 sys.dm_operation_status 动态管理视图,还可以使用 PowerShell cmdlet Get-AzSqlDatabaseActivity 监视这些后台转换操作的状态。

资源限制

下面列出了在弹性池中使用超大规模数据库时的支持限制:

  • 受支持的硬件代系:标准系列 (Gen5)、高级系列和经内存优化的高级系列。
  • 每个池的最大 vCore 数量:80 或 128 个 vCore,具体取决于服务级别目标。
  • 每个数据库支持的最大数据大小:100 TB。
  • 池中的数据库支持的最大数据总大小:100 TB。
  • 每个数据库支持的最大事务日志吞吐量:100 MB。
  • 池中数据库支持的最大总事务日志吞吐量:131.25 MB/秒。
  • 每个超大规模弹性池最多可以有 25 个数据库。

有关更多详细信息,请参阅针对标准系列高级系列经内存优化的高级系列的超大规模弹性池的资源限制。

注意

当功能处于预览状态时,性能配置文件、支持的功能和已发布的限制可能会有所变化。 因此,最好使用工作负载的常规功能、性能和规模测试来验证用例。

限制

请考虑以下限制:

  • 不支持将现有的非超大规模弹性池更改为超大规模版本。 转换部分提供了一些可以使用的替代方法。
  • 不支持将超大规模弹性池的版本更改为非超大规模版本。
  • 若要“反向迁移”超大规模弹性池中的某个合格数据库,必须先从超大规模弹性池中删除该数据库。 然后,可以将独立的超大规模数据库“反向迁移”为一个常规用途的独立数据库。
  • 对于“超大规模”服务层级,区域冗余支持只能在数据库或弹性池创建期间指定,并且在资源预配后不能修改。 有关详细信息,请参阅将 Azure SQL 数据库迁移到可用性区域支持
  • 不支持将命名副本添加到超大规模弹性池中。 如果尝试将超大规模数据库的命名副本添加到超大规模弹性池,会出现 UnsupportedReplicationOperation 错误。 而是要将命名副本创建为单个超大规模数据库。

区域冗余弹性池注意事项

下面是区域冗余超大规模弹性池的一些注意事项:

注意

具有区域冗余的超大规模弹性池已经可用,当前处于预览阶段。 有关详细信息,请查看博客文章:具有区域冗余的超大规模弹性池

  • 只有具有区域冗余存储冗余(ZRS 或 GZRS)的数据库才能添加到具有区域冗余的超大规模弹性池。
  • 必须创建具有区域冗余和区域冗余备份存储(ZRS 或 GZRS)的独立超大规模数据库,才能将其添加到区域冗余的超大规模弹性池。 对于不具有区域冗余的超大规模数据库,请执行数据传输,将数据迁移到启用了区域冗余选项的新超大规模数据库。 必须使用数据库复制、时间点还原或异地副本创建克隆。 有关详细信息,请参阅重新部署(超大规模)
  • 要将超大规模数据库从一个弹性池移到另一个弹性池,区域冗余和区域冗余备份存储设置必须匹配。
  • 若要将数据库从另一个非超大规模服务层级转换为具有区域冗余的超大规模弹性池:
    • 在 Azure 门户中,首先启用区域冗余和区域冗余备份存储 (ZRS)。 然后,就可以将数据库添加到区域冗余超大规模弹性池。
    • 在 PowerShell 中,首先启用区域冗余。 然后使用 Set-AzSqlDatabase,确保 -BackupStorageRedundancy 参数用于指定区域冗余备份存储(ZRS 或 GZRS)。

已知问题

问题 建议
将很多非超大规模数据库添加到超大规模弹性池时,可能会收到错误 Could not perform the operation because server would exceed the allowed Database Throughput Unit quota of 54000. (Code: ServerDtuQuotaExceeded)。 虽然消息提到数据库吞吐量单位 (DTU),但其实与每个逻辑服务器强制执行的共享 DTU/vCore 配额相关。 此问题是由于其中的 vCore 在单个数据库级别未被正确计算所致。 可选择以下几种方式来解决此问题:
• 一次只向超大规模弹性池添加一个数据库。
• 先将数据库转换为独立超大规模数据库,然后再添加到超大规模弹性池。
• 如此处所述,请求增加服务器级别配额。
为区域冗余超大规模弹性池中的数据库设置异地复制,目的地为另一个区域中的非区域冗余超大规模弹性池时失败,提示错误 Provisioning of zone redundant Hyperscale database with local backup redundancy is not supported. Zone redundant Hyperscale databases must use either zone or geo zone backup redundancy。 如果第二个超大规模弹性池要么是区域冗余,要么在同一区域里,则不会发生此错误。 若要解决此问题,可以使用 Azure PowerShell 在命令行 New-AzSqlDatabaseSecondary -ResourceGroupName "primary-rg" -ServerName "primary-server" -DatabaseName "hsdb1" -PartnerResourceGroupName "secondary-rg" -PartnerServerName "secondary-server" -AllowConnections "All" -SecondaryElasticPoolName "secondary-nonzr-pool" -BackupStorageRedundancy Local -ZoneRedundant:$false 中明确指定非区域冗余。
将区域冗余超大规模弹性池中的数据库添加到另一个区域里使用非区域冗余超大规模弹性池的故障转移群组,将会在内部出现故障,但此操作可能会显示为正在运行,但不显示进度。 使用 SSMS 等工具时可能会看到异地辅助数据库,但无法连接和使用。 故障转移群组可能将异地辅助数据库的状态显示为“Seeding 0%”。 如果第二个超大规模弹性池是区域冗余,则不会发生此错误。 若要解决此问题,可使用 Azure PowerShell 在故障转移群组以外设置异地复制,在命令行 New-AzSqlDatabaseSecondary -ResourceGroupName "primary-rg" -ServerName "primary-server" -DatabaseName "hsdb1" -PartnerResourceGroupName "secondary-rg" -PartnerServerName "secondary-server" -AllowConnections "All" -SecondaryElasticPoolName "secondary-nonzr-pool" -BackupStorageRedundancy Local -ZoneRedundant:$false 中明确指定非区域冗余。 然后,即可将数据库添加到故障转移群组中。
在极少数情况下,尝试将超大规模数据库移动/还原/复制到弹性池时,可能会收到错误 45122 - This Hyperscale database cannot be added into an elastic pool at this time. In case of any questions, please contact Microsoft support 特定于实现的详细信息导致存在此限制。 如果此错误阻止了操作,请提交支持事件以请求帮助。