为 SQL Server 可用性组配置 Pacemaker 群集

适用于:SQL Server - Linux

本文介绍如何使用 Pacemaker 在 Linux 上创建三节点群集,以及如何将先前创建的可用性组添加为群集中的资源。 若要实现高可用性,Linux 上的可用性组需要三个节点,请参阅可用性组配置的高可用性和数据保护

注意

无偏差通信

本文包含对术语“从属”的引用,Microsoft 认为该术语在此上下文中存在冒犯性。 本文使用该术语的原因是,当前软件中存在该术语。 在从软件中删除该术语后,我们会将其从本文中删除。

SQL Server 与 Linux 上的 Pacemaker 没有像它与 Windows Server 故障转移群集 (WSFC) 那样紧密集成。 SQL Server 实例不知道群集,所有的业务流程都是从外向内的。 Pacemaker 提供群集资源业务流程。 此外,虚拟网络名称特定于 Windows Server 故障转移群集;Pacemaker 中没有等效项。 查询集群信息的可用性组动态管理视图 (DMV) 在 Pacemaker 集群上返回空行。 要在故障转移后创建透明重新连接的侦听器,请使用用于创建虚拟 IP 资源的 IP 在 DNS 中手动注册侦听器名称。

仍可创建一个侦听器,用于故障转移后的透明重新连接,但需要使用创建虚拟 IP 资源所用的 IP 在 DNS 服务器中手动注册侦听器名称(如以下部分所述)。

以下各部分介绍了用于为每个受支持的 Linux 发行版设置 Pacemaker 群集并在群集中添加可用性组作为资源以实现高可用性的步骤。

集群层基于在 Pacemaker 的基础上构建的 Red Hat Enterprise Linux (RHEL) HA 加载项

注意

访问 Red Hat 完整文档需要有效订阅。

有关群集配置、资源代理选项和管理的详细信息,请访问 RHEL 参考文档

路线图

在 Linux 服务器上创建可用性组以获得高可用性的步骤与 Windows Server 故障转移群集上的步骤不同。 下面的列表对高级步骤进行了说明:

  1. 在群集节点上配置 SQL Server

  2. 创建可用性组

  3. 配置 Pacemaker 等群集资源管理器。 本文中包含这些说明。

    配置群集资源管理器的方式取决于特定的 Linux 分发版。

    重要

    生产环境需要隔离代理以实现高可用性。 本文档中的演示不使用隔离代理。 演示仅用于测试和验证目的。 Linux 群集使用隔离将群集返回到某个已知状态。 配置隔离的方式取决于分发版和环境。 目前,在某些云环境中无法使用隔离。 有关详细信息,请参阅 RHEL 高可用性群集的支持策略 - 虚拟化平台

  4. 将可用性组添加为群集中的资源

为 RHEL 配置高可用性

若要为 RHEL 配置高可用性,请启用高可用性订阅,然后配置 Pacemaker。

为 RHEL 启用高可用性订阅

群集中的每个节点都必须具有适当的 RHEL 订阅和高可用性添加项。 在如何在 Red Hat Enterprise Linux 中安装高可用性群集包中查看要求。 请按照以下步骤配置订阅和存储库:

  1. 注册系统。

    sudo subscription-manager register
    

    提供用户名和密码。

  2. 列出可用的注册池。

    sudo subscription-manager list --available
    

    从可用池列表中,请注意高可用性订阅的池 ID。

  3. 更新以下脚本。 使用池 ID 替换 <pool id> 以获得上一步中的高可用性。 运行脚本以附加订阅。

    sudo subscription-manager attach --pool=<pool id>
    
  4. 启用存储库。

    RHEL 7

    sudo subscription-manager repos --enable=rhel-ha-for-rhel-7-server-rpms
    

    RHEL 8

    sudo subscription-manager repos --enable=rhel-8-for-x86_64-highavailability-rpms
    

有关详细信息,请参阅 Pacemaker - 开源、高可用性群集

配置订阅后,请完成以下步骤以配置 Pacemaker:

配置 Pacemaker

注册订阅后,请完成以下步骤以配置 Pacemaker:

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

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

    如果防火墙没有内置高可用性配置,请打开 Pacemaker 的以下端口。

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

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

    sudo passwd hacluster
    
  4. 若要在重启后允许节点重新加入群集,请启用并启动 pcsd 服务和 Pacemaker。 在所有节点上运行以下命令。

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  5. 创建群集。 若要创建群集,请运行以下命令:

    RHEL 7

    sudo pcs cluster auth <node1> <node2> <node3> -u hacluster -p <password for hacluster>
    sudo pcs cluster setup --name <clusterName> <node1> <node2> <node3>
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    

    RHEL 8

    对于 RHEL 8,需要单独对节点进行身份验证。 出现系统提示时,请手动输入 hacluster 的用户名和密码。

    sudo pcs host auth <node1> <node2> <node3>
    sudo pcs cluster setup <clusterName> <node1> <node2> <node3>
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    

    备注

    如果以前已在相同节点上配置了群集,则需要在运行 pcs cluster setup 时使用“--force”选项。 此选项等同于运行 pcs cluster destroy。 若要重新启用 Pacemaker,请运行 sudo systemctl enable pacemaker

  6. 为 SQL Server 安装 SQL Server 资源代理。 在所有节点上运行以下命令。

    sudo yum install mssql-server-ha
    

配置 Pacemaker 后,请使用 pcs 与群集进行交互。 在群集中的一个节点上执行所有命令。

有关多个网络接口 (NIC) 的注意事项

使用具有多个 NIC 的服务器设置高可用性时,请遵循以下建议:

  • 确保已设置 hosts 文件,这样多个 NIC 的服务器 IP 地址就能解析为每个节点上 Linux 服务器的主机名。

  • 使用 Pacemaker 设置群集时,应使用服务器的主机名配置 Corosync 来设置所有 NIC 的配置。 我们只希望通过单个 NIC 进行 Pacemaker/Corosync 通信。 配置 Pacemaker 群集后,修改 corosync.conf 文件中的配置,并更新要用于 Pacemaker/Corosync 通信的专用 NIC 的 IP 地址。

  • corosync.conf 文件中给出的 <hostname> 应该与执行反向查找 (ping -a <ip_address>) 时给出的输出相同,并且应该是主机上配置的短名称。 确保 hosts 文件同时表示名称解析的正确 IP 地址。

下面突出显示了对 corosync.conf 文件示例的更改:

  nodelist {
    node {
        ring0_addr: <ip_address_of_node1_NIC1>
        name: <hostname_of_node1>
        nodeid: 1
    }
    node {
        ring0_addr: <ip_address_of_node2_NIC1>
        name: <hostname_of_node2>
        nodeid: 2
    }
    node {
        ring0_addr: <ip_address_of_node3_NIC1>
        name: <hostname_of_node3>
        nodeid: 3
    }
  }

配置隔离设备

Pacemaker 群集供应商需要隔离故障节点,并为受支持的群集安装程序配置隔离设备。 群集资源管理器无法确定节点的状态或节点上资源的状态时,隔离用于使群集再次处于已知状态。

隔离设备提供隔离代理。 有关如何在 Azure 中为此群集创建隔离设备的示例,请参阅在 Azure 中的 Red Hat Enterprise Linux 上设置 Pacemaker。 修改环境的说明。

资源级别隔离确保在因配置资源引起服务中断时,不会发生数据损坏。 例如,可以使用资源级别隔离在通信链接出现故障时将节点上的磁盘标记为过时。

节点级别隔离可确保节点不会运行任何资源。 这是通过重置节点来完成的。 Pacemaker 支持各种隔离设备。 示例包括不间断电源或服务器的管理接口卡。

有关如何隔离故障节点的信息,请参阅以下文章:

注意

由于节点级别隔离配置在很大程度上取决于你的环境,因此请在本教程中禁用它(稍后可以对其进行配置)。 以下脚本禁用节点级别隔离:

sudo pcs property set stonith-enabled=false

禁用隔离仅出于测试目的。 如果计划在生产环境中使用 Pacemaker,则应根据环境来计划隔离实现,并使其处于启用状态。

设置群集属性 cluster-recheck-interval

cluster-recheck-interval 表示群集检查资源参数、约束或其他群集选项中的更改的轮询间隔。 如果副本发生故障,群集将尝试按 failure-timeout 值和 cluster-recheck-interval 值所绑定的间隔重启副本。 例如,如果 failure-timeout 设置为 60 秒且 cluster-recheck-interval 设置为 120 秒,则会在 60 秒至 120 秒的间隔内尝试重启。 建议将 failure-timeout 设置为 60 秒,将 cluster-recheck-interval 设置为大于 60 秒的值。 不建议将 cluster-recheck-interval 设置为较小的值。

若要将属性值更新为 2 minutes,请运行:

sudo pcs property set cluster-recheck-interval=2min

如果已拥有由 Pacemaker 群集管理的可用性组资源,则当 Pacemaker 包 1.1.18-11.el7 的值为 false 时,该包引入了 start-failure-is-fatal 群集设置的行为更改。 此更改会影响故障转移工作流。 如果主要副本发生中断,群集应故障转移到其中一个可用的次要副本。 然而,用户会注意到群集一直尝试启动发生故障的主要副本。 如果该主要副本由于永久性中断而永远不联机,群集就永远不会将故障转移到另一个可用的次要副本。 由于此更改,先前建议使用的用于设置 start-failure-is-fatal 的配置不再有效,并且必须将该设置还原为其默认值 true

此外,必须更新 AG 资源以包含 failover-timeout 属性。

若要将属性值更新为 true,请运行:

sudo pcs property set start-failure-is-fatal=true

若要将 ag_cluster 资源属性 failure-timeout 更新为 60s,请运行:

pcs resource update ag_cluster meta failure-timeout=60s

有关 Pacemaker 群集属性的信息,请参阅 Pacemaker 群集属性

为 Pacemaker 创建 SQL Server 登录名

  1. 在所有 SQL Server 实例上,为 Pacemaker 创建 Server 登录名。 以下 Transact-SQL 创建登录名:

    USE [master]
    GO
    CREATE LOGIN [pacemakerLogin] with PASSWORD= N'ComplexP@$$w0rd!';
    
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin];
    

    创建可用性组时,在创建该可用性组之后到向其中添加任何节点之前,pacemaker 用户需要对可用性组的 ALTER、CONTROL 和 VIEW DEFINITION 权限。

  2. 在所有 SQL Server 实例上,保存 SQL Server 登录名的凭据

    echo 'pacemakerLogin' >> ~/pacemaker-passwd
    echo 'ComplexP@$$w0rd!' >> ~/pacemaker-passwd
    sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd # Only readable by root
    

创建可用性组资源

若要创建可用性组资源,请使用 pcs resource create 命令并设置资源属性。 以下命令将为可用性组创建一个名为 ag1ocf:mssql:ag master/subordinate 类型的资源。

RHEL 7

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=60s master notify=true

RHEL 8

随着 RHEL 8 可用,create 语法已发生了更改。 如果使用的是 RHEL 8,术语 master 已更改为 promotable。 使用以下 create 命令,而不是上面的命令:

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=60s promotable notify=true

备注

创建资源并在之后定期更新,Pacemaker 资源代理会根据可用性组的配置自动设置可用性组上的 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 值。 例如,如果可用性组具有三个同步副本,则代理将 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 设置为 1。 有关详细信息和其他配置选项,请参阅可用性组配置的高可用性和数据保护

创建虚拟 IP 资源

若要创建虚拟 IP 地址资源,请在一个节点上运行以下命令。 使用网络中的可用静态 IP 地址。 将 <10.128.16.240> 之间的 IP 地址替换为一个有效的 IP 地址。

sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=<10.128.16.240>

Pacemaker 中不存在等效的虚拟服务器名称。 若要使用指向字符串服务器名称而不是 IP 地址的连接字符串,请在 DNS 中注册虚拟 IP 资源地址和所需的虚拟服务器名称。 对于 DR 配置,请在主站点和 DR 站点上使用 DNS 服务器注册所需的虚拟服务器名称和 IP 地址。

加主机托管约束

Pacemaker 群集中的几乎所有决策(例如,选择资源运行的位置)都通过比较分数来完成。 分数按资源计算。 群集资源管理器选择特定资源分数最高的节点。 如果节点的某一资源分数为负,则该资源无法在此节点上运行。

在 pacemaker 群集上,可以使用约束来控制群集的决定。 约束具有一个分数。 如果约束的分数低于 INFINITY,则 Pacemaker 将其视为建议项。 INFINITY 的分数是必需项。

要确保主副本和虚拟 IP 资源在同一主机上运行,请定义分数为 INFINITY 的主机托管约束。 若要添加主机托管约束,请在一个节点上运行以下命令。

RHEL 7

在 RHEL 7 中创建 ag_cluster 资源时,它会将资源创建为 ag_cluster-master。 对于 RHEL 7,请使用以下命令:

sudo pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Master

RHEL 8

在 RHEL 8 中创建 ag_cluster 资源时,它会将资源创建为 ag_cluster-clone。 对于 RHEL 8,请使用以下命令:

sudo pcs constraint colocation add virtualip with master ag_cluster-clone INFINITY with-rsc-role=Master

添加排序约束

主机托管约束具有隐式排序约束。 在移动可用性组资源前,它会移动虚拟 IP 资源。 默认情况下的事件序列为:

  1. 用户发出 pcs resource move,将资源从节点 1 的可用性组主要副本移动到节点 2。

  2. 虚拟 IP 资源在节点 1 上停止。

  3. 虚拟 IP 资源在节点 2 上启动。

    注意

    此时,IP 地址暂时指向节点 2,同时节点 2 仍为故障转移前的次要副本。

  4. 节点 1 上的可用性组主要副本降级为次要副本。

  5. 节点 2 上的可用性组次要副本升级为主要副本。

若要防止 IP 地址暂时指向具有故障转移前的次要副本的节点,请添加排序约束。

若要添加排序约束,请在一个节点上运行以下命令:

RHEL 7

sudo pcs constraint order promote ag_cluster-master then start virtualip

RHEL 8

sudo pcs constraint order promote ag_cluster-clone then start virtualip

重要

配置群集并将可用性组添加为群集资源后,无法使用 Transact-SQL 对可用性组资源进行故障转移。 Linux 上的 SQL Server 群集资源与此操作系统的耦合性不及在 Windows Server 故障转移群集 (WSFC) 上的耦合性高。 SQL Server 服务无法识别此群集是否存在。 所有业务流程都通过群集管理工具完成。 在 RHEL 或 Ubuntu 中使用 pcs,在 SLES 中使用 crm 工具。

使用 pcs 手动对可用性组进行故障转移。 请勿使用 Transact-SQL 启动故障转移。 有关说明,请参阅故障转移