Skip to content

SQLServer Always On 安装

Always On 概述

SQLServer Always On 可用性组是一种企业级高可用性和灾难恢复解决方案,它提供了数据库级别的故障转移保护。可用性组将一组数据库的副本维护在不同的SQLServer实例上,当主副本出现故障时,可以自动或手动故障转移到辅助副本。

Always On 可用性组优势

  1. 数据库级别的故障转移:比FCI更灵活,可以针对特定数据库进行故障转移
  2. 多副本支持:支持最多9个副本
  3. 可读辅助副本:可以将只读工作负载分流到辅助副本
  4. 可延迟副本:用于灾难恢复场景
  5. 自动页修复:自动检测和修复损坏的数据库页
  6. 与FCI结合使用:提供更高级别的可用性

安装前准备

1. 硬件要求

组件最低要求推荐配置
节点数量2个节点3-5个节点
CPU4核处理器8核或更多
内存16 GB32 GB 或更多
存储本地存储或共享存储企业级存储
网络1 Gbps 网卡10 Gbps 网卡

2. 软件要求

  • Windows Server 2016 或更高版本(Datacenter或Standard)
  • SQLServer 2016 或更高版本(Enterprise或Standard)
  • .NET Framework 4.7.2 或更高版本
  • Windows故障转移集群功能
  • 对于Standard版本,最多支持2个副本

3. 网络准备

  • 为每个节点配置至少两个网络适配器:
    • 公共网络:用于客户端连接
    • 私有网络:用于副本间通信
  • 配置静态IP地址
  • 确保所有节点加入同一个域

4. 存储准备

  • 对于主副本和辅助副本,建议使用相同的存储配置
  • 数据文件和日志文件建议分开存储
  • 考虑使用SSD提高性能

5. 域准备

  • 创建域账户用于SQLServer服务:
    • SQLServer服务账户
    • SQL Server代理服务账户
    • 这些账户需要具有适当的权限

安装步骤

1. 配置Windows故障转移集群

在所有节点上安装故障转移集群功能

powershell
# 在所有节点上运行
Install-WindowsFeature -Name Failover-Clustering -IncludeManagementTools

验证集群配置

powershell
# 在其中一个节点上运行
Test-Cluster -Node Node1, Node2 -Include "Storage", "Network", "System Configuration"

创建故障转移集群

powershell
# 在其中一个节点上运行
New-Cluster -Name ClusterName -Node Node1, Node2 -StaticAddress 192.168.1.100

2. 配置SQLServer实例

启用Always On可用性组

  1. 打开SQL Server配置管理器
  2. 展开 SQL Server服务
  3. 右键点击SQLServer实例,选择 属性
  4. 切换到 Always On高可用性 选项卡
  5. 勾选 启用Always On可用性组
  6. 点击 确定
  7. 重启SQLServer服务

配置SQLServer服务账户

确保SQLServer服务使用域账户运行,并且该账户具有适当的权限:

powershell
# 检查SQLServer服务账户
Get-WmiObject -Class Win32_Service -Filter "Name='MSSQLSERVER'" | Select-Object Name, StartName

3. 创建可用性组

启动创建可用性组向导

  1. 打开SQL Server Management Studio (SSMS)
  2. 连接到主SQLServer实例
  3. 展开 Always On高可用性
  4. 右键点击 可用性组,选择 新建可用性组向导

选择数据库

  • 选择要添加到可用性组的数据库
  • 确保数据库处于完整恢复模式
  • 确保数据库有完整备份

指定副本

  1. 点击 添加副本
  2. 连接到辅助SQLServer实例
  3. 为每个副本配置角色:
    • 主副本:读写
    • 辅助副本:可读或不可读
  4. 配置自动故障转移和手动故障转移选项
  5. 配置可用性模式:
    • 同步提交:确保数据在故障转移前已同步到辅助副本
    • 异步提交:用于灾难恢复场景
  6. 配置可读辅助副本选项:
    • 无:不可读
    • 仅在主副本不可用时可读
    • 可读

配置端点

确保所有实例都配置了数据库镜像端点:

sql
-- 检查数据库镜像端点
SELECT * FROM sys.database_mirroring_endpoints;
GO

-- 如果没有端点,创建端点
CREATE ENDPOINT [Hadr_endpoint]
    AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
    FOR DATA_MIRRORING (
        ROLE = ALL,
        AUTHENTICATION = WINDOWS NEGOTIATE,
        ENCRYPTION = REQUIRED ALGORITHM AES
    );
GO

-- 启动端点
ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
GO

配置可用性组监听器

  • 输入监听器名称
  • 选择网络模式:动态IP或静态IP
  • 配置端口(默认1433)
  • 选择网络子网
  • 输入IP地址

选择初始化方式

  • 完整初始化:自动备份主数据库并还原到辅助副本
  • 仅加入:手动备份和还原数据库
  • 跳过初始数据同步:用于特殊场景

验证配置并创建可用性组

  • 检查配置摘要
  • 点击 下一步 开始创建可用性组
  • 等待创建完成

4. 验证可用性组配置

检查可用性组状态

sql
-- 检查可用性组状态
SELECT 
    ag.name AS AvailabilityGroupName,
    ar.replica_server_name AS ReplicaServerName,
    ars.role_desc AS Role,
    ars.synchronization_health_desc AS SynchronizationHealth
FROM sys.dm_hadr_availability_replica_states ars
JOIN sys.availability_replicas ar ON ars.replica_id = ar.replica_id
JOIN sys.availability_groups ag ON ars.group_id = ag.group_id;
GO

检查数据库同步状态

sql
-- 检查数据库同步状态
SELECT 
    ag.name AS AvailabilityGroupName,
    db_name(drs.database_id) AS DatabaseName,
    ar.replica_server_name AS ReplicaServerName,
    drs.synchronization_state_desc AS SynchronizationState,
    drs.synchronization_health_desc AS SynchronizationHealth
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 drs.group_id = ag.group_id;
GO

测试故障转移

  1. 打开故障转移集群管理器
  2. 展开 角色
  3. 选择可用性组角色
  4. 右键点击,选择 移动 > 故障转移
  5. 按照向导完成故障转移
  6. 验证可用性组在新的主副本上正常运行

安装后配置

1. 配置只读路由

允许客户端连接到可读辅助副本:

sql
-- 配置只读路由URL
ALTER AVAILABILITY GROUP [AGName] 
MODIFY REPLICA ON 
N'Node2' WITH 
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://Node2:1433'));
GO

-- 配置只读路由列表
ALTER AVAILABILITY GROUP [AGName] 
MODIFY REPLICA ON 
N'Node1' WITH 
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST = (N'Node2', N'Node1')));
GO

2. 配置自动页修复

自动页修复功能默认启用,可以使用以下命令验证:

sql
-- 检查自动页修复配置
EXEC sp_configure 'automatic page repair';
GO

3. 配置备份首选项

配置在哪个副本上执行备份:

sql
-- 配置备份首选项为首选辅助副本
ALTER AVAILABILITY GROUP [AGName] 
SET (AUTOMATED_BACKUP_PREFERENCE = SECONDARY_ONLY);
GO

4. 配置警报

配置可用性组状态变化警报:

sql
-- 启用可用性组警报
EXEC msdb.dbo.sp_add_alert 
    @name = N'Availability Group State Change',
    @message_id = 1480,
    @severity = 0,
    @enabled = 1,
    @delay_between_responses = 60,
    @include_event_description_in = 1;
GO

最佳实践

1. 架构设计

  • 为不同的业务应用创建独立的可用性组
  • 限制每个可用性组的数据库数量
  • 考虑使用分布式可用性组实现跨数据中心灾难恢复

2. 网络配置

  • 为副本间通信使用专用网络
  • 确保网络带宽足够处理同步流量
  • 配置适当的超时设置

3. 存储配置

  • 主副本和辅助副本使用相同的存储配置
  • 数据文件和日志文件分开存储
  • 使用SSD提高性能

4. 高可用性考虑

  • 定期测试故障转移
  • 确保所有副本的硬件配置一致
  • 保持所有副本的Windows和SQLServer补丁级别一致
  • 配置自动故障转移和手动故障转移

5. 性能优化

  • 将只读工作负载分流到辅助副本
  • 配置适当的同步模式
  • 监控副本间的同步延迟
  • 优化事务日志性能

6. 安全配置

  • 使用域账户管理SQLServer服务
  • 定期更改服务账户密码
  • 限制可用性组监听器的网络访问
  • 启用TLS加密

常见问题与解决方案

1. 创建可用性组失败,提示数据库未准备好

解决方案

  • 确保数据库处于完整恢复模式
  • 确保数据库有完整备份
  • 检查数据库是否有活动的事务

2. 副本间同步延迟高

排查步骤

  1. 检查网络带宽
  2. 检查主副本的事务日志写入性能
  3. 检查辅助副本的日志重做性能
  4. 考虑使用异步提交模式

3. 无法连接到可用性组监听器

排查步骤

  1. 检查监听器状态
  2. 检查DNS配置
  3. 检查防火墙设置
  4. 检查监听器IP地址配置

4. 故障转移失败

排查步骤

  1. 检查可用性组状态
  2. 检查副本状态
  3. 检查数据库同步状态
  4. 检查集群事件日志
  5. 检查SQLServer错误日志

监控可用性组

1. 使用动态管理视图

sql
-- 监控可用性组性能
SELECT 
    ag.name AS AvailabilityGroupName,
    ar.replica_server_name AS ReplicaServerName,
    ars.role_desc AS Role,
    ars.availability_mode_desc AS AvailabilityMode,
    ars.synchronization_health_desc AS SynchronizationHealth,
    drs.database_id,
    db_name(drs.database_id) AS DatabaseName,
    drs.synchronization_state_desc AS SynchronizationState,
    drs.log_send_queue_size AS LogSendQueueSize,
    drs.redo_queue_size AS RedoQueueSize,
    drs.last_hardened_lsn,
    drs.last_redone_lsn
FROM sys.dm_hadr_availability_replica_states ars
JOIN sys.availability_replicas ar ON ars.replica_id = ar.replica_id
JOIN sys.availability_groups ag ON ars.group_id = ag.group_id
LEFT JOIN sys.dm_hadr_database_replica_states drs ON ars.replica_id = drs.replica_id AND ars.group_id = drs.group_id;
GO

2. 使用性能监视器

监控以下性能计数器:

  • SQLServer:Availability Replica
  • SQLServer:Database Replica
  • SQLServer:Databases

3. 使用SQL Server Management Studio

  • 展开 Always On高可用性 > 可用性组
  • 查看可用性组状态
  • 查看副本状态
  • 查看数据库同步状态

卸载Always On可用性组

1. 删除可用性组

sql
-- 删除可用性组
DROP AVAILABILITY GROUP [AGName];
GO

2. 禁用Always On可用性组

  1. 打开SQL Server配置管理器
  2. 展开 SQL Server服务
  3. 右键点击SQLServer实例,选择 属性
  4. 切换到 Always On高可用性 选项卡
  5. 取消勾选 启用Always On可用性组
  6. 点击 确定
  7. 重启SQLServer服务

3. 销毁故障转移集群

powershell
# 销毁集群
Remove-Cluster -Cluster ClusterName -Force

# 在所有节点上卸载故障转移集群功能
Uninstall-WindowsFeature -Name Failover-Clustering -IncludeManagementTools

总结

SQLServer Always On 可用性组是一种强大的高可用性和灾难恢复解决方案,提供了数据库级别的故障转移保护。正确的安装和配置是确保可用性组正常运行的关键。DBA需要根据业务需求和系统资源,合理规划可用性组架构,遵循最佳实践,确保可用性组的高可用性和性能。定期测试故障转移和监控可用性组状态是确保长期稳定运行的重要措施。