如分布式函数体系结构中所述,Azure SQL 数据库超大规模提供两种不同类型的计算节点(也称为副本):
次要副本始终处于只读状态,可分为三种不同类型:
- 高可用性副本
- 异地复制
- 已命名副本
每种类型具有不同的体系结构、功能集、用途和成本。 根据你需要的功能,可以只使用其中一种类型,也可以将所有三种类型一起使用。 可以将次要副本与无服务器或预配计算层搭配使用。
有关配置和管理超大规模命名副本的教程,请参阅:
高可用性副本
高可用性 (HA) 副本使用与主要副本相同的页面服务器,因此无需进行数据复制即可添加 HA 副本。 HA 副本用于提高数据库可用性;它们充当用于故障转移的热备用副本。 如果主副本不可用,系统会自动且快速地故障转移到现有 HA 副本之一。 连接字符串无需更改;在故障转移期间,由于现有活动连接可能会被断开,应用程序可能会出现短暂中断。 对于这种情况,通常建议采用适当的重试逻辑。 有多个驱动程序已经提供了一定程度的自动重试逻辑。 如果使用 .NET,则最新的 Microsoft.Data.SqlClient 库会为可配置的自动重试逻辑提供原生完全支持。
HA 副本使用的服务器和数据库名称与主要副本相同。 其服务级别目标 (SLO) 也始终与主要副本相同。 HA 副本无法像独立资源那样从门户或任何 API 查看或管理。 它们在计费时所用的计算费率与主要副本相同,但存储成本不适用于次要副本。
可以创建 0 到 4 个 HA 副本。 可以在创建新数据库期间指定副本数,或更新现有数据库的副本数。 可以使用常见的管理终结点和工具(例如:Azure PowerShell、Azure CLI、Azure 门户、REST API)来指定 HA 副本数。 创建或删除 HA 副本不会影响主要副本上运行的活动连接。
识别副本
使用 sys.dm_hs_database_replicas(Transact-SQL) 动态管理视图(DMV)连接到主副本时,可以识别所有 Azure SQL 数据库超大规模副本及其角色。 例如:
SELECT replica_role_desc, replica_server_name, replica_id
FROM sys.dm_hs_database_replicas(DB_ID(N'Contosodb'));
连接到 HA 副本
在超大规模数据库中,客户端使用的连接字符串中的 ApplicationIntent 参数决定连接是路由到可读写的主要副本,还是路由到只读的 HA 副本。 如果 ApplicationIntent 设置为 ReadOnly 并且数据库不具有辅助副本,连接会路由到主要副本并默认执行 ReadWrite 行为。
-- Connection string with application intent
Server=tcp:<myserver>.database.chinacloudapi.cn;Database=<mydatabase>;ApplicationIntent=ReadOnly;User ID=<myLogin>;Password=<password>;Trusted_Connection=False; Encrypt=True;
所有 HA 副本的资源容量都相同。 如果存在多个 HA 副本,则旨在读取的工作负载会任意分布在所有可用的 HA 副本中。 如果存在多个 HA 副本,请记住,每个 HA 副本在处理主要副本上发生的数据更改方面可能会出现不同的数据延迟。 每个 HA 副本使用与同一组页面服务器上的主要副本相同的数据。 但是,每个 HA 副本上的本地缓存通过事务日志服务来反映主要副本上发生的更改,该服务会将主要副本中的日志记录转发到 HA 副本。 因此,根据 HA 副本上执行的工作负载,应用日志记录的速度可能各不相同,因而不同的 HA 副本相对于主要副本而言可能会出现不同的数据延迟。
已命名副本
与 HA 副本一样,命名副本使用与主要副本相同的页面服务器。 类似于 HA 副本,无需进行数据复制即可添加命名副本。
HA 副本和命名副本之间有以下区别:
- 命名副本在门户和 API 调用(Azure CLI、Azure PowerShell、T-SQL)中显示为常规的(只读)Azure SQL 数据库。
- 命名副本的数据库名称可以不同于主要副本,并且可以选择性地放置在不同的逻辑服务器上(前提是位于主要副本所在的同一区域中)。
- 命名副本具有自身的服务级别目标,该目标可以独立于主要副本进行设置和更改。
- 命名副本最多支持 30 个命名副本(对于每个主要副本而言)。
- 命名副本支持通过在托管命名副本的逻辑服务器上创建不同的登录名,对每个命名副本使用不同的身份验证。
因此对于只读工作负载而言,命名副本与 HA 副本相比有诸多优势:
- 如果主副本向上或向下扩展,连接到命名副本的用户也不会被断开连接。
- 对任何已命名副本进行纵向扩展或缩减时,连接到主副本的用户不会受到影响。
命名副本的主要目标是支持各种读扩展场景,并提升混合事务和分析处理 (HTAP) 工作负载的性能。 下面提供了有关如何创建此类解决方案的示例:
此外,命名副本还具备足够的灵活性和弹性,能够满足许多其他使用场景的需求:
- 访问隔离:可以授予对特定命名副本的访问权限,但不能授予对主要副本或其他命名副本的访问权限。
- 工作负载相关的服务级别目标:由于命名副本可以有自身的服务级别目标,因此可为不同的工作负载和用例使用不同的命名副本。 例如,一个命名副本可用于处理 Power BI 请求,而另一个命名副本可用于向 Apache Spark 提供数据,以执行数据科学任务。 每一个都可以拥有独立的服务级别目标,并且独立扩缩容。
- 工作负载相关的路由:在命名副本数最多可达 30 个的情况下,可以按组使用命名副本,使应用程序可以相互隔离。 例如,包含四个命名副本的组可用于为来自移动应用程序的请求提供服务,而包含两个命名副本的另一个组可用于为来自 Web 应用程序的请求提供服务。 采用这种方法可以精细地调整每个组的性能和成本。
注意
有关超大规模命名副本的常见问题解答,请参阅 Azure SQL 数据库超大规模命名副本常见问题解答。
超大规模命名副本的区域冗余
为区域冗余配置的超大规模命名副本使用 Azure 可用性区域将命名副本计算节点分配到 Azure 区域中的不同物理位置。 通过为命名副本选择区域冗余,可以增强超大规模数据库所有层对更广泛故障(包括数据中心中断)的复原能力,而无需对应用程序逻辑进行任何修改。 有关详细信息,请参阅超大规模区域冗余可用性。
有关创建区域冗余超大规模命名副本的教程,请参阅创建超大规模命名副本。
有关故障排除和测试应用程序故障复原能力,请参阅测试应用程序故障复原能力。
异地复制
使用活动异地复制可以在相同或不同的 Azure 区域创建超大规模主要数据库的可读次要副本。 必须在不同的逻辑服务器上创建异地副本。 异地副本的数据库名称始终与主要副本的数据库名称相匹配。
创建异地副本时,会将主要副本中的所有数据复制到一组不同的页面服务器。 异地副本不与主副本共享页面服务器,即使二者位于同一区域。 此体系结构为异地故障转移提供了必要的冗余。
异地副本用于通过异步复制来维护数据库的事务一致性副本。 如果异地副本位于不同的 Azure 区域,当主要区域发生灾难或中断时,便可以使用异地副本进行灾难恢复。 异地复制副本还可用于地理读取横向扩展场景。 自 2022 年 10 月起,支持从超大规模异地辅助副本创建数据库副本。
超大规模数据库的异地复制目前有以下限制:
- 最多只能创建一个异地副本(在相同或不同的区域中)。
- 不支持对异地副本进行时间点还原。
- 不支持创建异地副本的副本(也称为“异地副本链式创建”)。
重要
在同一区域或不同区域中创建多个异地副本的功能是一项预览功能。
疑难解答
排查区域冗余超大规模命名副本问题
有关故障排除和测试应用程序故障复原能力,请参阅测试应用程序故障复原能力。
确保在 PowerShell 和 CLI 中创建区域冗余命名副本时至少指定一个高可用性副本。 有关示例,请参阅创建超大规模命名副本。
- 在 Azure CLI 中,必须同时指定参数
ha-replicas和redundant。 - 在 PowerShell 中,必须指定参数
HighAvailabilityReplicaCount和ZoneRedundant。 - 如果省略,你会收到错误消息:
(ProvisioningDisabled) There is an insufficient number of high availability replicas to enable zone redundancy for a Hyperscale database.
- 在 Azure CLI 中,必须同时指定参数
超大规模数据库应已启用区域冗余,作为为命名副本启用此功能的先决条件。
- 即使主数据库已启用区域冗余,也可选择是否为命名副本启用区域冗余。
- 如果未启用,你会收到错误消息:
(DatabaseNamedReplicaSourceDatabaseNotZoneRedundant) Zone Redundancy cannot be enabled on this Named Replica since the primary Hyperscale Database is not zone redundant.。
已知问题
sys.databases 返回的部分数据不正确
对于 sys.databases 和 name 以外的列中的命名副本,从 database_id 返回的行值可能不一致且不正确。 例如,即使与命名副本对应的主数据库设置为兼容级别 150,命名副本的 compatibility_level 列也可以报告为 140。 如果可能,解决方法是使用 DATABASEPROPERTYEX() 函数获取相同的数据,该函数会返回正确的数据。
相关内容
有关配置和管理超大规模命名副本的教程,请参阅:
有关详细信息,请参阅: