你当前正在访问 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 说明和文档:

群集安装

Diagram that shows an overview of Pacemaker on RHEL.

注意

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

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

以下各项带有前缀:

  • [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 或更高版本使用最新版本的隔离代理包。

    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 围栏代理,并且使用的是自定义角色,请确保更新自定义角色以包括操作 powerOff。 有关详细信息,请参阅 为围栏代理创建自定义角色。

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

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

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

    重要

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

    使用 /etc/hosts 的好处是群集独立于 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-xxxxxxxxxxxx 订阅的 ID,并将其 yyyyyyyy-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 隔离 从 SPN 更改为 PACEmaker 群集的 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
    sudo pcs resource clone health-azure-events allow-unhealthy-nodes=true
    
  6. 使 Pacemaker 群集脱离维护模式。

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

    sudo pcs resource cleanup
    

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

可选隔离配置

提示

仅当想要配置特殊隔离设备 fence_kdump时,本部分才适用。

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

重要

请注意,当配置为第一级隔离设备时 fence_kdump ,它会在隔离操作中引入延迟,以及应用程序资源故障转移的延迟。

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

建议的 fence_kdump 超时可能需要适应特定环境。

建议仅在需要时才配置fence_kdump隔离,以收集 VM 中的诊断,并且始终与传统的围栏方法(例如 Azure 隔离代理)结合使用。

以下 Red Hat 知识库(KB)文章包含有关配置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] 执行 fence_kdump_nodes 配置 /etc/kdump.conf 以避免 fence_kdump 某些版本的超时 kexec-tools 失败。 有关详细信息,请参阅未使用 kexec-tools 版本 2.0.15 或更高版本指定fence_kdump_nodes时fence_kdump超时,fence_kdump RHEL 6 或 7 高可用性群集中的“x 秒后超时”失败,其中 kexec-tools 版本低于 2.0.14。 此处提供了双节点群集的示例配置。 进行更改 /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
    

后续步骤