一、Always On 技术概述

SQL Server的Always On可用性组是微软官方推荐的高可用性解决方案,它通过将多个数据库实例组合成一个逻辑单元,实现故障自动转移和手动切换功能。这个技术本质上是在Windows故障转移集群(WSFC)基础上实现的数据库级别高可用方案。

想象一下这样的场景:你的核心业务数据库突然宕机,而Always On就像个尽职的管家,能自动把服务切换到备用节点上,保证业务不中断。它最大的特点就是允许配置多个同步或异步的副本,这些副本可以分布在不同的物理位置。

二、手动切换配置实战

手动切换通常用于计划内的维护场景,比如服务器升级或硬件更换。下面我们通过PowerShell来演示如何配置手动切换(技术栈:SQL Server 2019 + PowerShell):

# 导入SQL Server模块
Import-Module SqlServer

# 设置可用性组名称和副本信息
$agName = "AG_Demo"
$primaryServer = "SQL01"
$secondaryServer = "SQL02"

# 执行手动故障转移
Switch-SqlAvailabilityGroup `
    -Path "SQLSERVER:\Sql\$primaryServer\Default\AvailabilityGroups\$agName" `
    -NewPrimaryServer $secondaryServer `
    -AllowDataLoss:$false `
    -Confirm:$false

# 检查转移状态
Get-SqlAvailabilityGroup `
    -Path "SQLSERVER:\Sql\$secondaryServer\Default\AvailabilityGroups\$agName" | 
    Select-Object Name, PrimaryReplicaServerName

这段代码做了三件事:

  1. 首先导入必要的SQL Server PowerShell模块
  2. 然后执行从SQL01到SQL02的手动切换
  3. 最后验证切换后的主副本信息

手动切换的关键是要确保所有同步副本都处于"SYNCHRONIZED"状态,否则可能会导致数据丢失。在实际操作前,建议先用以下T-SQL检查同步状态:

SELECT 
    ar.replica_server_name,
    ars.synchronization_health_desc,
    ars.synchronization_state_desc
FROM sys.availability_replicas ar
JOIN sys.dm_hadr_availability_replica_states ars 
    ON ar.replica_id = ars.replica_id
WHERE ar.group_id = (
    SELECT group_id 
    FROM sys.availability_groups 
    WHERE name = 'AG_Demo'
)

三、自动故障转移配置详解

自动故障转移是Always On最强大的特性之一,它能在主副本不可用时自动切换到健康的备用副本。配置自动故障转移需要注意以下几点:

  1. 必须使用同步提交模式
  2. 需要配置故障转移条件
  3. 建议至少配置三个副本以防止脑裂

下面是通过T-SQL配置自动故障转移的示例:

-- 修改副本为自动故障转移模式
ALTER AVAILABILITY GROUP [AG_Demo]
MODIFY REPLICA ON 'SQL02' WITH (
    FAILOVER_MODE = AUTOMATIC,
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT
);

-- 设置故障转移条件
ALTER AVAILABILITY GROUP [AG_Demo] 
SET (
    REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 1,
    DB_FAILOVER = ON,
    DTC_SUPPORT = PER_DB
);

-- 验证配置
SELECT 
    replica_server_name,
    failover_mode_desc,
    availability_mode_desc
FROM sys.availability_replicas
WHERE group_id = (
    SELECT group_id 
    FROM sys.availability_groups 
    WHERE name = 'AG_Demo'
);

自动故障转移的触发条件包括:

  • 服务崩溃
  • 操作系统宕机
  • 硬件故障
  • 网络隔离(需要配置租约超时)

四、测试方案设计与实施

测试是确保高可用性方案可靠的关键环节。下面介绍几种常用的测试方法:

  1. 手动故障转移测试
# 模拟手动切换
Invoke-Sqlcmd -Query "ALTER AVAILABILITY GROUP [AG_Demo] FAILOVER;"

# 检查切换后状态
Invoke-Sqlcmd -Query "
    SELECT 
        ag.name AS [AG Name],
        ar.replica_server_name,
        ars.role_desc
    FROM sys.availability_groups ag
    JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
    JOIN sys.dm_hadr_availability_replica_states ars ON ar.replica_id = ars.replica_id
"
  1. 自动故障转移测试
# 在主节点上停止SQL Server服务
Stop-Service -Name "MSSQLSERVER" -Force

# 等待30秒后检查当前主节点
Start-Sleep -Seconds 30
Invoke-Sqlcmd -ServerInstance $secondaryServer -Query "
    SELECT @@SERVERNAME AS [Current Primary]
"
  1. 网络隔离测试
# 在主节点上模拟网络中断
New-NetFirewallRule -DisplayName "Block_SQL_Port" -Direction Outbound -LocalPort 1433 -Action Block

# 检查集群状态
Get-ClusterResource | Where-Object {$_.State -ne "Online"} | Format-Table -AutoSize

# 记得清理规则
Remove-NetFirewallRule -DisplayName "Block_SQL_Port"

五、应用场景与技术选型

Always On适合以下典型场景:

  1. 关键业务系统需要99.9%以上的可用性
  2. 需要实现读写分离的OLTP系统
  3. 跨数据中心的灾备方案

与镜像和日志传送相比,Always On的优势在于:

  • 支持多副本(最多8个)
  • 提供可读辅助副本
  • 集成Windows集群服务
  • 更细粒度的监控

但也要注意它的局限性:

  1. 需要企业版授权
  2. 配置相对复杂
  3. 对网络延迟敏感(同步模式下)

六、常见问题排查

在实际运维中,可能会遇到以下典型问题:

  1. 故障转移失败: 检查WSFC仲裁配置和网络连接状态:
Test-Cluster -Node $primaryServer
Get-ClusterLog -Node $primaryServer -TimeSpan 5
  1. 同步延迟: 监控延迟情况:
SELECT 
    ag.name AS ag_name,
    ar.replica_server_name,
    db_name(drs.database_id) AS database_name,
    drs.synchronization_state_desc,
    drs.log_send_queue_size,
    drs.redo_queue_size
FROM sys.dm_hadr_database_replica_states drs
JOIN sys.availability_replicas ar ON drs.replica_id = ar.replica_id
JOIN sys.availability_groups ag ON ar.group_id = ag.group_id
  1. 脑裂情况处理
# 强制仲裁
Stop-ClusterNode -Name $primaryServer -ForceQuorum

七、最佳实践与注意事项

根据多年运维经验,总结出以下最佳实践:

  1. 生产环境建议使用至少3个节点(1主+2同步副本)
  2. 跨机房部署时,考虑使用异步副本避免性能影响
  3. 定期测试故障转移流程(建议每季度一次)
  4. 监控关键指标:
    • 同步延迟
    • 副本健康状态
    • 集群仲裁状态

特别注意:

  • 自动故障转移后,原主节点恢复时会自动变为辅助副本
  • 应用程序连接字符串需要配置MultiSubnetFailover=True
  • 避免在业务高峰期执行手动切换

八、总结与展望

SQL Server Always On提供了企业级的高可用解决方案,通过合理配置手动和自动故障转移机制,可以显著提高系统可用性。随着SQL Server 2022的发布,Always On功能进一步增强,包括与Kubernetes的深度集成和更智能的故障预测能力。

对于DBA来说,掌握Always On的配置和运维是必备技能。建议从测试环境开始,逐步熟悉各种故障场景的处理方法,最终在生产环境中实现真正的高可用架构。