外观
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 仲裁正常
- 适用于关键业务系统
手动故障切换
- 管理员手动触发故障切换
- 用于计划内维护,如操作系统升级、硬件维护等
- 要求主副本和目标辅助副本处于同步状态
- 无数据丢失
强制故障切换
- 在没有同步确认的情况下进行故障切换
- 可能导致数据丢失
- 仅在紧急情况下使用
- 适用于主副本完全不可用且无法恢复的情况
配置步骤
前提条件
- 所有服务器已加入同一个 Active Directory 域
- 已安装并配置 Windows Server 故障切换集群 (WSFC)
- 所有 SQL Server 实例均为 Enterprise Edition 或更高版本
- 所有 SQL Server 实例已启用 Always On 可用性组功能
- 数据库已设置为 FULL 恢复模式
- 已创建数据库的完整备份
详细配置步骤
启用 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 会自动检测并触发故障切换到同步提交的辅助副本。自动故障切换是无缝的,客户端通过监听器连接时无需修改连接字符串。
手动故障切换
用于计划内维护,步骤如下:
- 确保主副本和目标辅助副本处于同步状态
- 执行手动故障切换命令
sql
ALTER AVAILABILITY GROUP [AG_SalesDB] FAILOVER;- 验证故障切换后的状态,确保新主副本正常运行
强制故障切换
仅在紧急情况下使用,可能导致数据丢失:
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
- 升级步骤:
- 先升级所有辅助副本
- 手动故障切换到已升级的辅助副本
- 升级原主副本
- 可选:将原主副本作为辅助副本重新加入
如何备份可用性组中的数据库?
答案:
- 主副本:支持所有类型的备份(完整、差异、日志)
- 辅助副本:支持日志备份和差异备份(SQL Server 2014 及以上)
- 建议从辅助副本备份,以减少主副本负载
- 使用
BACKUP DATABASE [DBName] WITH COPY_ONLY避免中断日志链
可用性组的监听器如何工作?
答案:
- 监听器提供客户端连接的统一入口,包含虚拟网络名称 (VNN) 和虚拟 IP 地址
- 故障切换后,监听器自动指向新的主副本
- 客户端通过监听器连接时,无需修改连接字符串
- 支持多个 IP 地址,适用于多子网部署
如何处理可用性组的同步延迟?
答案:
- 检查网络连接和带宽,确保副本间通信顺畅
- 检查辅助副本的资源使用率(CPU、内存、I/O)
- 考虑将部分辅助副本改为异步提交模式
- 优化主数据库的事务大小,避免大型事务
- 确保辅助副本的日志文件有足够的空间
可用性组支持哪些身份验证方式?
答案:
- Windows 身份验证:用于域环境,推荐使用
- 证书身份验证:用于非域环境,如 Linux 部署或跨域部署
如何配置自动页修复?
答案:
- 自动页修复是 AG 的内置功能,默认启用
- 当检测到页损坏时,会自动从健康副本获取完好页
- 支持的页类型:数据页、索引页、文本/图像页等
- 可以通过
sys.dm_hadr_auto_page_repair查看自动页修复历史
如何迁移现有的数据库到可用性组?
答案:
- 确保数据库处于 FULL 恢复模式
- 创建数据库的完整备份
- 在所有辅助实例上还原完整备份(使用 NORECOVERY 选项)
- 将数据库添加到可用性组
- 配置自动种子设定或手动应用日志备份以同步数据
- 验证数据库在所有副本上同步正常
如何在 Linux 上配置 Always On 可用性组?
答案:
- 配置 Linux 集群(使用 Pacemaker 和 Corosync)
- 配置 SQL Server 实例
- 创建证书并在所有实例上配置
- 创建可用性组
- 配置资源代理
- 测试故障切换
最佳实践
架构设计
- 使用奇数个节点:确保 WSFC 仲裁正常,避免分裂脑情况
- 合理配置副本角色:
- 关键业务:至少 2 个同步提交副本,实现自动故障切换
- 灾难恢复:配置异步提交副本,实现异地保护
- 分离网络流量:使用独立网络进行副本间通信和客户端访问
- 考虑分布式可用性组:跨多个 WSFC 集群,提高灾难恢复能力
性能优化
- 选择合适的同步模式:根据业务需求平衡数据安全性和性能
- 启用压缩:对副本间的数据传输启用压缩,减少网络开销
- 优化自动种子设定:对于大型数据库,考虑手动初始化辅助数据库
- 实现读写分离:将只读查询引导到辅助副本,减轻主副本负载
- 监控同步延迟:设置警报,当同步延迟超过阈值时通知管理员
监控与维护
- 建立全面的监控体系:监控 AG 状态、同步延迟、资源使用率等
- 定期测试故障切换:每季度至少测试一次自动和手动故障切换
- 保持版本和补丁一致:所有实例使用相同版本和补丁级别
- 定期备份:即使配置了 AG,也要定期备份数据库,防止数据丢失
- 文档化配置:详细记录 AG 配置、故障切换流程和恢复步骤
安全性
- 保护端点通信:使用证书或 Windows 身份验证保护副本间通信
- 限制监听器访问:通过防火墙和网络策略限制监听器的访问
- 使用最小权限原则:为 AG 服务账户配置最小必要的权限
- 加密数据传输:启用 SSL/TLS 加密客户端连接
- 定期审计:审计 AG 相关操作和权限变更
总结
Always On 可用性组是 SQL Server 提供的强大的高可用性和灾难恢复解决方案,它提供了数据库级别的故障切换能力、可读辅助副本支持和灵活的故障切换策略。通过合理设计和配置 AG,可以显著提高数据库系统的可用性和可靠性,确保业务连续性。
在选择 AG 作为高可用性解决方案时,需要根据业务需求、数据中心架构和预算等因素综合考虑,选择合适的副本数量、同步模式和故障切换策略。同时,建立完善的监控体系和定期测试故障切换流程也是确保 AG 可靠运行的关键。
随着 SQL Server 版本的不断更新,AG 功能也在持续增强,支持 Linux 部署、容器化和分布式可用性组等新特性,为企业提供了更多的选择和灵活性。作为 DBA,深入理解 AG 的架构、配置和管理,掌握最佳实践,对于确保数据库系统的高可用性至关重要。
