Skip to content

SQLServer Always On 可用性组

Always On 可用性组概述

Always On 可用性组(Always On Availability Groups,简称 AG)是 SQL Server 2012 及以上版本提供的数据库级高可用性和灾难恢复解决方案。它允许多个数据库作为一个组进行故障切换,提供自动和手动故障切换选项,支持可读辅助副本,实现读写分离。

核心组件

  • 可用性组:包含一个主数据库和一个或多个辅助数据库的集合,作为一个单元进行故障切换
  • 主副本:处理所有读写操作的数据库副本,是可用性组的主要访问点
  • 辅助副本:主数据库的只读副本,可用于故障切换、只读查询和备份操作
  • 可用性数据库:属于可用性组的数据库,在主副本和辅助副本之间同步
  • 监听器:提供客户端连接的统一入口,包含虚拟网络名称和虚拟 IP 地址
  • 端点:用于副本间通信的 TCP 端点,基于证书或 Windows 身份验证

主要特性

  • 支持多达 9 个辅助副本(SQL Server 2016 及以上)
  • 提供自动和手动故障切换选项
  • 支持可读辅助副本,实现读写分离
  • 支持同步和异步提交模式,适应不同部署场景
  • 提供自动页修复,提高数据可靠性
  • 支持跨数据中心部署,实现灾难恢复
  • 支持从辅助副本备份,减少主副本负载
  • 提供灵活的故障切换策略

架构设计

基本架构

Always On 可用性组架构由以下核心组件组成:

  • Windows Server 故障切换集群 (WSFC):AG 依赖 WSFC 进行集群管理、故障检测和资源调度
  • SQL Server 实例:至少两个 SQL Server 实例,包括一个主实例和一个或多个辅助实例
  • 可用性组:定义需要进行故障切换的数据库集合
  • 监听器:客户端连接的统一入口
  • 网络配置:包括副本间通信网络和客户端访问网络

副本类型

同步提交副本

  • 主副本等待辅助副本确认已将日志写入磁盘后才提交事务
  • 提供零数据丢失保证
  • 适用于近距离部署(同一数据中心)
  • 支持自动故障切换

异步提交副本

  • 主副本不等待辅助副本确认,直接提交事务
  • 可能导致数据丢失(在故障切换时)
  • 适用于远距离部署(跨数据中心)
  • 仅支持手动或强制故障切换

配置副本

  • 仅用于 WSFC 配置,不参与数据同步
  • 用于扩展 WSFC 到多个站点
  • 不影响 AG 的性能

故障切换模式

自动故障切换

  • 当主副本不可用时,自动切换到同步提交的辅助副本
  • 切换条件:
    • 主副本不可用
    • 至少一个同步提交的辅助副本可用且同步
    • WSFC 仲裁正常
  • 适用于关键业务系统

手动故障切换

  • 管理员手动触发故障切换
  • 用于计划内维护,如操作系统升级、硬件维护等
  • 要求主副本和目标辅助副本处于同步状态
  • 无数据丢失

强制故障切换

  • 在没有同步确认的情况下进行故障切换
  • 可能导致数据丢失
  • 仅在紧急情况下使用
  • 适用于主副本完全不可用且无法恢复的情况

配置步骤

前提条件

  1. 所有服务器已加入同一个 Active Directory 域
  2. 已安装并配置 Windows Server 故障切换集群 (WSFC)
  3. 所有 SQL Server 实例均为 Enterprise Edition 或更高版本
  4. 所有 SQL Server 实例已启用 Always On 可用性组功能
  5. 数据库已设置为 FULL 恢复模式
  6. 已创建数据库的完整备份

详细配置步骤

启用 Always On 可用性组功能

sql
-- 在所有实例上执行
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'always on availability groups', 1;
RECONFIGURE;
-- 需要重启 SQL Server 服务

创建端点

sql
-- 在所有实例上执行
CREATE ENDPOINT [Hadr_endpoint]
    STATE=STARTED
    AS TCP (LISTENER_PORT=5022, LISTENER_IP=ALL)
    FOR DATABASE_MIRRORING (
        ROLE=ALL,
        AUTHENTICATION=WINDOWS NEGOTIATE,
        ENCRYPTION=REQUIRED ALGORITHM AES
    );

创建可用性组

sql
CREATE AVAILABILITY GROUP [AG_SalesDB]
FOR DATABASE [SalesDB]
REPLICA ON
N'SQLInstance1' WITH (
   ENDPOINT_URL = N'TCP://SQLInstance1:5022',
   AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
   FAILOVER_MODE = AUTOMATIC,
   SEEDING_MODE = AUTOMATIC,
   SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
),
N'SQLInstance2' WITH (
   ENDPOINT_URL = N'TCP://SQLInstance2:5022',
   AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
   FAILOVER_MODE = AUTOMATIC,
   SEEDING_MODE = AUTOMATIC,
   SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
);

加入辅助副本

sql
-- 在所有辅助实例上执行
ALTER AVAILABILITY GROUP [AG_SalesDB] JOIN;
ALTER AVAILABILITY GROUP [AG_SalesDB] GRANT CREATE ANY DATABASE;

配置监听器

sql
ALTER AVAILABILITY GROUP [AG_SalesDB]
ADD LISTENER N'AGListener' (WITH IP = (N'192.168.1.100', N'255.255.255.0'), PORT = 1433);

验证配置

sql
-- 检查可用性组状态
SELECT ag.name, ags.primary_replica, ags.synchronization_health_desc
FROM sys.availability_groups ag
JOIN sys.dm_hadr_availability_group_states ags ON ag.group_id = ags.group_id;

-- 检查可用性数据库状态
SELECT db_name(drs.database_id) AS database_name, ar.replica_server_name, drs.synchronization_state_desc
FROM sys.dm_hadr_database_replica_states drs
JOIN sys.availability_replicas ar ON drs.replica_id = ar.replica_id;

版本差异

SQL Server 2012

  • 最大支持 4 个辅助副本
  • 不支持自动种子设定,需要手动初始化辅助数据库
  • 不支持从辅助副本备份
  • 不支持多个子网上的监听器
  • 基础的自动故障切换功能

SQL Server 2014

  • 最大支持 4 个辅助副本
  • 引入自动种子设定功能,简化辅助数据库初始化
  • 支持从辅助副本备份,减轻主副本负载
  • 支持多个子网上的监听器
  • 增强了性能和可靠性

SQL Server 2016

  • 最大支持 9 个辅助副本
  • 引入基本可用性组(Standard Edition 支持,仅 2 个副本)
  • 引入分布式可用性组,支持跨多个 WSFC 集群
  • 增强了自动种子设定功能
  • 支持辅助副本的事务日志压缩

SQL Server 2017

  • 支持Linux 上的 Always On 可用性组
  • 支持容器化部署
  • 增强了性能和可靠性
  • 引入可读路由自动重定向
  • 支持自动页修复增强

SQL Server 2019

  • 引入托管实例上的可用性组
  • 增强了分布式可用性组功能
  • 支持辅助副本的即时文件初始化
  • 改进了 Always On 仪表板

SQL Server 2022

  • 增强了自动种子设定性能
  • 引入可用性组的智能查询处理
  • 支持辅助副本的备份压缩
  • 改进了可用性组的监控和故障排除

故障切换操作

自动故障切换

当主副本发生故障时,WSFC 会自动检测并触发故障切换到同步提交的辅助副本。自动故障切换是无缝的,客户端通过监听器连接时无需修改连接字符串。

手动故障切换

用于计划内维护,步骤如下:

  1. 确保主副本和目标辅助副本处于同步状态
  2. 执行手动故障切换命令
sql
ALTER AVAILABILITY GROUP [AG_SalesDB] FAILOVER;
  1. 验证故障切换后的状态,确保新主副本正常运行

强制故障切换

仅在紧急情况下使用,可能导致数据丢失:

sql
ALTER AVAILABILITY GROUP [AG_SalesDB] FORCE_FAILOVER_ALLOW_DATA_LOSS;

注意:强制故障切换后,需要重新配置 AG,将原主副本(如果已恢复)作为辅助副本加入。

生产场景应用

场景1:企业核心业务系统高可用性

场景描述:某银行核心交易系统需要 99.99% 可用性,要求零数据丢失,支持自动故障切换。

解决方案

  • 配置 3 节点同步提交 AG 集群
  • 主副本处理所有写操作
  • 两个辅助副本用于故障切换和只读查询
  • 配置自动故障切换
  • 配置 AG 监听器,客户端通过监听器连接

关键配置

  • 副本模式:3 个同步提交副本
  • 故障切换模式:自动
  • 种子设定模式:自动
  • 辅助副本只读:启用

场景2:跨数据中心灾难恢复

场景描述:某电商平台需要实现跨数据中心灾难恢复,确保在一个数据中心发生灾难时,业务能快速恢复。

解决方案

  • 主数据中心:2 个同步提交副本,实现本地高可用性
  • 灾难恢复数据中心:1 个异步提交副本,实现灾难恢复
  • 配置分布式可用性组,跨两个数据中心的 WSFC 集群
  • 定期测试灾难恢复流程

关键配置

  • 主数据中心:同步提交,自动故障切换
  • 灾难恢复中心:异步提交,手动/强制故障切换
  • 网络:确保跨数据中心网络带宽充足

场景3:读写分离实现

场景描述:某报表系统需要访问实时数据,但直接查询主数据库会影响交易性能。

解决方案

  • 配置主副本处理写操作
  • 配置多个辅助副本用于只读查询
  • 配置可读路由,实现自动读写分离
  • 报表应用连接到辅助副本或通过可读路由访问

关键配置

  • 辅助副本允许只读连接:SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
  • 配置可读路由列表
  • 客户端连接字符串中添加 ApplicationIntent=ReadOnly

场景4:数据库迁移

场景描述:某企业需要将数据库从旧服务器迁移到新服务器,要求最小停机时间。

解决方案

  • 在新服务器上配置为辅助副本
  • 等待数据同步完成
  • 执行手动故障切换
  • 验证新服务器正常运行后,移除旧服务器

优势

  • 迁移过程中业务持续可用
  • 停机时间仅为故障切换时间(通常几秒到几十秒)
  • 可回滚(如果新服务器出现问题)

监控与管理

监控工具

SQL Server Management Studio (SSMS)

  • Always On 仪表板:可视化监控 AG 状态、同步情况和故障切换历史
  • 可用性组节点:在对象资源管理器中直接管理 AG 配置
  • 图形化故障切换:支持通过 GUI 进行手动故障切换

动态管理视图 (DMV)

sql
-- 监控可用性组状态
SELECT 
    ag.name AS ag_name,
    ags.primary_replica,
    ags.synchronization_health_desc
FROM sys.dm_hadr_availability_group_states ags
JOIN sys.availability_groups ag ON ags.group_id = ag.group_id;

-- 监控同步延迟
SELECT 
    db_name(drs.database_id) AS database_name,
    ar.replica_server_name,
    drs.log_send_queue_size,
    drs.redo_queue_size,
    drs.last_hardened_lsn,
    drs.last_redone_lsn
FROM sys.dm_hadr_database_replica_states drs
JOIN sys.availability_replicas ar ON drs.replica_id = ar.replica_id;

Extended Events

创建事件会话监控 AG 相关事件:

sql
CREATE EVENT SESSION [AG_Monitor] ON SERVER 
ADD EVENT sqlserver.hadr_availability_group_state_change,
ADD EVENT sqlserver.hadr_availability_replica_state_change,
ADD EVENT sqlserver.hadr_database_replica_state_change,
ADD EVENT sqlserver.hadr_failover,
ADD EVENT sqlserver.hadr_failover_mode_change
ADD TARGET package0.ring_buffer(SET max_memory=4096);

ALTER EVENT SESSION [AG_Monitor] ON SERVER STATE=START;

PowerShell

使用 PowerShell 脚本监控和管理 AG:

powershell
# 获取可用性组状态
Get-DbaAgReplica -SqlInstance sqlserver | Select-Object AvailabilityGroup, Name, Role, SynchronizationState

# 获取可用性数据库状态
Get-DbaAgDatabase -SqlInstance sqlserver | Select-Object AvailabilityGroup, Replica, DatabaseName, SynchronizationState

常见问题(FAQ)

Always On 可用性组与故障转移集群实例(FCI)有什么区别?

答案

  • 保护级别:AG 提供数据库级别的保护,FCI 提供实例级别的保护
  • 存储依赖:AG 不依赖共享存储,每个副本有自己的存储;FCI 依赖共享存储
  • 故障切换范围:AG 可以只切换特定数据库组,FCI 切换整个实例
  • 扩展性:AG 支持更多副本(最多 9 个),FCI 节点数量受限于 WSFC
  • 使用场景:AG 适用于需要数据库级别保护和读写分离的场景;FCI 适用于需要实例级别保护的场景

可用性组可以包含多少个数据库?

答案

  • SQL Server 2012 及以上版本支持每个可用性组包含多达 100 个数据库
  • 实际数量取决于硬件资源和数据库大小

辅助副本可以用于哪些用途?

答案

  • 故障切换目标,提供高可用性
  • 只读查询,实现读写分离
  • 备份操作,减少主副本负载
  • 灾难恢复,实现异地保护

如何实现跨版本的 Always On 可用性组?

答案

  • 支持从低版本到高版本的升级场景
  • 不支持在同一 AG 中混合运行不同主版本的 SQL Server
  • 升级步骤:
    1. 先升级所有辅助副本
    2. 手动故障切换到已升级的辅助副本
    3. 升级原主副本
    4. 可选:将原主副本作为辅助副本重新加入

如何备份可用性组中的数据库?

答案

  • 主副本:支持所有类型的备份(完整、差异、日志)
  • 辅助副本:支持日志备份和差异备份(SQL Server 2014 及以上)
  • 建议从辅助副本备份,以减少主副本负载
  • 使用 BACKUP DATABASE [DBName] WITH COPY_ONLY 避免中断日志链

可用性组的监听器如何工作?

答案

  • 监听器提供客户端连接的统一入口,包含虚拟网络名称 (VNN) 和虚拟 IP 地址
  • 故障切换后,监听器自动指向新的主副本
  • 客户端通过监听器连接时,无需修改连接字符串
  • 支持多个 IP 地址,适用于多子网部署

如何处理可用性组的同步延迟?

答案

  • 检查网络连接和带宽,确保副本间通信顺畅
  • 检查辅助副本的资源使用率(CPU、内存、I/O)
  • 考虑将部分辅助副本改为异步提交模式
  • 优化主数据库的事务大小,避免大型事务
  • 确保辅助副本的日志文件有足够的空间

可用性组支持哪些身份验证方式?

答案

  • Windows 身份验证:用于域环境,推荐使用
  • 证书身份验证:用于非域环境,如 Linux 部署或跨域部署

如何配置自动页修复?

答案

  • 自动页修复是 AG 的内置功能,默认启用
  • 当检测到页损坏时,会自动从健康副本获取完好页
  • 支持的页类型:数据页、索引页、文本/图像页等
  • 可以通过 sys.dm_hadr_auto_page_repair 查看自动页修复历史

如何迁移现有的数据库到可用性组?

答案

  1. 确保数据库处于 FULL 恢复模式
  2. 创建数据库的完整备份
  3. 在所有辅助实例上还原完整备份(使用 NORECOVERY 选项)
  4. 将数据库添加到可用性组
  5. 配置自动种子设定或手动应用日志备份以同步数据
  6. 验证数据库在所有副本上同步正常

如何在 Linux 上配置 Always On 可用性组?

答案

  1. 配置 Linux 集群(使用 Pacemaker 和 Corosync)
  2. 配置 SQL Server 实例
  3. 创建证书并在所有实例上配置
  4. 创建可用性组
  5. 配置资源代理
  6. 测试故障切换

最佳实践

架构设计

  1. 使用奇数个节点:确保 WSFC 仲裁正常,避免分裂脑情况
  2. 合理配置副本角色
    • 关键业务:至少 2 个同步提交副本,实现自动故障切换
    • 灾难恢复:配置异步提交副本,实现异地保护
  3. 分离网络流量:使用独立网络进行副本间通信和客户端访问
  4. 考虑分布式可用性组:跨多个 WSFC 集群,提高灾难恢复能力

性能优化

  1. 选择合适的同步模式:根据业务需求平衡数据安全性和性能
  2. 启用压缩:对副本间的数据传输启用压缩,减少网络开销
  3. 优化自动种子设定:对于大型数据库,考虑手动初始化辅助数据库
  4. 实现读写分离:将只读查询引导到辅助副本,减轻主副本负载
  5. 监控同步延迟:设置警报,当同步延迟超过阈值时通知管理员

监控与维护

  1. 建立全面的监控体系:监控 AG 状态、同步延迟、资源使用率等
  2. 定期测试故障切换:每季度至少测试一次自动和手动故障切换
  3. 保持版本和补丁一致:所有实例使用相同版本和补丁级别
  4. 定期备份:即使配置了 AG,也要定期备份数据库,防止数据丢失
  5. 文档化配置:详细记录 AG 配置、故障切换流程和恢复步骤

安全性

  1. 保护端点通信:使用证书或 Windows 身份验证保护副本间通信
  2. 限制监听器访问:通过防火墙和网络策略限制监听器的访问
  3. 使用最小权限原则:为 AG 服务账户配置最小必要的权限
  4. 加密数据传输:启用 SSL/TLS 加密客户端连接
  5. 定期审计:审计 AG 相关操作和权限变更

总结

Always On 可用性组是 SQL Server 提供的强大的高可用性和灾难恢复解决方案,它提供了数据库级别的故障切换能力、可读辅助副本支持和灵活的故障切换策略。通过合理设计和配置 AG,可以显著提高数据库系统的可用性和可靠性,确保业务连续性。

在选择 AG 作为高可用性解决方案时,需要根据业务需求、数据中心架构和预算等因素综合考虑,选择合适的副本数量、同步模式和故障切换策略。同时,建立完善的监控体系和定期测试故障切换流程也是确保 AG 可靠运行的关键。

随着 SQL Server 版本的不断更新,AG 功能也在持续增强,支持 Linux 部署、容器化和分布式可用性组等新特性,为企业提供了更多的选择和灵活性。作为 DBA,深入理解 AG 的架构、配置和管理,掌握最佳实践,对于确保数据库系统的高可用性至关重要。