你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 中的 Red Hat Enterprise Linux 上设置 Pacemaker

本文介绍如何在 Red Hat Enterprise Server (RHEL) 上配置基本 Pacemaker 群集。 这些说明涵盖 RHEL 7、RHEL 8 和 RHEL 9。

先决条件

请先阅读以下 SAP 说明和文档:

群集安装

概览 RHEL 上的 Pacemaker 的关系图。

注意

Red Hat 不支持软件仿真的监视程序。 Red Hat 不支持云平台上的 SBD。 有关详细信息,请参阅 RHEL 高可用性群集的支持策略 - sbd 和 fence_sbd

Azure 上 Pacemaker RHEL 群集唯一支持的隔离机制是 Azure 隔离代理。

重要

标准支持策略未涵盖跨多个虚拟网络 (VNets)/子网的 Pacemaker 群集。

以下各项带有前缀:

  • [A] :适用于所有节点
  • [1]:仅适用于节点 1
  • [2]:仅适用于节点 2

文档中标记了 RHEL 7 和 RHEL 8/RHEL 9 之间有关命令或配置的差异。

  1. [A] 注册。 此步骤是可选的。 如果使用的是启用了 RHEL SAP HA 的映像,则不需要执行此步骤。

    例如,如果要在 RHEL 7 上部署,请注册 VM 并将其附加到包含 RHEL 7 存储库的池中。

    sudo subscription-manager register
    # List the available pools
    sudo subscription-manager list --available --matches '*SAP*'
    sudo subscription-manager attach --pool=<pool id>
    

    将池附加到 Azure 市场即用即付 RHEL 映像时,实际上要为 RHEL 的使用支付双倍费用。 不仅要为即用即付映像付费一次,还要为池中附加的 RHEL 权利付费一次。 为了缓解这种情况,Azure 现在提供了自带订阅 RHEL 映像。 有关详细信息,请参阅 Red Hat Enterprise Linux 自带订阅 Azure 映像

  2. [A] 启用 RHEL for SAP 存储库。 此步骤是可选的。 如果使用的是启用了 RHEL SAP HA 的映像,则不需要执行此步骤。

    若要在 RHEL 7 上安装所需的包,请启用以下存储库:

    sudo subscription-manager repos --disable "*"
    sudo subscription-manager repos --enable=rhel-7-server-rpms
    sudo subscription-manager repos --enable=rhel-ha-for-rhel-7-server-rpms
    sudo subscription-manager repos --enable=rhel-sap-for-rhel-7-server-rpms
    sudo subscription-manager repos --enable=rhel-ha-for-rhel-7-server-eus-rpms
    
  3. [A] 安装 RHEL HA 附加产品。

     sudo yum install -y pcs pacemaker fence-agents-azure-arm nmap-ncat
    

    重要

    如果资源停止故障或者群集节点无法互相通信,我们建议客户使用以下 Azure 隔离代理版本(或更高版本)以获取更快的故障转移时间:

    RHEL 7.7 或更高版本使用最新可用版本的 fence-agents 包。

    RHEL 7.6:fence-agents-4.2.1-11.el7_6.8

    RHEL 7.5:fence-agents-4.0.11-86.el7_5.8

    RHEL 7.4:fence-agents-4.0.11-66.el7_4.12

    有关详细信息,请参阅隔离作为 RHEL 高可用性群集成员运行的 Azure VM 需要很长时间,或者在 VM 关闭之前隔离失败/超时

    重要

    对于希望将 Azure 资源托管标识而不是服务主体名称用于隔离代理的客户,建议使用以下版本的 Azure 隔离代理(或更高版本):

    RHEL 8.4:fence-agents-4.2.1-54.el8。

    RHEL 8.2:fence-agents-4.2.1-41.el8_2.4

    RHEL 8.1:fence-agents-4.2.1-30.el8_1.4

    RHEL 7.9:fence-agents-4.2.1-41.el7_9.4。

    重要

    在 RHEL 9 上,建议使用以下包版本(或更高版本),以避免 Azure 隔离代理出现问题:

    fence-agents-4.10.0-20.el9_0.7

    fence-agents-common-4.10.0-20.el9_0.6

    ha-cloud-support-4.10.0-20.el9_0.6.x86_64.rpm

    检查 Azure 隔离代理的版本。 如有必要,请将其更新为所需的最低版本或更高版本。

    # Check the version of the Azure Fence Agent
     sudo yum info fence-agents-azure-arm
    

    重要

    如果需要使用自定义角色更新 Azure 隔离代理,请确保更新自定义角色来将关闭操作包含在内。 有关详细信息,请参阅为围栏代理创建自定义角色

  4. 如果要在 RHEL 9 上部署,还需安装用于云部署的资源代理。

    sudo yum install -y resource-agents-cloud
    
  5. [A] 设置主机名解析。

    可以使用 DNS 服务器,或修改所有节点上的 /etc/hosts 文件。 此示例演示如何使用 /etc/hosts 文件。 请替换以下命令中的 IP 地址和主机名。

    重要

    如果在群集配置中使用主机名,则必须具有可靠的主机名解析。 如果名称不可用,群集通信就会失败,这可能会导致群集故障转移延迟。

    使用 /etc/hosts 的好处是群集可以不受 DNS 影响,DNS 也可能会成为单一故障点。

    sudo vi /etc/hosts
    

    将以下行插入 /etc/hosts 中。 根据环境更改 IP 地址和主机名。

    # IP address of the first cluster node
    10.0.0.6 prod-cl1-0
    # IP address of the second cluster node
    10.0.0.7 prod-cl1-1
    
  6. [A]hacluster 密码更改为同一密码。

    sudo passwd hacluster
    
  7. [A] 为 Pacemaker 添加防火墙规则。

    向群集节点之间的所有群集通信添加以下防火墙规则。

    sudo firewall-cmd --add-service=high-availability --permanent
    sudo firewall-cmd --add-service=high-availability
    
  8. [A] 启用基本群集服务。

    运行以下命令以启用并启动 Pacemaker 服务。

    sudo systemctl start pcsd.service
    sudo systemctl enable pcsd.service
    
  9. [1] 创建 Pacemaker 群集。

    运行以下命令以验证节点并创建群集。 将令牌设置为 30000,以允许内存保留维护。 有关详细信息,请参阅这篇适用于 Linux 的文章。

    如果在 RHEL 7.x 上构建群集,请使用以下命令

    sudo pcs cluster auth prod-cl1-0 prod-cl1-1 -u hacluster
    sudo pcs cluster setup --name nw1-azr prod-cl1-0 prod-cl1-1 --token 30000
    sudo pcs cluster start --all
    

    如果在 RHEL 8.x/RHEL 9.x 上构建群集,请使用以下命令

    sudo pcs host auth prod-cl1-0 prod-cl1-1 -u hacluster
    sudo pcs cluster setup nw1-azr prod-cl1-0 prod-cl1-1 totem token=30000
    sudo pcs cluster start --all
    

    运行以下命令验证群集状态:

    # Run the following command until the status of both nodes is online
    sudo pcs status
    
    # Cluster name: nw1-azr
    # WARNING: no stonith devices and stonith-enabled is not false
    # Stack: corosync
    # Current DC: prod-cl1-1 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
    # Last updated: Fri Aug 17 09:18:24 2018
    # Last change: Fri Aug 17 09:17:46 2018 by hacluster via crmd on prod-cl1-1
    #
    # 2 nodes configured
    # 0 resources configured
    #
    # Online: [ prod-cl1-0 prod-cl1-1 ]
    #
    # No resources
    #
    # Daemon Status:
    #   corosync: active/disabled
    #   pacemaker: active/disabled
    #   pcsd: active/enabled
    
  10. [A] 设置预期投票。

    # Check the quorum votes 
    pcs quorum status
    
    # If the quorum votes are not set to 2, execute the next command
    sudo pcs quorum expected-votes 2
    

    提示

    如果要构建多节点群集(即节点数超过两个的群集),请不要将投票数设置为 2。

  11. [1] 允许并发隔离操作。

    sudo pcs property set concurrent-fencing=true
    

创建隔离设备

隔离设备使用 Azure 资源托管标识或服务主体来对 Azure 授权。

若要创建托管标识 (MSI),请为群集中的每个 VM 创建系统分配的托管标识。 如果已存在系统分配的托管标识,则使用该标识。 目前,请勿将用户分配的托管标识与 Pacemaker 一起使用。 RHEL 7.9 和 RHEL 8.x/RHEL 9.x 支持基于托管标识的隔离设备。

[1] 为隔离代理创建自定义角色

默认情况下,托管标识和服务主体都无权访问 Azure 资源。 需要为托管标识或服务主体授予启动和停止(关闭)群集所有 VM 的权限。 如果尚未创建自定义角色,可以使用 PowerShellAzure CLI 创建。

将以下内容用于输入文件。 你需要根据订阅调整内容,即将 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxyyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy 替换为订阅的 ID。 如果只有一个订阅,请删除 AssignableScopes 中的第二个条目。

{
      "Name": "Linux Fence Agent Role",
      "description": "Allows to power-off and start virtual machines",
      "assignableScopes": [
              "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
              "/subscriptions/yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
      ],
      "actions": [
              "Microsoft.Compute/*/read",
              "Microsoft.Compute/virtualMachines/powerOff/action",
              "Microsoft.Compute/virtualMachines/start/action"
      ],
      "notActions": [],
      "dataActions": [],
      "notDataActions": []
}

[A] 分配自定义角色

使用托管标识或服务主体。

将上一部分中创建的自定义角色 Linux Fence Agent Role 分配给群集 VM 的每个托管标识。 每个 VM 系统分配的托管标识都需要为每个群集 VM 资源分配的角色。 有关详细信息,请参阅使用 Azure 门户为托管标识分配对资源的访问权限。 验证每个 VM 的托管标识角色分配是否包含所有群集 VM。

重要

请注意,使用托管标识分配和删除授权可能会延迟,直到生效。

[1] 创建隔离设备

编辑 VM 的权限后,可以在群集中配置隔离设备。

sudo pcs property set stonith-timeout=900

注意

如果 RHEL 主机名和 Azure VM 名称不相同,则命令中仅需要选项 pcmk_host_map。 以 hostname:vm-name 格式指定映射。 请参阅命令中的粗体部分。 有关详细信息,请参阅应使用哪种格式在 pcmk_host_map 中指定节点到隔离设备的映射?

对于 RHEL 7.x,请使用以下命令配置隔离设备:

sudo pcs stonith create rsc_st_azure fence_azure_arm msi=true resourceGroup="resource group" \ 
subscriptionId="subscription id" pcmk_host_map="prod-cl1-0:prod-cl1-0-vm-name;prod-cl1-1:prod-cl1-1-vm-name" \
power_timeout=240 pcmk_reboot_timeout=900 pcmk_monitor_timeout=120 pcmk_monitor_retries=4 pcmk_action_limit=3 pcmk_delay_max=15 \
op monitor interval=3600

对于 RHEL 8.x/9.x,请使用以下命令配置隔离设备

# Run following command if you are setting up fence agent on (two-node cluster and pacemaker version greater than 2.0.4-6.el8) OR (HANA scale out)
sudo pcs stonith create rsc_st_azure fence_azure_arm msi=true resourceGroup="resource group" \
subscriptionId="subscription id" pcmk_host_map="prod-cl1-0:prod-cl1-0-vm-name;prod-cl1-1:prod-cl1-1-vm-name" \
power_timeout=240 pcmk_reboot_timeout=900 pcmk_monitor_timeout=120 pcmk_monitor_retries=4 pcmk_action_limit=3 \
op monitor interval=3600

# Run following command if you are setting up fence agent on (two-node cluster and pacemaker version less than 2.0.4-6.el8)
sudo pcs stonith create rsc_st_azure fence_azure_arm msi=true resourceGroup="resource group" \
subscriptionId="subscription id" pcmk_host_map="prod-cl1-0:prod-cl1-0-vm-name;prod-cl1-1:prod-cl1-1-vm-name" \
power_timeout=240 pcmk_reboot_timeout=900 pcmk_monitor_timeout=120 pcmk_monitor_retries=4 pcmk_action_limit=3 pcmk_delay_max=15 \
op monitor interval=3600

如果使用的是基于服务主体配置的隔离设备,请阅读使用 Azure 隔离将 Pacemaker 群集从 SPN 更改为 MSI,并了解如何转换为托管标识配置。

提示

  • 若要避免双节点 Pacemaker 群集内的隔离争用,可以配置 priority-fencing-delay 群集属性。 当发生分脑方案时,此属性会在隔离具有较高总资源优先级的节点时引入额外的延迟。 有关详细信息,请参阅 Pacemaker 是否可以隔离运行最少资源的群集节点?
  • 属性 priority-fencing-delay 适用于 Pacemaker 版本 2.0.4-6.el8 或更高版本,并且适用于双节点群集。 如果配置 priority-fencing-delay 群集属性,则无需设置 pcmk_delay_max 属性。 但是,如果 Pacemaker 版本低于 2.0.4-6.el8,则需要设置 pcmk_delay_max 属性。
  • 有关如何设置 priority-fencing-delay 群集属性的说明,请参阅相应的 SAP ASCS/ERS 和 SAP HANA 纵向扩展 HA 文档。

对监视和隔离操作进行反序列化。 因此,如果存在运行时间较长的监视操作和同时发生的隔离事件,则群集故障转移不会延迟,因为监视操作已经在运行。

[1] 启用隔离设备

sudo pcs property set stonith-enabled=true

提示

Azure 隔离代理需要与公共终结点建立出站连接。 有关详细信息以及可能的解决方案,请参阅使用标准 ILB 的 VM 的公共终结点连接

为 Azure 计划事件配置 Pacemaker

Azure 提供计划事件。 计划事件通过元数据服务发送,并可为应用程序留出时间为此类事件做准备。

Pacemaker 资源代理 azure-events-az 可监视计划的 Azure 事件。 如果检测到事件并且资源代理确定有另一个群集节点可用,则会设置群集运行状况属性。

为节点设置群集健康状况属性后,会触发位置约束,并且所有名称不以 health- 开头的资源将从具有计划事件的节点迁移走。 在受影响的群集节点没有正在运行的群集资源后,计划事件会得到确认,并且可以执行其操作(例如重启)。

  1. [A] 确保已安装 azure-events-az 代理的程序包,并且其版本是最新的。

    RHEL 8.x: sudo dnf info resource-agents
    RHEL 9.x: sudo dnf info resource-agents-cloud
    

    最低版本要求:

    • RHEL 8.4:resource-agents-4.1.1-90.13
    • RHEL 8.6:resource-agents-4.9.0-16.9
    • RHEL 8.8:resource-agents-4.9.0-40.1
    • RHEL 9.0:resource-agents-cloud-4.10.0-9.6
    • RHEL 9.2 及更新版本:resource-agents-cloud-4.10.0-34.1
  2. [1] 配置 Pacemaker 中的资源。

    #Place the cluster in maintenance mode
    sudo pcs property set maintenance-mode=true
    
    
  3. [1] 设置 Pacemaker 群集健康状况节点策略和约束。

    sudo pcs property set node-health-strategy=custom
    sudo pcs constraint location 'regexp%!health-.*' \
    rule score-attribute='#health-azure' \
    defined '#uname'
    

    重要

    除了后续步骤中所述的资源之外,不要定义群集中以 health- 开头的任何其他资源。

  4. [1] 设置群集属性的初始值。 针对每个群集节点和横向扩展环境(包括多数制造商 VM)运行。

    sudo crm_attribute --node prod-cl1-0 --name '#health-azure' --update 0
    sudo crm_attribute --node prod-cl1-1 --name '#health-azure' --update 0
    
  5. [1] 配置 Pacemaker 中的资源。 确保资源以 health-azure 开头。

    sudo pcs resource create health-azure-events \
    ocf:heartbeat:azure-events-az \
    op monitor interval=10s timeout=240s \
    op start timeout=10s start-delay=90s
    sudo pcs resource clone health-azure-events allow-unhealthy-nodes=true failure-timeout=120s
    
  6. 使 Pacemaker 群集退出维护模式。

    sudo pcs property set maintenance-mode=false
    
  7. 清除启用期间出现的任何错误,并验证 health-azure-events 资源是否已在所有群集节点上成功启动。

    sudo pcs resource cleanup
    

    首次执行计划事件的查询最多可能需要 2 分钟。 计划事件的 Pacemaker 测试可以使用群集 VM 的重新启动或重新部署操作。 有关详细信息,请参阅计划事件

可选隔离配置

提示

本部分仅适用于想要配置特殊隔离设备 fence_kdump 的情况。

如果需要在 VM 中收集诊断信息,则根据隔离代理 fence_kdump 配置额外的隔离设备可能很有用。 fence_kdump 代理可检测到节点进入了 kdump 故障恢复,并在调用其他隔离方法之前允许故障恢复服务完成。 请注意,在使用 Azure VM 时,fence_kdump 无法替代传统的隔离机制,例如 Azure 隔离代理。

重要

请注意,当 fence_kdump 被配置为第一级隔离设备时,它将分别引入隔离操作延迟和应用程序资源故障转移延迟。

如果成功检测到故障转储,隔离会延迟到故障恢复服务完成。 如果故障节点无法访问或未响应,则将按确定的时间、配置的迭代次数和 fence_kdump 超时时间延迟隔离。 有关详细信息,请参阅如何在 Red Hat Pacemaker 群集中配置 fence_kdump?

建议的 fence_kdump 超时时间可能需要根据具体环境进行调整。

建议仅在需要收集 VM 内的诊断信息时才配置 fence_kdump 隔离,并且始终与 Azure 隔离代理等传统隔离方法结合使用。

以下 Red Hat 知识库文章包含有关如何配置 fence_kdump 隔离的重要信息:

除了 Azure 隔离代理配置,还可运行以下可选步骤来添加 fence_kdump 作为第一级隔离配置。

  1. [A] 验证 kdump 是否处于活动状态并已配置。

    systemctl is-active kdump
    # Expected result
    # active
    
  2. [A] 安装 fence_kdump 隔离代理。

    yum install fence-agents-kdump
    
  3. [1] 在群集中创建 fence_kdump 隔离设备。

    pcs stonith create rsc_st_kdump fence_kdump pcmk_reboot_action="off" pcmk_host_list="prod-cl1-0 prod-cl1-1" timeout=30
    
  4. [1] 配置隔离级别,以便先启用 fence_kdump 隔离机制。

    pcs stonith create rsc_st_kdump fence_kdump pcmk_reboot_action="off" pcmk_host_list="prod-cl1-0 prod-cl1-1"
    pcs stonith level add 1 prod-cl1-0 rsc_st_kdump
    pcs stonith level add 1 prod-cl1-1 rsc_st_kdump
    pcs stonith level add 2 prod-cl1-0 rsc_st_azure
    pcs stonith level add 2 prod-cl1-1 rsc_st_azure
    
    # Check the fencing level configuration 
    pcs stonith level
    # Example output
    # Target: prod-cl1-0
    # Level 1 - rsc_st_kdump
    # Level 2 - rsc_st_azure
    # Target: prod-cl1-1
    # Level 1 - rsc_st_kdump
    # Level 2 - rsc_st_azure
    
  5. [A] 允许 fence_kdump 所需的端口通过防火墙。

    firewall-cmd --add-port=7410/udp
    firewall-cmd --add-port=7410/udp --permanent
    
  6. [A] 确保 initramfs 映像文件包含 fence_kdumphosts 文件。 有关详细信息,请参阅如何在 Red Hat Pacemaker 群集中配置 fence_kdump?

    lsinitrd /boot/initramfs-$(uname -r)kdump.img | egrep "fence|hosts"
    # Example output 
    # -rw-r--r--   1 root     root          208 Jun  7 21:42 etc/hosts
    # -rwxr-xr-x   1 root     root        15560 Jun 17 14:59 usr/libexec/fence_kdump_send
    
  7. [A]/etc/kdump.conf 中执行 fence_kdump_nodes 配置,避免在某些 kexec-tools 版本中 fence_kdump 失败并显示超时。 有关详细信息,请参阅 kexec-tools 2.0.15 或更高版本没有指定 fence_kdump_nodes 时,fence_kdump 超时在 kexec-tools 版本低于 2.0.14 的 RHEL 6 或 7 高可用性群集中,fence_kdump 失败并显示“X 秒后超时”。 此处提供了双节点群集的示例配置。 在 /etc/kdump.conf 中进行更改后,必须重新生成 kdump 映像。 若要重新生成,请重启 kdump 服务。

    vi /etc/kdump.conf
    # On node prod-cl1-0 make sure the following line is added
    fence_kdump_nodes  prod-cl1-1
    # On node prod-cl1-1 make sure the following line is added
    fence_kdump_nodes  prod-cl1-0
    
    # Restart the service on each node
    systemctl restart kdump
    
  8. 通过使节点故障来测试配置。 有关详细信息,请参阅如何在 Red Hat Pacemaker 群集中配置 fence_kdump?

    重要

    如果群集已在生产环境中投入使用,请相应地计划测试,因为节点故障会影响应用程序。

    echo c > /proc/sysrq-trigger
    

后续步骤