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) 副本数。 为此,请执行以下操作:
- 使用 Azure PowerShell Set-AzSqlElasticPool 命令的
HighAvailabilityReplicaCount
参数。 - 使用 Azure CLI az sql elastic-pool update 命令的
--ha-replicas
参数。
可以使用以下客户端工具来管理弹性池中的超大规模数据库:
- Azure PowerShell:Az.Sql.3.11.0 或更高版本。 不支持 PowerShell AzureRM.Sql。
- Azure CLI:Az version 2.40.0 或更高版本。
- 从以下版本开始的 Transact-SQL (T-SQL):SQL Server Management Studio (SSMS) v18.12.1 或 Azure Data Studio v1.39.1。
将非超大规模数据库转换为超大规模弹性池
将数据库转换为超大规模时,可以将数据库添加到现有的超大规模弹性池。 在进行此类转换时,超大规模弹性池需要与源数据库位于同一逻辑服务器上。
将数据库转换为超大规模弹性池时,请注意每个超大规模弹性池的最大数据库数。
使用 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
的现有超大规模弹性池。 作为示例,以下示例脚本执行以下步骤:
- 使用 Get-AzSqlElasticPoolDatabase cmdlet 列出名为
gpep1
的“常规用途”弹性池中的所有数据库。 Where-Object
cmdlet 会对此列表进行筛选,以仅显示以gpepdb
开头的数据库名称。- 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 监视这些后台转换操作的状态。
资源限制
下面列出了在弹性池中使用超大规模数据库时的支持限制:
- 每个数据库支持的最大数据大小:100 TB。
- 池中的数据库支持的最大数据总大小:100 TB。
- 每个数据库支持的最大事务日志吞吐量:100 MB。
- 池中数据库支持的最大总事务日志吞吐量:131.25 MB/秒。
- 每个超大规模弹性池最多可以有 25 个数据库。
注意
当功能处于预览状态时,性能配置文件、支持的功能和已发布的限制可能会有所变化。 因此,最好使用工作负载的常规功能、性能和规模测试来验证用例。
限制
请考虑以下限制:
- 不支持将现有的非超大规模弹性池更改为超大规模版本。 转换部分提供了一些可以使用的替代方法。
- 不支持将超大规模弹性池的版本更改为非超大规模版本。
- 若要“反向迁移”超大规模弹性池中的某个合格数据库,必须先从超大规模弹性池中删除该数据库。 然后,可以将独立的超大规模数据库“反向迁移”为一个常规用途的独立数据库。
- 不支持将命名副本添加到超大规模弹性池中。 如果尝试将超大规模数据库的命名副本添加到超大规模弹性池,会出现
UnsupportedReplicationOperation
错误。 而是要将命名副本创建为单个超大规模数据库。
已知问题
问题 | 建议 |
---|---|
在 Azure 门户中查看现有超大规模弹性池的“配置”部分时,某些情况下可能不会显示估计的价格。 此问题是由于代码缺陷造成的。 对于非超大规模弹性池,不会观察到此问题。 | 刷新浏览器或切换到“概述”部分,然后返回到“配置”部分,可能会解决问题。 |
将非超大规模数据库添加到超大规模弹性池时,即使超大规模弹性池中少于 25 个 DB,也可能收到错误 {"code":"ElasticPoolDatabaseCountOverLimit","message":"The elastic pool 'MyHyperscaleElasticPool' has reached its database count limit. The database count for the elastic pool cannot exceed (25) for service tier 'Hyperscale'."} 。 此问题是由于代码缺陷造成的。 |
若要解决此问题,可以先将非超大规模数据库转换为独立的超大规模数据库,然后再将其添加到超大规模弹性池。 |
将很多非超大规模数据库添加到超大规模弹性池时,可能会收到错误 Could not perform the operation because server would exceed the allowed Database Throughput Unit quota of 54000. (Code: ServerDtuQuotaExceeded) 。 虽然消息提到数据库吞吐量单位 (DTU),但其实与每个逻辑服务器强制执行的共享 DTU/vCore 配额相关。 此问题是由于其中的 vCore 在单个数据库级别未被正确计算所致。 |
下面是用于解决该问题的一些选项: • 一次将一个数据库添加到超大规模弹性池。 • 先将数据库转换为独立的超大规模数据库,然后再将其添加到超大规模弹性池。 |
在极少数情况下,尝试将超大规模数据库移动/还原/复制到弹性池时,可能会收到错误 45122 - This Hyperscale database cannot be added into an elastic pool at this time. In case of any questions, please contact Microsoft support 。 |
特定于实现的详细信息导致存在此限制。 如果此错误阻止了操作,请提交支持事件以请求帮助。 |