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 的架构、配置和管理,掌握最佳实践,对于确保数据库系统的高可用性至关重要。