在Linux上运行故障切换集群实例

适用于:Linux 上的 SQL Server

本文介绍如何在 Linux 上运行 SQL Server 故障转移群集实例 (FCI)。 要在 Linux 上创建 SQL Server FCI,请参见“配置 Linux 故障转移集群实例(RHEL)”。

体系结构说明

集群层基于基于Pacemaker构建的Red Hat Enterprise Linux(RHEL)HA插件。 Corosync 和 Pacemaker 协调群集通信和资源管理。 SQL Server实例一次只激活一个节点。

下图显示了 SQL Server 的 Linux 群集中的组件。

Linux 上共享磁盘 SQL Server 故障转移集群的示意图。

欲了解更多关于集群配置、资源代理选项和管理的信息,请访问 RHEL 参考文档

Failover

FCI 的故障转移类似于 Windows Server 故障转移群集 (WSFC)。 如果托管 FCI 的群集节点遇到某种故障,FCI 应自动故障转移到另一个节点。 与 WSFC 不同,无法设置首选所有者,因此 Pacemaker 选取即将成为 FCI 新主机的节点。

有时你可能想手动将FCI切换到另一个节点。 此过程与 WSFC 上的 FCI 不同。 在 WSFC 上,可以在角色级别对资源进行故障转移。 在Pacemaker中,你选择一个资源来移动,如果所有约束都正确,其他所有东西也会移动。

切换方式取决于Linux发行版。 按照你Linux发行版的说明操作。

手动故障切换(RHEL 或 Ubuntu)

若要执行手动故障转移,请在 Red Hat Enterprise Linux (RHEL) 或 Ubuntu 服务器上执行以下步骤。

  1. 发出以下命令:

    sudo pcs resource move <FCIResourceName> <NewHostNode>
    

    <FCIResourceName>是SQL Server FCI的Pacemaker资源名称,是<NewHostNode>你想托管FCI的集群节点名称。

  2. 在手动故障转移过程中,Pacemaker 会对已选择手动移动的资源创建位置约束。 若要查看此约束,请运行 sudo pcs constraint

  3. 故障切换完成后,移除该约束:

    sudo pcs resource clear <FCIResourceName>
    

手动故障切换(SLES)

Note

从 SQL Server 2025(17.x)开始,不支持 SUSE Linux Enterprise Server (SLES)。 对于 SQL Server 2022(16.x)及更早版本,仅支持 SLES 15。

在 SUSE Linux Enterprise Server (SLES) 中,使用 migrate 命令手动故障转移 SQL Server FCI。 例如:

crm resource migrate <FCIResourceName> <NewHostNode>

<FCIResourceName> 是故障转移集群实例的资源名称,是 <NewHostNode> 新目标主机的名称。

监控故障切换集群

查看当前群集状态:

sudo pcs status

查看集群和资源的实时状态:

sudo crm_mon

/var/log/cluster/corosync.log 查看资源代理日志。

向群集添加节点

  1. 检查每个节点的 IP 地址。 以下脚本显示当前节点的 IP 地址。

    ip addr show
    
  2. 新节点需要一个不超过15字符的唯一名称。 通过将计算机名添加到 /etc/hosts 来设置该名称。 以下脚本可使用 /etc/hosts 编辑 vi

    sudo vi /etc/hosts
    

    以下示例展示了/etc/hosts,其中包含了三个名为sqlfcivm1sqlfcivm2sqlfcivm3的节点的新增项。

    127.0.0.1      localhost localhost4 localhost4.localdomain4
    ::1            localhost localhost6 localhost6.localdomain6
    10.128.18.128  sqlfcivm1
    10.128.16.77   sqlfcivm2
    10.128.14.26   sqlfcivm3
    

    此文件在每个节点上应相同。

  3. 在新节点上停止 SQL Server 服务。

  4. 按照说明将数据库文件目录挂载到共享位置。

    从 NFS 服务器安装 nfs-utils

    sudo yum -y install nfs-utils
    

    在客户端和 NFS 服务器上打开防火墙:

    sudo firewall-cmd --permanent --add-service=nfs
    sudo firewall-cmd --permanent --add-service=mountd
    sudo firewall-cmd --permanent --add-service=rpc-bind
    sudo firewall-cmd --reload
    

    编辑 /etc/fstab 文件,将装载命令包括在内:

    <IP OF NFS SERVER>:<shared_storage_path> <database_files_directory_path> nfs timeo=14,intr
    

    运行 mount -a 使更改生效。

  5. 在新节点上,创建一个文件来存储用于登录 Pacemaker 的 SQL Server 用户名和密码。 以下命令创建并填充此文件:

    sudo touch /var/opt/mssql/secrets/passwd
    echo "<loginName>" | sudo tee -a /var/opt/mssql/secrets/passwd
    echo "<password>" | sudo tee -a /var/opt/mssql/secrets/passwd
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 600 /var/opt/mssql/secrets/passwd
    

    Caution

    密码应遵循 SQL Server 默认密码策略。 默认情况下,密码必须为至少八个字符且包含以下四种字符中的三种:大写字母、小写字母、十进制数字、符号。 密码可最长为 128 个字符。 使用的密码应尽可能长,尽可能复杂。

  6. 在新节点上,打开 Pacemaker 防火墙端口。 若要使用 firewalld 打开这些端口,请运行以下命令:

    sudo firewall-cmd --permanent --add-service=high-availability
    sudo firewall-cmd --reload
    

    如果你使用的是没有内置高可用性配置的防火墙,请为Pacemaker打开以下端口,以便与集群中的其他节点通信:

    • TCP:端口 2224、3121、21064
    • UDP:端口 5405
  7. 在新节点上安装 Pacemaker 包。

    sudo yum install pacemaker pcs fence-agents-all resource-agents
    
  8. 为安装 Pacemaker 和 Corosync 包时创建的默认用户设置密码。 使用与现有节点相同的密码。

    sudo passwd hacluster
    
  9. 启用并启动 pcsd 服务和 Pacemaker 服务。 新节点在重启后可以重新加入集群。 在新节点上运行以下命令。

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  10. 为 SQL Server 安装 FCI 资源代理。 在新节点上运行以下命令。

    sudo yum install mssql-server-ha
    
  11. 在集群中的现有节点上,对新节点进行认证并将其添加到集群中:

    sudo pcs cluster auth <nodeName3> -u hacluster
    sudo pcs cluster node add <nodeName3>
    

从群集中删除节点

若要从群集中移除节点,请运行以下命令:

sudo pcs cluster node remove <nodeName>

更改资源监控频率

sudo pcs resource op monitor interval=<interval>s <sqlResourceName>

以下示例将资源的监控间隔设置为2秒 mssqlha

sudo pcs resource op monitor interval=2s mssqlha

故障排除

在对群集进行故障排除时,了解三个守护程序如何协同工作以管理群集资源会有所帮助。

Daemon Description
Corosync 提供仲裁成员资格以及群集节点之间的消息传递。
起搏器 构建于 Corosync 之上,并为资源提供状态机。
PCSD 通过 pcs 工具管理 Pacemaker 和 Corosync。

需要运行 PCSD 才能使用 pcs 工具。

当前群集状态

sudo pcs status 返回有关集群、仲裁、节点、资源以及每个节点上的守护进程状态的基本信息。

以下示例显示了健康的Pacemaker法定人数输出:

Cluster name: MyAppSQL
Last updated: Wed Oct 31 12:00:00 2024  Last change: Wed Oct 31 11:00:00 2024 by root via crm_resource on sqlvmnode1
Stack: corosync
Current DC: sqlvmnode1  (version 1.1.13-10.el7_2.4-44eb2dd) - partition with quorum
3 nodes and 1 resource configured

Online: [ sqlvmnode1 sqlvmnode2 sqlvmnode3 ]

Full list of resources:

mssqlha (ocf::sql:fci): Started sqlvmnode1

PCSD Status:
sqlvmnode1: Online
sqlvmnode2: Online
sqlvmnode3: Online

Daemon Status:
corosync: active/disabled
pacemaker: active/enabled

在此例中, partition with quorum 表示节点的多数集数在线。 如果群集失去节点多数仲裁,pcs status 将返回 partition WITHOUT quorum,并且所有资源均会停止运行。

Online: [sqlvmnode1 sqlvmnode2 sqlvmnode3] 返回当前参与此群集所有节点的名称。 如果有任何节点未参与,pcs status 返回 OFFLINE: [<nodename>]

PCSD Status 显示每个节点的群集状态。

节点可能处于脱机状态的原因

节点处于脱机状态时检查以下各项。

  • 防火墙

    在所有节点上打开以下端口,让Pacemaker能够通信:

    • TCP:端口 2224、3121、21064
    • UDP:端口 5405
  • Pacemaker 或 Corosync 服务正在运行

  • 节点通信

  • 节点名映射