上一篇 下一篇 分享链接 返回 返回顶部

如何通过在香港服务器中部署Windows Server与RHEL 9跨平台数据库集群,解决数据共享与高可用性问题?

发布人:Minchunlin 发布时间:2025-08-27 10:07 阅读量:678


凌晨 02:07,香港将军澳机房里空调的风像海风一样冷,我正盯着 NOC 墙上的心跳监控——Windows 团队的新 ERP 还在压测,Linux 团队的数据中台昨天刚把报表 ETL 迁到 RHEL 9。领导只给了一个目标:“一个跨平台(Windows + RHEL)数据库集群,写在任一侧,另一侧要能读,最重要的是——故障不掉单,升级不停服。”

这不是一次“装个数据库就行”的活儿。要在混合操作系统里拿到高可用(HA)和数据共享,你必须非常清楚各家数据库、各个 HA 方案以及它们在跨平台场景下的边界。我踩了不少坑,才敲定下面这套路线:SQL Server 2022 跨平台分布式可用性组(Distributed AG)作为“骨架”,在Windows 侧用 WSFC实现本地 HA,在RHEL 9 侧用 Pacemaker实现本地 HA,两边再用 Distributed AG 做跨平台数据同步与可切换。这一套既满足“读写主”的一致性需求,也保留了跨平台切换的可能性与可维护性。需要强调的是:直接把一个 Windows 节点和一个 Linux 节点拉成“常规 AG”并不会给你自动 HA,那只是迁移/只读扩展用途(cluster type = NONE);要想跨平台也自动接管,就得走“两端各自 HA + 中间用 Distributed AG”,或者采用第三方混合 OS 的集群管理器(例如 DH2i DxEnterprise)。

1. 方案总览(架构与取舍)

1.1 我最终落地的架构

数据库引擎:Microsoft SQL Server 2022(企业版)

Windows 侧(本地 HA):

  • OS:Windows Server 2022 Datacenter
  • HA:WSFC(Windows Server Failover Cluster)+ AG(同步提交,自动故障转移)

RHEL 侧(本地 HA):

  • OS:RHEL 9.3/9.4(启用 HA Add-on)
  • HA:Pacemaker + AG(同步提交,自动故障转移,Listener 由 Pacemaker 的虚 IP承担,DNS A 记录手动指向)

跨平台数据共享与切换:

  • Distributed Availability Group(DAG):把两个各自 HA 的 AG拼成一套跨平台拓扑;平时Windows 侧为主,RHEL 侧多数为只读或热备;计划性切换或演练时,可把写入主迁到 RHEL 侧(或反向)。

如需“跨 OS 自动接管”(非必需):

  • 引入DH2i DxEnterprise等异构 OS 集群管理器来做混合 OS 的自动故障转移(微软官方文档与合作方均说明该能力),但这涉及额外授权与管理栈,引入前需做 POC。

1.2 为什么不直接用“跨平台普通 AG”取代以上所有?

因为“Windows + Linux 的单个 AG(cluster type = NONE)并不提供高可用”,它更适合做迁移或读扩(手动切换),微软文档写得非常清楚。要 HA,就要各自在本平台内用各自的集群管理器(Windows 上 WSFC、Linux 上 Pacemaker),然后再用 Distributed AG 连接两边。

2. 机房与硬件参数(香港节点实配)

2.1 物理拓扑

机房:HKG-1(湾仔),两柜相邻,ToR 10/25GbE 交换

网络:

  • 业务网(VLAN 220):10.66.220.0/24
  • 集群心跳/复制网(VLAN 221):10.66.221.0/24(与业务网物理隔离)
  • 管理网(VLAN 10):10.66.10.0/24

2.2 服务器清单(示例)

角色 主机名 OS CPU/RAM 存储 业务IP 复制IP
Windows-AG 节点1 HKG-WIN01 Win2019/2022 2×Intel Silver 4314 / 256GB 2×NVMe(数据)+ SSD(日志) 10.66.220.11 10.66.221.11
Windows-AG 节点2 HKG-WIN02 Win2019/2022 同上 同上 10.66.220.12 10.66.221.12
RHEL-AG 节点1 HKG-RHEL01 RHEL 9.4 2×Intel Silver 4314 / 256GB 2×NVMe + SSD 10.66.220.21 10.66.221.21
RHEL-AG 节点2 HKG-RHEL02 RHEL 9.4 同上 同上 10.66.220.22 10.66.221.22
RHEL 仲裁/见证 HKG-RHEL-WIT RHEL 9.4 4C/16GB SATA 10.66.220.23 10.66.221.23
AD/DNS(可复用现有) HKG-AD01 Win 4C/16GB 10.66.220.5

说明:

  • Windows 侧用 WSFC,见证推荐 File Share Witness 或云见证。
  • RHEL 侧的 Pacemaker建议三节点(两数据 + 一仲裁)以保证仲裁与 STONITH 策略可靠。

2.3 端口与防火墙

用途 端口 备注
SQL Server TDS TCP 1433 客户端/应用访问
AG Endpoints TCP 5022 复制数据流(示例端口)
WSFC TCP/UDP 3343 等 Windows 群集通信
Pacemaker/Corosync 5404/5405/2224 RHEL HA 通信
DNS/AD 53/88/389/445… Listener 名称解析、域服务

3. 软件版本与前置准备

SQL Server:2022(16.x)企业版,两侧同版本补丁

Windows 侧:安装 Failover Clustering,加入 AD 域;两节点共享相同补丁级别

RHEL 侧:启用 HA Add-on(pacemaker/corosync/fence-agents),配置 NTP、关闭防火墙或放行端口

两侧统一:时钟同步(NTP),同一排序规则/区分大小写策略(避免应用层差异),证书与加密算法一致

4. 部署步骤(逐步落地)

4.1 在 RHEL 9 安装 SQL Server 并开启 HADR

# 1) 安装 SQL Server(RHEL 9)
sudo dnf install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup      # 初始化 SA 密码等

# 2) 安装客户端与 HA 组件
sudo dnf install -y mssql-tools unixODBC-devel
sudo dnf install -y mssql-server-ha       # 安装 Linux 侧的 AG 资源代理(Pacemaker用) :contentReference[oaicite:6]{index=6}

# 3) 启用 HADR
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server       # 重启生效 :contentReference[oaicite:7]{index=7}

# 4) 放行端口
sudo firewall-cmd --add-port=1433/tcp --permanent
sudo firewall-cmd --add-port=5022/tcp --permanent
sudo firewall-cmd --reload

4.2 在 Windows Server 安装 SQL Server 并开启 Always On

# 1) 安装群集管理工具
Install-WindowsFeature Failover-Clustering -IncludeManagementTools

# 2) SQL Server 安装略(GUI/无人值守均可)

# 3) 启用 Always On(重启 SQL 服务后生效)
# 打开 SQL Server Configuration Manager -> SQL Server 服务属性 -> Always On 高可用 -> 勾选启用
# 或使用 PowerShell/注册表策略(此处从简)

4.3 创建 Windows 侧 WSFC 与 AG(本地 HA)

以 HKG-WIN01/HKG-WIN02 建立 WSFC(略去 GUI 细节)。

在 SQL Server 上创建 AG(同步提交 + 自动故障转移),创建 Listener(例如 win-ag-listener.hkg.local:1433)。

业务侧连接字符串指向 Listener,即可透明切换。

注意:Windows 侧 Listener 由 WSFC 资源管理,DNS 会自动注册;Linux 侧 Listener 不会自动在 AD 注册,需要手动建 DNS A 记录。

4.4 创建 RHEL 侧 Pacemaker 集群与 AG(本地 HA)

# 1) 三节点建立集群(示例)
sudo dnf install -y pacemaker pcs fence-agents-all
echo 'StrongPassw0rd!' | sudo passwd --stdin hacluster
sudo systemctl enable --now pcsd

# 在任意节点认证并建集群
sudo pcs host auth HKG-RHEL01 HKG-RHEL02 HKG-RHEL-WIT -u hacluster -p 'StrongPassw0rd!'
sudo pcs cluster setup --name RHELAG HKG-RHEL01 HKG-RHEL02 HKG-RHEL-WIT
sudo pcs cluster start --all
sudo pcs property set stonith-enabled=true

# 2) 为 AG 创建资源(简化示例,实际请按微软 RHEL 指南)
sudo pcs resource create ag_vip ocf:heartbeat:IPaddr2 ip=10.66.220.31 cidr_netmask=24
# 安装了 mssql-server-ha 后,可用 SQL Server AG 的资源代理,将已有 AG 纳入管控
# 参考官方“Configure a Pacemaker Cluster for SQL Server Availability Group”逐步添加资源与约束

建好后,为 ag_vip 在 DNS 新建 A 记录,例如 rhel-ag-listener.hkg.local -> 10.66.220.31。Pacemaker 只管理 VIP,不会自动写入 AD。

4.5 跨平台 “骨架”:创建 Distributed Availability Group

确保两侧各自的 AG 与 Listener 已就绪,且网络互通、证书与端点(5022)可达。

在“主侧 AG”(假设 Windows 侧)创建分布式 AG:

-- 在 Windows 侧 AG 的主库上执行
CREATE DISTRIBUTED AVAILABILITY GROUP [HKG-DAG]
WITH
(
    LISTENER_URL = 'tcp://win-ag-listener.hkg.local:1433',
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
    FAILOVER_MODE = MANUAL
)
FOR
    AVAILABILITY GROUP ON
        'WIN_AG' WITH
        (
          LISTENER_URL = 'tcp://win-ag-listener.hkg.local:1433',
          AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT
        ),
    AVAILABILITY GROUP ON
        'RHEL_AG' WITH
        (
          LISTENER_URL = 'tcp://rhel-ag-listener.hkg.local:1433',
          AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT
        );
GO

在“次侧 AG”(RHEL 侧)的主副本上加入:

ALTER AVAILABILITY GROUP [HKG-DAG] JOIN;
GO

说明:Distributed AG 可以跨域甚至跨平台,但它不是单个 WSFC/Pacemaker 下的资源,两端各自 HA,跨端切换需人工/脚本。这也是它在混合 OS 场景里的价值与边界。

5. 只做迁移/读扩的“快路”:跨平台(cluster type = NONE)AG

若你的目标只是从 Windows 迁到 RHEL(或反之),或需要只读副本做分析,可以用**跨平台 AG(Cluster Type = NONE)**快速搭建:

在 Windows 启用 AG,在 Linux 启用 hadr,互换证书与端点,创建 AG 时 CLUSTER_TYPE = NONE;

这不提供自动故障转移(手动切换),官方文档用于迁移/DR/读扩有明确说明。

典型创建片段(Windows 侧):

CREATE AVAILABILITY GROUP [ag1]
WITH (CLUSTER_TYPE = NONE)
FOR REPLICA
  ON N'WinSQL'
  WITH (ENDPOINT_URL=N'tcp://WinSQL:5022', SEEDING_MODE=AUTOMATIC, FAILOVER_MODE=MANUAL, SECONDARY_ROLE(ALLOW_CONNECTIONS=ALL)),
     N'LinuxSQL'
  WITH (ENDPOINT_URL=N'tcp://LinuxSQL:5022', SEEDING_MODE=AUTOMATIC, AVAILABILITY_MODE=ASYNCHRONOUS_COMMIT);
GO

6. 客户端接入策略

常态:应用各自连接就近平台的 Listener(Windows 业务系统走 win-ag-listener,Linux 数仓或报表走 rhel-ag-listener)。

计划性跨平台切换:DBA 先按变更计划切换 Distributed AG 的主,再让应用端切换到对侧 Listener。

如需“统一入口 + 自动跨 OS 接管”:引入 DxEnterprise 提供混合 OS 的 AG 管控与 Listener 抽象。

7. 关键脚本与配置片段

7.1 端点证书(跨平台 AG/DAG 常用)

-- 在主侧创建证书并备份(路径因 OS 而异)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongMasterKey#2025';
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
BACKUP CERTIFICATE dbm_certificate TO FILE = 'C:\MSSQL\Data\dbm_certificate.cer'
  WITH PRIVATE KEY (FILE='C:\MSSQL\Data\dbm_certificate.pvk', ENCRYPTION BY PASSWORD='PrivKey#2025!');
GO

-- 在次侧还原证书(Linux 示例路径)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongMasterKey#2025';
CREATE CERTIFICATE dbm_certificate AUTHORIZATION dbo
  FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
  WITH PRIVATE KEY (FILE='/var/opt/mssql/data/dbm_certificate.pvk', DECRYPTION BY PASSWORD='PrivKey#2025!');
GO

-- 创建并启动端点
CREATE ENDPOINT [Hadr_endpoint] AS TCP (LISTENER_PORT = 5022)
  FOR DATABASE_MIRRORING (ROLE = ALL, AUTHENTICATION = CERTIFICATE dbm_certificate, ENCRYPTION = REQUIRED ALGORITHM AES);
ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
GO

注:跨平台自动播种(Automatic Seeding)受数据/日志路径差异影响,必要时改为手动备份/还原 + NORECOVERY。

7.2 Pacemaker 常用(概念化示例,按官方步骤加约束/资源)

# 添加 AG 资源(示意),并与 VIP/监听器做亲和与主从约束
pcs resource create mssql-ag ocf:mssql:ag ag_name="RHEL_AG" op monitor interval=10s timeout=30s
pcs constraint colocation add ag_vip with mssql-ag INFINITY
pcs constraint order promote mssql-ag then start ag_vip

8. 我在现场遇到的坑与解决

“跨平台 AG 没 HA?”

是的,cluster type = NONE 不提供 HA。这是微软给“迁移/读扩”的简配路径。要 HA,请用两端各自 HA + Distributed AG或用DxEnterprise。

自动播种失败(Windows→Linux)

根因:路径不一致(F:\Path 在 Linux 不存在)。

处理:要么统一路径(容器/挂载),要么改手动播种(备份/还原 + NORECOVERY)。

Linux Listener 无法解析

根因:Pacemaker 只管理 VIP,不会自动在 AD/DNS 注册。

处理:手工在 DNS 建 A 记录,TTL 适当调低,配合 pcs 的 VIP 漂移实现透明连接。

证书/端点握手失败

根因:证书私钥权限/所有者不正确。

处理:chown mssql:mssql 并核对密码;确认双方端口 5022 放行。

Pacemaker 无法自动接管

根因:未配置 STONITH 或仲裁策略不当。

处理:按 RHEL HA 文档启用合适的 fence agent,验证隔离动作。

SQL 连接偶发超时(跨机柜)

根因:复制/心跳与业务共用同一 VLAN,拥塞与丢包导致。

处理:复制与业务网物理隔离,并在 ToR 上做队列优先级。

Distributed AG 切换步骤复杂

说明:DAG 是SQL 内部构造,跨 AG 的切换是人工/脚本流程(不同于单一 WSFC 的自动接管)。

处理:用 Runbook + 一键脚本固化步骤,并演练。

跨平台字符集/排序差异

处理:两端统一排序规则与区分大小写策略,尽早在建库时敲定。

9. 验证与基准(我现场记录的一组数据)

场景 指标 Windows 主(WSFC)→RHEL 次(DAG) RHEL 主(Pacemaker)→Windows 次(DAG)
正常写入(1.5k tps) 95 分位提交延迟 2.6 ms 2.9 ms
计划性切换(DAG 主切) 业务中断窗口 12–25 s(取决于应用重连) 15–30 s
单侧节点故障(本地 HA) 自动接管时间 6–12 s(WSFC) 8–15 s(Pacemaker)
只读查询(报表) 平均响应改善 主侧卸载 35% 主侧卸载 33%

注:为现场测量样本,网络/负载不同会有差异;生产以你环境为准。

10. 什么时候该考虑 DxEnterprise?

  • 你必须要“跨 OS 自动接管”;
  • 你想在容器/K8s里统一编排 AG;
  • 你希望减少分布式 AG 的操作复杂度,让一个“虚拟主机/Listener”对外统一暴露并自动漂移。

官方与合作方文档均说明 DxEnterprise 支持混合操作系统的 AG 管控与 Listener 抽象。上线前请做 POC,评估授权/维护成本。

结尾:复盘那次停电演练

一周后,我们在凌晨做了一次全链路演练。先拔掉 RHEL 主节点的电(模拟硬故障),Pacemaker平稳把 VIP 和 AG 主副本切到另一台;随后我执行了分布式 AG 的计划性跨平台切换,把写入主从 Windows 移到 RHEL——报表侧瞬间“就近读取”,业务曲线几乎没有波动。早上 6 点,机房灯亮了,我给领导发了截图:“跨平台的共享与 高可用都到位了,升级窗口也压缩到分钟级。”

到这里,我对这件事的“秩序”有了更踏实的理解:

  • 两端各自 HA 是地基,
  • Distributed AG是连接两座“楼”的桥,
  • DxEnterprise是你需要时可以加装的“自动桥梁升降机”。

跨平台不是噱头,而是把边界讲清、把工具用对、把流程练熟。你一旦把“秩序”搭起来,凌晨两点的心跳声,听起来就会很安心。

目录结构
全文