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

在 Azure 中的 SUSE Linux Enterprise Server 上设置 Pacemaker

本文讨论如何在 Azure 中的 SUSE Linux Enterprise Server (SLES) 上设置 Pacemaker。

概述

Azure 提供两个选项来设置 SLES 的 Pacemaker 群集中的隔离。 可使用 Azure 隔离代理,它通过 Azure API 重启失败的节点,也可使用 SBD 设备。

使用 SBD 设备

可以使用以下两个选项之一配置 SBD 设备:

  • 具有 iSCSI 目标服务器的 SBD

    SBD 设备至少需要一台额外的充当 Internet 小型计算机系统接口 (iSCSI) 目标服务器并提供 SBD 设备的虚拟机 (VM)。 不过,也可以与其他 Pacemaker 群集共享这些 iSCSI 目标服务器。 使用 SBD 设备的优点是(如果已经在本地使用 SBD 设备)不需要对操作 Pacemaker 群集的方式进行任何更改。

    最多可对一个 Pacemaker 群集使用三个 SBD 设备,以允许某个 SBD 设备不可用(例如,在修补 iSCSI 目标服务器的 OS 期间)。 若要对每个 Pacemaker 使用多个 SBD 设备,请务必部署多个 iSCSI 目标服务器并从每个 iSCSI 目标服务器连接一个 SBD。 我们建议使用一个或三个 SBD 设备。 如果仅配置了两个 SBD 设备,并且其中一个 SBD 设备不可用,则 Pacemaker 无法自动隔离群集节点。 当一个 iSCSI 目标服务器关闭时,若要进行隔离,必须使用三个 SBD 设备,因此需要使用三个 iSCSI 目标服务器。 使用 SBD 时,这是复原能力最强的配置。

    SLES 上的 Pacemaker 概述示意图。

    重要

    规划和部署 Linux Pacemaker 群集节点和 SBD 设备时,不允许虚拟机与托管 SBD 设备的 VM 之间的路由通过任何其他设备(例如网络虚拟设备 (NVA))。

    NVA 维护事件和其他问题可能会对整个群集配置的稳定性和可靠性产生负面影响。 有关详细信息,请参阅用户定义路由规则

  • 具有 Azure 共享磁盘的 SBD:

    要配置 SBD 设备,需要至少将一个 Azure 共享磁盘附加到 Pacemaker 群集中的所有虚拟机。 使用 Azure 共享磁盘的 SBD 设备的优点是无需部署其他虚拟机。

    用于 SLES Pacemaker 群集的 Azure 共享磁盘 SBD 设备的示意图。

    下面是使用 Azure 共享磁盘时有关 SBD 设备的一些重要注意事项:

    • 支持将带有高级 SSD 的 Azure 共享磁盘作为 SBD 设备。
    • SLES 高可用性 15 SP01 及更高版本支持使用 Azure 共享磁盘的 SBD 设备。
    • 本地冗余存储 (LRS)区域冗余存储 (ZRS) 支持使用 Azure 高级共享磁盘的 SBD 设备。
    • 根据部署类型,为 Azure 共享磁盘选择适当的冗余存储作为 SBD 设备。
    • 只有可用性集中的部署支持使用 Azure 高级共享磁盘 LRS (skuName - Premium_LRS) 的 SBD 设备。
    • 建议对可用性区域中的部署使用 Azure 高级共享磁盘 ZRS (skuName - Premium_ZRS) 的 SBD 设备。
    • 目前,托管磁盘的 ZRS 并非在所有具有可用性区域的区域中都可用。 有关详细信息,请参阅托管磁盘的冗余选项中的 ZRS“限制”部分。
    • 用于 SBD 设备的 Azure 共享磁盘不需要很大。 maxShares 值确定可使用共享磁盘的群集节点数。 例如,可在 SAP ASCS/ERS 或 SAP HANA 纵向扩展等双节点群集上为 SBD 设备使用 P1 或 P2 磁盘大小。
    • 对于 HANA 系统复制 (HSR) 和 Pacemaker 的 HANA 横向扩展,由于 maxShares 的当前限制,可在群集中为 SBD 设备使用 Azure 共享磁盘,群集在每个复制站点最多具有 4 个节点。
    • 建议不要跨 Pacemaker 群集附加 Azure 共享磁盘 SBD 设备。
    • 如果使用多个 Azure 共享磁盘 SBD 设备,请检查可附加到 VM 的数据磁盘数目上限。
    • 若要详细了解 Azure 共享磁盘的限制,请仔细阅读 Azure 共享磁盘文档的“限制”部分。

使用 Azure 隔离代理

可以使用 Azure 隔离代理设置隔离。 Azure 隔离代理需要群集 VM 的托管标识,或一个通过 Azure API 管理重启故障节点的服务主体。 Azure 隔离代理不需要部署额外的虚拟机。

具有 iSCSI 目标服务器的 SBD

若要使用通过 iSCSI 目标服务器进行隔离的 SBD 设备,请按照后续部分中的说明进行操作。

设置 iSCSI 目标服务器

首先需要创建 iSCSI 目标虚拟机。 可以与多个 Pacemaker 群集共享 iSCSI 目标服务器。

  1. 部署新的 SLES 12 SP3 或更高版本的虚拟机,并通过 SSH 与其建立连接。 不需要很大的虚拟机。 Standard_E2s_v3 或 Standard_D2s_v3 虚拟机大小就足够了。 务必为 OS 磁盘使用高级存储。

  2. 在 iSCSI 目标虚拟机上运行以下命令:

    a. 更新 SLES。

    sudo zypper update
    

    注意

    升级或更新 OS 后,可能需要重新启动 OS。

    b. 删除包。

    请卸载以下包,避免 targetcli 和 SLES 12 SP3 的已知问题。 可以忽略找不到的包的相关错误。

    sudo zypper remove lio-utils python-rtslib python-configshell targetcli
    

    c. 安装 iSCSI 目标包。

    sudo zypper install targetcli-fb dbus-1-python
    

    d. 启用 iSCSI 目标服务。

    sudo systemctl enable targetcli
    sudo systemctl start targetcli
    

在 iSCSI 目标服务器上创建 iSCSI 设备

若要为 SAP 系统使用的群集创建 iSCSI 磁盘,请在所有 iSCSI 目标虚拟机上运行以下命令。 在本示例中,将为多个群集创建 SBD 设备。 其中演示了如何对多个群集使用一个 iSCSI 目标服务器。 在 OS 磁盘中放置 SBD 设备。 确保有足够的空间。

  • nfs:标识 NFS 群集。
  • ascsnw1:标识 NW1 的 ASCS 群集。
  • dbnw1:标识 NW1 的数据库群集。
  • nfs-0 和 nfs-1:NFS 群集节点的主机名。
  • nw1-xscs-0 和 nw1-xscs-1:NW1 ASCS 群集节点的主机名。
  • nw1-db-0 和 nw1-db-1:数据库群集节点的主机名。

在以下说明中,替换调整群集节点的主机名和 SAP 系统的 SID。

  1. 为所有 SBD 设备创建根文件夹。

    sudo mkdir /sbd
    
  2. 为 NFS 服务器创建 SBD 设备。

    sudo targetcli backstores/fileio create sbdnfs /sbd/sbdnfs 50M write_back=false
    sudo targetcli iscsi/ create iqn.2006-04.nfs.local:nfs
    sudo targetcli iscsi/iqn.2006-04.nfs.local:nfs/tpg1/luns/ create /backstores/fileio/sbdnfs
    sudo targetcli iscsi/iqn.2006-04.nfs.local:nfs/tpg1/acls/ create iqn.2006-04.nfs-0.local:nfs-0
    sudo targetcli iscsi/iqn.2006-04.nfs.local:nfs/tpg1/acls/ create iqn.2006-04.nfs-1.local:nfs-1
    
  3. 为 SAP 系统 NW1 的 ASCS 服务器创建 SBD 设备。

    sudo targetcli backstores/fileio create sbdascsnw1 /sbd/sbdascsnw1 50M write_back=false
    sudo targetcli iscsi/ create iqn.2006-04.ascsnw1.local:ascsnw1
    sudo targetcli iscsi/iqn.2006-04.ascsnw1.local:ascsnw1/tpg1/luns/ create /backstores/fileio/sbdascsnw1
    sudo targetcli iscsi/iqn.2006-04.ascsnw1.local:ascsnw1/tpg1/acls/ create iqn.2006-04.nw1-xscs-0.local:nw1-xscs-0
    sudo targetcli iscsi/iqn.2006-04.ascsnw1.local:ascsnw1/tpg1/acls/ create iqn.2006-04.nw1-xscs-1.local:nw1-xscs-1
    
  4. 为 SAP 系统 NW1 的数据库群集创建 SBD 设备。

    sudo targetcli backstores/fileio create sbddbnw1 /sbd/sbddbnw1 50M write_back=false
    sudo targetcli iscsi/ create iqn.2006-04.dbnw1.local:dbnw1
    sudo targetcli iscsi/iqn.2006-04.dbnw1.local:dbnw1/tpg1/luns/ create /backstores/fileio/sbddbnw1
    sudo targetcli iscsi/iqn.2006-04.dbnw1.local:dbnw1/tpg1/acls/ create iqn.2006-04.nw1-db-0.local:nw1-db-0
    sudo targetcli iscsi/iqn.2006-04.dbnw1.local:dbnw1/tpg1/acls/ create iqn.2006-04.nw1-db-1.local:nw1-db-1
    
  5. 保存 targetcli 更改。

    sudo targetcli saveconfig
    
  6. 检查以确保所有设置是否正确。

    sudo targetcli ls
    
    o- / .......................................................................................................... [...]
    o- backstores ............................................................................................... [...]
    | o- block ................................................................................... [Storage Objects: 0]
    | o- fileio .................................................................................. [Storage Objects: 3]
    | | o- sbdascsnw1 ................................................ [/sbd/sbdascsnw1 (50.0MiB) write-thru activated]
    | | | o- alua .................................................................................... [ALUA Groups: 1]
    | | |   o- default_tg_pt_gp ........................................................ [ALUA state: Active/optimized]
    | | o- sbddbnw1 .................................................... [/sbd/sbddbnw1 (50.0MiB) write-thru activated]
    | | | o- alua .................................................................................... [ALUA Groups: 1]
    | | |   o- default_tg_pt_gp ........................................................ [ALUA state: Active/optimized]
    | | o- sbdnfs ........................................................ [/sbd/sbdnfs (50.0MiB) write-thru activated]
    | |   o- alua .................................................................................... [ALUA Groups: 1]
    | |     o- default_tg_pt_gp ........................................................ [ALUA state: Active/optimized]
    | o- pscsi ................................................................................... [Storage Objects: 0]
    | o- ramdisk ................................................................................. [Storage Objects: 0]
    o- iscsi ............................................................................................. [Targets: 3]
    | o- iqn.2006-04.ascsnw1.local:ascsnw1 .................................................................. [TPGs: 1]
    | | o- tpg1 ................................................................................ [no-gen-acls, no-auth]
    | |   o- acls ........................................................................................... [ACLs: 2]
    | |   | o- iqn.2006-04.nw1-xscs-0.local:nw1-xscs-0 ............................................... [Mapped LUNs: 1]
    | |   | | o- mapped_lun0 ............................................................ [lun0 fileio/sbdascsnw1 (rw)]
    | |   | o- iqn.2006-04.nw1-xscs-1.local:nw1-xscs-1 ............................................... [Mapped LUNs: 1]
    | |   |   o- mapped_lun0 ............................................................ [lun0 fileio/sbdascsnw1 (rw)]
    | |   o- luns ........................................................................................... [LUNs: 1]
    | |   | o- lun0 .......................................... [fileio/sbdascsnw1 (/sbd/sbdascsnw1) (default_tg_pt_gp)]
    | |   o- portals ..................................................................................... [Portals: 1]
    | |     o- 0.0.0.0:3260 ...................................................................................... [OK]
    | o- iqn.2006-04.dbnw1.local:dbnw1 ...................................................................... [TPGs: 1]
    | | o- tpg1 ................................................................................ [no-gen-acls, no-auth]
    | |   o- acls ........................................................................................... [ACLs: 2]
    | |   | o- iqn.2006-04.nw1-db-0.local:nw1-db-0 ................................................... [Mapped LUNs: 1]
    | |   | | o- mapped_lun0 .............................................................. [lun0 fileio/sbddbnw1 (rw)]
    | |   | o- iqn.2006-04.nw1-db-1.local:nw1-db-1 ................................................... [Mapped LUNs: 1]
    | |   |   o- mapped_lun0 .............................................................. [lun0 fileio/sbddbnw1 (rw)]
    | |   o- luns ........................................................................................... [LUNs: 1]
    | |   | o- lun0 .............................................. [fileio/sbddbnw1 (/sbd/sbddbnw1) (default_tg_pt_gp)]
    | |   o- portals ..................................................................................... [Portals: 1]
    | |     o- 0.0.0.0:3260 ...................................................................................... [OK]
    | o- iqn.2006-04.nfs.local:nfs .......................................................................... [TPGs: 1]
    |   o- tpg1 ................................................................................ [no-gen-acls, no-auth]
    |     o- acls ........................................................................................... [ACLs: 2]
    |     | o- iqn.2006-04.nfs-0.local:nfs-0 ......................................................... [Mapped LUNs: 1]
    |     | | o- mapped_lun0 ................................................................ [lun0 fileio/sbdnfs (rw)]
    |     | o- iqn.2006-04.nfs-1.local:nfs-1 ......................................................... [Mapped LUNs: 1]
    |     |   o- mapped_lun0 ................................................................ [lun0 fileio/sbdnfs (rw)]
    |     o- luns ........................................................................................... [LUNs: 1]
    |     | o- lun0 .................................................. [fileio/sbdnfs (/sbd/sbdnfs) (default_tg_pt_gp)]
    |     o- portals ..................................................................................... [Portals: 1]
    |       o- 0.0.0.0:3260 ...................................................................................... [OK]
    o- loopback .......................................................................................... [Targets: 0]
    o- vhost ............................................................................................. [Targets: 0]
    o- xen-pvscsi ........................................................................................ [Targets: 0]
    

设置 iSCSI 目标服务器 SBD 设备

从群集连接到在最后一步中创建的 iSCSI 设备。 在要创建的新群集的节点上运行以下命令。

注意

  • [A]:适用于所有节点。
  • [1]:仅适用于节点 1。
  • [2]:仅适用于节点 2。
  1. [A] 安装 iSCSI 包。

    sudo zypper install open-iscsi
    
  2. [A] 连接到 iSCSI 设备。 首先,启用 iSCSI 和 SBD 服务。

    sudo systemctl enable iscsid
    sudo systemctl enable iscsi
    sudo systemctl enable sbd
    
  3. [1] 在第一个节点上更改发起程序名称。

    sudo vi /etc/iscsi/initiatorname.iscsi
    
  4. [1] 更改此文件的内容,以匹配在 iSCSI 目标服务器上创建 iSCSI 设备时使用的访问控制列表 (ACL)(例如,NFS 服务器的 ACL)。

    InitiatorName=iqn.2006-04.nfs-0.local:nfs-0
    
  5. [2] 在第二个节点上更改发起程序名称。

    sudo vi /etc/iscsi/initiatorname.iscsi
    
  6. [2] 更改此文件的内容,以匹配在 iSCSI 目标服务器上创建 iSCSI 设备时使用的 ACL。

    InitiatorName=iqn.2006-04.nfs-1.local:nfs-1
    
  7. [A] 重新启动 iSCSI 服务以应用更改。

    sudo systemctl restart iscsid
    sudo systemctl restart iscsi
    
  8. [A] 连接 iSCSI 设备。 在下面的示例中,10.0.0.17 是 iSCSI 目标服务器的 IP 地址,3260 是默认端口。 iscsiadm -m discoveryiqn.2006 04.nfs.local:nfs 是运行第一个命令 时列出的目标名称之一。

    sudo iscsiadm -m discovery --type=st --portal=10.0.0.17:3260   
    sudo iscsiadm -m node -T iqn.2006-04.nfs.local:nfs --login --portal=10.0.0.17:3260
    sudo iscsiadm -m node -p 10.0.0.17:3260 -T iqn.2006-04.nfs.local:nfs --op=update --name=node.startup --value=automatic
    
  9. [A] 如果要使用多个 SBD 设备,请同时连接到第二个 iSCSI 目标服务器。

    sudo iscsiadm -m discovery --type=st --portal=10.0.0.18:3260   
    sudo iscsiadm -m node -T iqn.2006-04.nfs.local:nfs --login --portal=10.0.0.18:3260
    sudo iscsiadm -m node -p 10.0.0.18:3260 -T iqn.2006-04.nfs.local:nfs --op=update --name=node.startup --value=automatic
    
  10. [A] 如果要使用多个 SBD 设备,请同时连接到第三个 iSCSI 目标服务器。

    sudo iscsiadm -m discovery --type=st --portal=10.0.0.19:3260   
    sudo iscsiadm -m node -T iqn.2006-04.nfs.local:nfs --login --portal=10.0.0.19:3260
    sudo iscsiadm -m node -p 10.0.0.19:3260 -T iqn.2006-04.nfs.local:nfs --op=update --name=node.startup --value=automatic
    
  11. [A] 请确保 iSCSI 设备可用并记下设备名称(在以下示例中为 /dev/sde)。

    lsscsi
    
    # [2:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sda
    # [3:0:1:0]    disk    Msft     Virtual Disk     1.0   /dev/sdb
    # [5:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sdc
    # [5:0:0:1]    disk    Msft     Virtual Disk     1.0   /dev/sdd
    # [6:0:0:0]    disk    LIO-ORG  sbdnfs           4.0   /dev/sdd
    # [7:0:0:0]    disk    LIO-ORG  sbdnfs           4.0   /dev/sde
    # [8:0:0:0]    disk    LIO-ORG  sbdnfs           4.0   /dev/sdf
    
  12. [A] 检索 iSCSI 设备的 ID。

    ls -l /dev/disk/by-id/scsi-* | grep sdd
    
    # lrwxrwxrwx 1 root root  9 Aug  9 13:20 /dev/disk/by-id/scsi-1LIO-ORG_sbdnfs:afb0ba8d-3a3c-413b-8cc2-cca03e63ef42 -> ../../sdd
    # lrwxrwxrwx 1 root root  9 Aug  9 13:20 /dev/disk/by-id/scsi-36001405afb0ba8d3a3c413b8cc2cca03 -> ../../sdd
    # lrwxrwxrwx 1 root root  9 Aug  9 13:20 /dev/disk/by-id/scsi-SLIO-ORG_sbdnfs_afb0ba8d-3a3c-413b-8cc2-cca03e63ef42 -> ../../sdd
    
    ls -l /dev/disk/by-id/scsi-* | grep sde
    
    # lrwxrwxrwx 1 root root  9 Feb  7 12:39 /dev/disk/by-id/scsi-1LIO-ORG_cl1:3fe4da37-1a5a-4bb6-9a41-9a4df57770e4 -> ../../sde
    # lrwxrwxrwx 1 root root  9 Feb  7 12:39 /dev/disk/by-id/scsi-360014053fe4da371a5a4bb69a419a4df -> ../../sde
    # lrwxrwxrwx 1 root root  9 Feb  7 12:39 /dev/disk/by-id/scsi-SLIO-ORG_cl1_3fe4da37-1a5a-4bb6-9a41-9a4df57770e4 -> ../../sde
    
    ls -l /dev/disk/by-id/scsi-* | grep sdf
    
    # lrwxrwxrwx 1 root root  9 Aug  9 13:32 /dev/disk/by-id/scsi-1LIO-ORG_sbdnfs:f88f30e7-c968-4678-bc87-fe7bfcbdb625 -> ../../sdf
    # lrwxrwxrwx 1 root root  9 Aug  9 13:32 /dev/disk/by-id/scsi-36001405f88f30e7c9684678bc87fe7bf -> ../../sdf
    # lrwxrwxrwx 1 root root  9 Aug  9 13:32 /dev/disk/by-id/scsi-SLIO-ORG_sbdnfs_f88f30e7-c968-4678-bc87-fe7bfcbdb625 -> ../../sdf
    

    此命令会列出每个 SBD 设备的三个设备 ID。 建议使用以 scsi-3 开头的 ID。 在前面的示例中,这些 ID 为:

    • /dev/disk/by-id/scsi-36001405afb0ba8d3a3c413b8cc2cca03
    • /dev/disk/by-id/scsi-360014053fe4da371a5a4bb69a419a4df
    • /dev/disk/by-id/scsi-36001405f88f30e7c9684678bc87fe7bf
  13. [1] 创建 SBD 设备。

    a. 使用 iSCSI 设备的设备 ID 在第一个群集节点上创建新的 SBD 设备。

    sudo sbd -d /dev/disk/by-id/scsi-36001405afb0ba8d3a3c413b8cc2cca03 -1 60 -4 120 create
    

    b. 如果要使用多个 SBD 设备,请创建第二个和第三个 SBD 设备。

    sudo sbd -d /dev/disk/by-id/scsi-360014053fe4da371a5a4bb69a419a4df -1 60 -4 120 create
    sudo sbd -d /dev/disk/by-id/scsi-36001405f88f30e7c9684678bc87fe7bf -1 60 -4 120 create
    
  14. [A] 调整 SBD 配置。

    a. 打开 SBD 配置文件。

    sudo vi /etc/sysconfig/sbd
    

    b. 更改 SBD 设备的属性,启用 Pacemaker 集成,并更改 SBD 的启动模式。

    [...]
    SBD_DEVICE="/dev/disk/by-id/scsi-36001405afb0ba8d3a3c413b8cc2cca03;/dev/disk/by-id/scsi-360014053fe4da371a5a4bb69a419a4df;/dev/disk/by-id/scsi-36001405f88f30e7c9684678bc87fe7bf"
    [...]
    SBD_PACEMAKER="yes"
    [...]
    SBD_STARTMODE="always"
    [...]
    

    注意

    如果 SBD_DELAY_START 属性值设置为“no”,请将值更改为“yes”。 还必须检查 SBD 服务文件,以确保 TimeoutStartSec 的值大于 SBD_DELAY_START 的值。 有关详细信息,请参阅 SBD 文件配置

  15. [A] 创建 softdog 配置文件。

    echo softdog | sudo tee /etc/modules-load.d/softdog.conf
    
  16. [A] 加载模块。

    sudo modprobe -v softdog
    

具有 Azure 共享磁盘的 SBD

本部分仅适用于要使用具有 Azure 共享磁盘的 SBD 设备的情况。

使用 PowerShell 创建并附加 Azure 共享磁盘

  1. 调整资源组、Azure 区域、虚拟机和逻辑单元号 (LUN) 等内容的值。

    $ResourceGroup = "MyResourceGroup"
    $Location = "MyAzureRegion"
    
  2. 根据高级 SSD 可用磁盘大小定义磁盘的大小。 本示例提到的 P1 磁盘大小为 4G。

    $DiskSizeInGB = 4
    $DiskName = "SBD-disk1"
    
  3. 使用参数 -MaxSharesCount,定义要为 SBD 设备附加共享磁盘的最大群集节点数。

    $ShareNodes = 2
    
  4. 对于将 LRS 用于 Azure 高级共享磁盘的 SBD 设备,请使用以下存储 SkuName:

    $SkuName = "Premium_LRS"
    
  5. 对于将 ZRS 用于 Azure 高级共享磁盘的 SBD 设备,请使用以下存储 SkuName:

    $SkuName = "Premium_ZRS"
    
  6. 设置 Azure 共享磁盘。

    $diskConfig = New-AzDiskConfig -Location $Location -SkuName $SkuName -CreateOption Empty -DiskSizeGB $DiskSizeInGB -MaxSharesCount $ShareNodes
    $dataDisk = New-AzDisk -ResourceGroupName $ResourceGroup -DiskName $DiskName -Disk $diskConfig
    
  7. 将磁盘附加到群集 VM。

    $VM1 = "prod-cl1-0"
    $VM2 = "prod-cl1-1"
    

    a. 将 Azure 共享磁盘添加到群集节点 1。

    $vm = Get-AzVM -ResourceGroupName $ResourceGroup -Name $VM1
    $vm = Add-AzVMDataDisk -VM $vm -Name $DiskName -CreateOption Attach -ManagedDiskId $dataDisk.Id -Lun 0
    Update-AzVm -VM $vm -ResourceGroupName $ResourceGroup -Verbose
    

    b. 将 Azure 共享磁盘添加到群集节点 2。

    $vm = Get-AzVM -ResourceGroupName $ResourceGroup -Name $VM2
    $vm = Add-AzVMDataDisk -VM $vm -Name $DiskName -CreateOption Attach -ManagedDiskId $dataDisk.Id -Lun 0
    Update-AzVm -VM $vm -ResourceGroupName $ResourceGroup -Verbose
    

如果要使用 Azure CLI 或 Azure 门户部署资源,也可参阅部署 ZRS 磁盘

设置 Azure 共享磁盘 SBD 设备

  1. [A] 启用 SBD 服务。

    sudo systemctl enable sbd
    
  2. [A] 确保附加的磁盘可用。

    # lsblk
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    fd0      2:0    1    4K  0 disk
    sda      8:0    0   30G  0 disk
    ├─sda1   8:1    0    2M  0 part
    ├─sda2   8:2    0  512M  0 part /boot/efi
    ├─sda3   8:3    0    1G  0 part /boot
    ├─sda4   8:4    0 28.5G  0 part /
    sdb      8:16   0  256G  0 disk
    ├─sdb1   8:17   0  256G  0 part /mnt
    sdc      8:32   0    4G  0 disk
    sr0     11:0    1 1024M  0 rom
    
    # lsscsi
    [1:0:0:0]    cd/dvd  Msft     Virtual CD/ROM   1.0   /dev/sr0
    [2:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sda
    [3:0:1:0]    disk    Msft     Virtual Disk     1.0   /dev/sdb
    [5:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sdc
    
  3. [A] 检索附加磁盘的 ID。

    # ls -l /dev/disk/by-id/scsi-* | grep sdc
    lrwxrwxrwx 1 root root  9 Nov  8 16:55 /dev/disk/by-id/scsi-14d534654202020204208a67da80744439b513b2a9728af19 -> ../../sdc
    lrwxrwxrwx 1 root root  9 Nov  8 16:55 /dev/disk/by-id/scsi-3600224804208a67da8073b2a9728af19 -> ../../sdc
    

    这些命令列出 SBD 设备的设备 ID。 建议使用以 scsi-3 开头的 ID。 在上面的示例中,ID 为 /dev/disk/by-id/scsi-3600224804208a67da8073b2a9728af19。

  4. [1] 创建 SBD 设备。

    使用步骤 2 中的设备 ID 在第一个群集节点上创建新的 SBD 设备。

    # sudo sbd -d /dev/disk/by-id/scsi-3600224804208a67da8073b2a9728af19 -1 60 -4 120 create
    
  5. [A] 调整 SBD 配置。

    a. 打开 SBD 配置文件。

    sudo vi /etc/sysconfig/sbd
    

    b. 更改 SBD 设备的属性,启用 Pacemaker 集成,并更改 SBD 设备的启动模式。

    [...]
    SBD_DEVICE="/dev/disk/by-id/scsi-3600224804208a67da8073b2a9728af19"
    [...]
    SBD_PACEMAKER="yes"
    [...]
    SBD_STARTMODE="always"
    [...]
    

    注意

    如果 SBD_DELAY_START 属性值设置为“no”,请将值更改为“yes”。 还必须检查 SBD 服务文件,以确保 TimeoutStartSec 的值大于 SBD_DELAY_START 的值。 有关详细信息,请参阅 SBD 文件配置

  6. 创建 softdog 配置文件。

    echo softdog | sudo tee /etc/modules-load.d/softdog.conf
    
  7. 加载模块。

    sudo modprobe -v softdog
    

使用 Azure 隔离代理

本部分仅适用于要使用具有 Azure 隔离代理的隔离设备的情况。

创建 Azure 隔离代理设备

本部分仅适用于要使用基于 Azure 隔离代理的隔离设备的情况。 隔离设备使用托管标识或服务主体对 Microsoft Azure 授权。

若要创建托管标识 (MSI),请为群集中的每个 VM 创建系统分配的托管标识。 如果已存在系统分配的托管标识,将使用该标识。 目前,用户分配的托管标识不应与 Pacemaker 一起使用。 SLES 12 SP5 和 SLES 15 SP1 及更高版本支持基于托管标识的 Azure 隔离代理。

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

默认情况下,托管标识和服务主体均无权访问 Azure 资源。 需要为托管标识或服务主体授予启动和停止(解除分配)群集中所有虚拟机的权限。 如果尚未创建自定义角色,可以使用 PowerShellAzure CLI 来创建它。

将以下内容用于输入文件。 需要根据订阅调整内容。 即,将 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 和 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 隔离代理角色”分配给群集 VM 的每个托管标识。 每个 VM 系统分配的托管标识都需要为每个群集 VM 资源分配的角色。 有关详细步骤,请参阅使用 Azure 门户为托管标识分配对资源的访问权限。 验证每个 VM 的托管标识角色分配是否包含所有群集 VM。

重要

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

安装群集

注意

  • [A]:适用于所有节点。
  • [1]:仅适用于节点 1。
  • [2]:仅适用于节点 2。
  1. [A] 更新 SLES。

    sudo zypper update
    

    注意

    对于 SLES 15 SP4,请验证 crmshpacemaker 包的版本,以确保它们满足最低版本要求:

    • crmsh-4.4.0+20221028.3e41444-150400.3.9.1 或更高版本
    • pacemaker-2.1.2+20211124.ada5c3b36-150400.4.6.1 或更高版本

    重要

    • SLES 12 SP5:如果安装了 python-azure-core-1.23.1-2.12.8,Azure 围栏代理可能无法在 Pacemaker 群集中启动,并会显示错误消息“找不到或无法访问 Azure 资源管理器 Python SDK”/var/log/messages。 有关更多详细信息,请按照 SUSE KBA 21532 中的说明操作。
    • SLES 15 SP4+:更新 OS 后,用于 Python 的 Azure 库可能会使用 Python 3.11 解释器,导致 Azure 围栏代理无法在 Pacemaker 群集中启动。 错误消息“找不到或无法访问的 Azure 资源管理器 Python SDK”将显示在 /var/log/messages 中。 有关更多详细信息,请按照 SUSE KBA 21504 中的说明进行操作。
  2. [A] 安装群集资源所需的组件。

    sudo zypper in socat
    
  3. [A] 安装群集资源所需的 azure-lb 组件。

    sudo zypper in resource-agents
    

    注意

    检查 resource-agents 包的版本,并确保满足最低版本要求:

    • SLES 12 SP4/SP5:版本必须为 resource-agents-4.3.018.a7fb5035-3.30.1 或更高版本。
    • SLES 15/15 SP1:版本必须为 resource-agents-4.3.0184.6ee15eb2-4.13.1 或更高版本。
  4. [A] 配置操作系统。

    a. Pacemaker 偶尔会创建许多进程,这些进程可能会耗尽允许的进程数。 如果发生这种情况,群集节点之间的检测信号可能失败,并导致资源故障转移。 建议通过设置以下参数来增大允许的进程数上限:

    # Edit the configuration file
    sudo vi /etc/systemd/system.conf
    
    # Change the DefaultTasksMax
    #DefaultTasksMax=512
    DefaultTasksMax=4096
    
    # Activate this setting
    sudo systemctl daemon-reload
    
    # Test to ensure that the change was successful
    sudo systemctl --no-pager show | grep DefaultTasksMax
    

    b. 减小脏缓存的大小。 有关详细信息,请参阅 RAM 较大的 SLES 11/12 服务器的写入性能低

    sudo vi /etc/sysctl.conf
    # Change/set the following settings
    vm.dirty_bytes = 629145600
    vm.dirty_background_bytes = 314572800
    

    c. 确保 vm.swappiness 设置为 10,以减少交换使用量并有利于内存。

    sudo vi /etc/sysctl.conf
    # Change/set the following setting
    vm.swappiness = 10
    
  5. [A] 检查 cloud-netconfig-azure 包版本。

    通过运行 zypper info cloud-netconfig-azure,检查安装的 cloud-netconfig-azure 包的版本。 如果版本低于 1.3,则建议将 cloud-netconfig-azure 包更新为最新的可用版本。

    提示

    如果环境中的版本为 1.3 或更高版本,则不再需要通过云网络插件来禁止管理网络接口。

    仅当 cloud-netconfig-azure 的版本低于 1.3 时,按以下代码中所示更改网络接口的配置文件,以防止云网络插件删除虚拟 IP 地址(Pacemaker 必须控制分配)。 有关详细信息,请参阅 SUSE KB 7023633

    # Edit the configuration file
    sudo vi /etc/sysconfig/network/ifcfg-eth0 
    
    # Change CLOUD_NETCONFIG_MANAGE
    # CLOUD_NETCONFIG_MANAGE="yes"
    CLOUD_NETCONFIG_MANAGE="no"
    
  6. [1] 启用 SSH 访问。

    sudo ssh-keygen
    
    # Enter file in which to save the key (/root/.ssh/id_rsa), and then select Enter
    # Enter passphrase (empty for no passphrase), and then select Enter
    # Enter same passphrase again, and then select Enter
    
    # copy the public key
    sudo cat /root/.ssh/id_rsa.pub
    
  7. [2] 启用 SSH 访问。

    sudo ssh-keygen
    
    # Enter file in which to save the key (/root/.ssh/id_rsa), and then select Enter
    # Enter passphrase (empty for no passphrase), and then select Enter
    # Enter same passphrase again, and then select Enter
    
    # Insert the public key you copied in the last step into the authorized keys file on the second server
    sudo vi /root/.ssh/authorized_keys   
    
    # copy the public key
    sudo cat /root/.ssh/id_rsa.pub
    
  8. [1] 启用 SSH 访问。

    # insert the public key you copied in the last step into the authorized keys file on the first server
    sudo vi /root/.ssh/authorized_keys
    
  9. [A] 如果使用隔离设备,则基于 Azure 隔离代理安装 fence-agents 包。

    sudo zypper install fence-agents
    

    重要

    安装的 fence-agents 包版本必须为 4.4.0 或更高版本,以便在群集节点隔离时,使用 Azure 隔离代理更快地进行故障转移。 如果运行的是较低版本的包,建议更新。

    重要

    如果使用托管标识,则隔离代理包的已安装版本必须为

    • SLES 12 SP5: fence-agents 4.9.0+git.1624456340.8d746be9-3.35.2 或更高版本
    • SLES 15 SP1 及更高版本:fence-agents 4.5.2+git.1592573838.1eee0863 或更高版本。

    早期版本将无法正确使用托管标识配置。

  10. [A] 安装 fence-agents-azure-arm 包。

    对于 SLES 12 SP5,如果使用的是 fence-agents 版本 4.9.0+git.1624456340.8d746be9-3.41.3 或更高版本,并且对于 SLES 15 SP4 及更高版本,则需要安装 fence-agents-azure-arm 包。 此包将包含所有必需的依赖项。

    # On SLES 12 SP5 with fence-agents version 4.9.0+git.1624456340.8d746be9-3.41.3 or higher. You might need to activate the public cloud extension first
    SUSEConnect -p sle-module-public-cloud/12/x86_64
    sudo zypper install fence-agents-azure-arm
    
    # On SLES 15 SP4 and later. You might need to activate the public cloud extension first. In this example, the SUSEConnect 
    SUSEConnect -p sle-module-public-cloud/15.4/x86_64
    sudo zypper install fence-agents-azure-arm
    
  11. [A] 安装 Azure Python SDK 和 Azure Identity python 模块。

    对于 SLES 12 SP5,如果 fence-agents 版本较低 4.9.0+git.1624456340.8d746be9-3.41.3,并且对于 SLES 15 SP3 及更低版本,则需要安装以下其他包。

    # You might need to activate the public cloud extension first
    SUSEConnect -p sle-module-public-cloud/12/x86_64
    sudo zypper install python-azure-mgmt-compute
    sudo zypper install python-azure-identity
    
    # You might need to activate the public cloud extension first. In this example, the SUSEConnect command is for SLES 15 SP1
    SUSEConnect -p sle-module-public-cloud/15.1/x86_64
    sudo zypper install python3-azure-mgmt-compute
    sudo zypper install python3-azure-identity
    

    重要

    根据你的版本和映像类型,可能需要在安装 Azure Python SDK 之前激活 OS 版本的公有云扩展。 可以通过运行 SUSEConnect ---list-extensions 来检查扩展。 若要加快使用 Azure 隔离代理进行故障转移:

    • 在 SLES 12 SP5 上,安装版本 4.6.2 或更高版本的 python-azure-mgmt-compute 包。
    • 如果 python-azure-mgmt-compute 或 python3-azure-mgmt-compute 包版本为 17.0.0-6.7.1,请按照 SUSE KBA 中的说明更新 fence-agents 版本并安装适用于 Python 模块的 Azure 标识客户端库(如果缺少它)。
  12. [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
    
  13. [1] 安装群集。

    • 如果使用 SBD 设备(iSCSI 目标服务器或 Azure 共享磁盘)进行隔离:

      sudo crm cluster init
      # ! NTP is not configured to start at system boot.
      # Do you want to continue anyway (y/n)? y
      # /root/.ssh/id_rsa already exists - overwrite (y/n)? n
      # Address for ring0 [10.0.0.6] Select Enter
      # Port for ring0 [5405] Select Enter
      # SBD is already configured to use /dev/disk/by-id/scsi-36001405639245768818458b930abdf69;/dev/disk/by-id/scsi-36001405afb0ba8d3a3c413b8cc2cca03;/dev/disk/by-id/scsi-36001405f88f30e7c9684678bc87fe7bf - overwrite (y/n)? n
      # Do you wish to configure an administration IP (y/n)? n
      
    • 如果不使用 SBD 设备进行隔离:

      sudo crm cluster init
      # ! NTP is not configured to start at system boot.
      # Do you want to continue anyway (y/n)? y
      # /root/.ssh/id_rsa already exists - overwrite (y/n)? n
      # Address for ring0 [10.0.0.6] Select Enter
      # Port for ring0 [5405] Select Enter
      # Do you wish to use SBD (y/n)? n
      # WARNING: Not configuring SBD - STONITH will be disabled.
      # Do you wish to configure an administration IP (y/n)? n
      
  14. [2] 将节点添加到群集。

    sudo crm cluster join
    # ! NTP is not configured to start at system boot.
    # Do you want to continue anyway (y/n)? y
    # IP address or hostname of existing node (for example, 192.168.1.1) []10.0.0.6
    # /root/.ssh/id_rsa already exists - overwrite (y/n)? n
    
  15. [A] 将 hacluster 密码更改为相同的密码。

    sudo passwd hacluster
    
  16. [A] 调整 corosync 设置。

    sudo vi /etc/corosync/corosync.conf
    

    a. 检查文件中的以下部分,如果值不存在或不同,请进行调整。 请务必将令牌更改为 30000,以允许内存保留维护。 有关详细信息,请参阅适用于 LinuxWindows 的“Azure 中虚拟机的维护”一文。

    [...]
      token:          30000
      token_retransmits_before_loss_const: 10
      join:           60
      consensus:      36000
      max_messages:   20
    
      interface { 
         [...] 
      }
      transport:      udpu
    } 
    nodelist {
      node {
       ring0_addr:10.0.0.6
      }
      node {
       ring0_addr:10.0.0.7
      } 
    }
    logging {
      [...]
    }
    quorum {
         # Enable and configure quorum subsystem (default: off)
         # See also corosync.conf.5 and votequorum.5
         provider: corosync_votequorum
         expected_votes: 2
         two_node: 1
    }
    

    b. 重启 corosync 服务。

    sudo service corosync restart
    

在 Pacemaker 群集上创建隔离设备

提示

  • 若要避免双节点 pacemaker 群集内的隔离争用,可以额外配置“priority-fencing-delay”群集属性。 当发生分脑方案时,此属性会在隔离具有较高总资源优先级的节点时引入额外的延迟。 有关详细信息,请参阅 SUSE Linux Enterprise Server 高可用性扩展管理指南
  • 可以在相应的 SAP ASCS/ERS(仅适用于 ENSA2)和 SAP HANA 纵向扩展高可用性文档中找到有关设置“priority-fencing-delay”群集属性的说明。
  1. [1] 如果使用 SBD 设备(iSCSI 目标服务器或 Azure 共享磁盘)作为隔离设备,请运行以下命令。 允许使用隔离设备并设置隔离延迟。

    sudo crm configure property stonith-timeout=144
    sudo crm configure property stonith-enabled=true
    
    # List the resources to find the name of the SBD device
    sudo crm resource list
    sudo crm resource stop stonith-sbd
    sudo crm configure delete stonith-sbd
    sudo crm configure primitive stonith-sbd stonith:external/sbd \
       params pcmk_delay_max="15" \
       op monitor interval="600" timeout="15"
    
  2. [1] 如果使用 Azure 隔离代理作为隔离,请运行以下命令。 将角色分配给两个群集节点后,可配置群集中的隔离设备。

    sudo crm configure property stonith-enabled=true
    sudo crm configure property concurrent-fencing=true
    

    注意

    仅在主机名和 Azure VM 名称不相同的情况下,命令中才需要“pcmk_host_map”选项。 以 hostname:vm-name 格式指定映射。

# Adjust the command with your subscription ID and resource group of the VM

sudo crm configure primitive rsc_st_azure stonith:fence_azure_arm \
params msi=true subscriptionId="subscription ID" resourceGroup="resource group" \
pcmk_monitor_retries=4 pcmk_action_limit=3 power_timeout=240 pcmk_reboot_timeout=900 pcmk_delay_max=15 pcmk_host_map="prod-cl1-0:prod-cl1-0-vm-name;prod-cl1-1:prod-cl1-1-vm-name" \
op monitor interval=3600 timeout=120

sudo crm configure property stonith-timeout=900

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

重要

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

提示

Azure 隔离代理要求与使用标准 ILB 的 VM 的公共终结点连接中所述的公共终结点建立出站连接并提供可能的解决方案。

为 Azure 计划事件配置 Pacemaker

Azure 提供计划事件。 计划事件通过元数据服务提供,并可为应用程序留出时间为此类事件做准备。 资源代理 azure-events 可监视计划的 Azure 事件。 如果检测到事件并且资源代理确定有另一个群集节点可用,则会设置群集运行状况属性。 为节点设置群集运行状况属性后,会触发位置约束,并且所有名称不以“health-”开头的资源将从具有计划事件的节点迁移。 一旦受影响的群集节点没有正在运行的群集资源,计划事件就会得到确认,并且可以执行其操作(例如重启)。

重要

本文档先前介绍了如何使用资源代理 azure-events。 新的资源代理 azure-events-az 完全支持在不同可用性区域中部署的 Azure 环境。 建议所有使用 Pacemaker 的 SAP 高度可用系统使用较新的 azure-events-az 代理。

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

    sudo zypper info resource-agents
    

    最低版本要求:

    • SLES 12 SP5:resource-agents-4.3.018.a7fb5035-3.98.1
    • SLES 15 SP1:resource-agents-4.3.0184.6ee15eb2-150100.4.72.1
    • SLES 15 SP2:resource-agents-4.4.0+git57.70549516-150200.3.56.1
    • SLES 15 SP3:resource-agents-4.8.0+git30.d0077df0-150300.8.31.1
    • SLES 15 SP4 及更新版本:resource-agents-4.10.0+git40.0f4de473-150400.3.19.1
  2. [1] 配置 Pacemaker 中的资源。

    #Place the cluster in maintenance mode
    sudo crm configure property maintenance-mode=true
    
  3. [1] 设置 pacemaker 群集运行状况节点策略和约束

    sudo crm configure property node-health-strategy=custom
    sudo crm configure location loc_azure_health \
    /'!health-.*'/ rule '#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 crm configure primitive health-azure-events ocf:heartbeat:azure-events-az \
    meta allow-unhealthy-nodes=true failure-timeout=120s \
    op start start-delay=60s \
    op monitor interval=10s
    
    sudo crm configure clone health-azure-events-cln health-azure-events
    

    注意

    在配置“health-azure-events”资源时,可以无视以下警告消息。

    警告:health-azure-events:未知属性“allow-unhealthy-nodes”。

  6. 使 Pacemaker 群集退出维护模式

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

    sudo crm resource cleanup
    

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

    注意

    为 azure-events 代理配置 Pacemaker 资源后,将群集置于维护模式或退出维护模式时,可能会收到以下警告消息:

    警告:cib-bootstrap-options:未知属性“hostName_hostname”
    警告: cib-bootstrap-options: 未知属性 "azure-events_globalPullState"
    警告: cib-bootstrap-options: 未知属性 "hostName_ hostname"
    可以忽略这些警告消息。

后续步骤