SQL Server在CentOS的高可用实现
一、方案总览与选型
- Always On 可用性组 AG(推荐):在 SQL Server 2016/2017/2019/2022 上可用,Linux 环境需配合 Pacemaker/Corosync 提供集群仲裁与资源编排;数据库需处于 FULL 恢复模式,并具备 Enterprise Edition 才能创建多个数据库副本。适合需要自动故障转移与读写分离的在线业务。
- 数据库镜像(Database Mirroring):适用于 SQL Server 2008+,在 Standard/Enterprise 上可用,支持高安全(同步)或高性能(异步)模式;但为旧方案,功能与生态已被 AG 取代,建议仅用于遗留系统。
- Pacemaker/Corosync 仅做实例故障转移(FCI思路):Linux 上不提供共享存储的 WSFC,可通过 Pacemaker 对 SQL Server 实例做主备切换;此方式不复制数据库,仅做实例级冗余,通常与 AG 组合使用以覆盖实例与数据库两层可用性。
- Keepalived/LVS、容器化(Docker/K8s):Keepalived/LVS 可做 VIP 与四层转发,解决入口高可用;容器化便于弹性伸缩与快速恢复,但需额外的编排与存储方案支撑数据库一致性。
以上方案在 CentOS 上均有落地实践,生产优先选用 AG + Pacemaker/Corosync,旧系统可考虑 数据库镜像。
二、以 Always On 可用性组为核心的落地步骤
- 环境与版本
- 操作系统:CentOS 7.9/8.x(内核与驱动保持更新)。
- 数据库:SQL Server 2019/2022 Enterprise(AG 多副本/自动故障转移需要 Enterprise)。
- 节点:建议 3 节点(2 同步副本 + 1 异步/见证或仲裁节点),至少 2 节点。
- 网络:同网段、静态 IP、主机名可解析(/etc/hosts 或 DNS),时间同步(chrony/ntpd)。
- 安装与启用
- 安装 SQL Server 引擎(mssql-server)与工具(mssql-tools),完成 sa 初始化。
- 启用 HADR:
- sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
- sudo systemctl restart mssql-server
- 验证:SELECT SERVERPROPERTY(‘HadrManagerStatus’); 返回 1 表示 HADR 管理器正常。
- 证书认证与端点
- 每个节点在 master 库创建 主密钥 与 证书,并备份证书到共享位置(如 /var/opt/mssql/backup/)。
- 在所有节点创建 HADR 端点(端口 5022),使用证书认证,授予 SQL Server 服务账户连接权限:
- CREATE ENDPOINT Hadr_endpoint STATE=STARTED AS TCP (LISTENER_PORT=5022)
FOR DATA_MIRRORING (ROLE=ALL, AUTHENTICATION=CERTIFICATE YourCert, ENCRYPTION=REQUIRED ALGORITHM AES);
- GRANT CONNECT ON ENDPOINT::Hadr_endpoint TO [sqlserviceaccount];
- 创建可用性组
- 主库备份(FULL + LOG),在备库还原(NORECOVERY)。
- 在主节点创建 AG(示例为同步提交 + 自动故障转移):
- CREATE AVAILABILITY GROUP [SQLAG]
WITH (CLUSTER_TYPE = EXTERNAL, DB_FAILOVER = ON)
FOR DATABASE [YourDB]
REPLICA ON
N’node1’ WITH (ENDPOINT_URL=‘TCP://node1:5022’,
AVAILABILITY_MODE=SYNCHRONOUS_COMMIT,
FAILOVER_MODE=EXTERNAL,
SEEDING_MODE=AUTOMATIC),
N’node2’ WITH (ENDPOINT_URL=‘TCP://node2:5022’,
AVAILABILITY_MODE=SYNCHRONOUS_COMMIT,
FAILOVER_MODE=EXTERNAL,
SEEDING_MODE=AUTOMATIC);
- ALTER DATABASE [YourDB] SET HADR AVAILABILITY GROUP = [SQLAG];
- Pacemaker/Corosync 仲裁与资源
- 安装并初始化集群:
- sudo yum install -y pacemaker corosync pcs
- sudo systemctl enable --now pcsd
- pcs cluster auth node1 node2 node3 -u hacluster -p
- pcs cluster setup --name SQLCluster node1 node2 node3
- pcs cluster start --all && pcs cluster enable --all
- 配置隔离(stonith)与仲裁策略(如 quorum 设置),确保脑裂可控。
- 创建 AG 监听器 VIP 资源(示例 VIP:192.168.1.100/24,端口 1433):
- pcs resource create ag_listener ocf:mssql:ag_listener ag_name=SQLAG \
listener_name=SQLAGListener ip=192.168.1.100 cidr_netmask=24 \
op monitor interval=30s
- pcs constraint colocation add ag_listener with master ms-sql-ag-master
- pcs constraint order promote ms-sql-ag-master then ag_listener
- 防火墙与连通性
- 开放 1433(数据库)、5022(HADR 端点)、以及 Pacemaker 通信端口(如 2224/3121/21064 等,按环境调整)。
- 验证:在各节点执行 SELECT ag.name, ags.synchronization_health_desc, ar.replica_server_name, ars.role_desc, ars.synchronization_health_desc FROM sys.availability_groups ag JOIN sys.dm_hadr_availability_group_states ags ON ag.group_id=ags.group_id 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; 确认主备角色与健康状态。
三、关键配置与最佳实践
- 自动故障转移前提:至少 2 个同步副本(SYNCHRONOUS_COMMIT)+ FAILOVER_MODE=EXTERNAL,并配置 仲裁(奇数节点或仲裁见证)。
- 数据库要求:加入 AG 的库必须 FULL 恢复模式,且完成 FULL + LOG 备份并在备库 NORECOVERY 还原;定期日志备份避免日志截断阻塞。
- 安全:端点使用 证书认证,证书与私钥权限最小化;仅放通必要端口;生产环境启用 TLS/加密 通道。
- 网络:节点间延迟尽量低(同机房/同区域),避免跨公网部署同步副本;VIP 与网关保持同网段,避免路由问题。
- 监控与演练:监控 pcs status、SQL 的 sys.dm_hadr_* 视图与告警;定期执行 手动故障转移演练 验证 RTO/RPO。
- 升级与变更:遵循滚动升级策略,先升级 次要副本,再切换主副本;变更前备份与回滚预案。
四、常见问题与排查要点
- 端点无法连接:检查 5022 端口、证书是否一致、服务账户权限、以及防火墙/SELinux 策略。
- 数据库未加入 AG:确认 FULL 恢复模式、备份/还原顺序正确、数据库处于 ONLINE 且未受限。
- 自动故障转移不生效:核查 FAILOVER_MODE=EXTERNAL、同步副本数量、仲裁与健康阈值;Pacemaker 资源是否配置 colocation/order。
- 客户端连不上:确认连接字符串使用 AG 监听器 VIP:1433,驱动支持 MultiSubnetFailover=True(跨子网场景),以及 VIP 是否漂移到新主。