启动与虚拟机故障

排查 RHEL Pacemaker 群集中的 SBD 服务故障 - Virtual Machines

· 52CE 我爱测

适用于:✔️ Linux VM 总结 本文概述了 STONITH 块设备(SBD)服务无法在 Red Hat Enterprise Server (RHEL) Pacemaker 群集中启动的常见方案,并提供识别和解决此问题的指导。 SBD 的工作原理 SBD 设备至少需要一台虚拟机(VM),该虚拟机充当 Internet Small Computer System Interface (iSCSI) 目标服务器并提供 SBD 设备。 这些 iSCSI 目

适用于:✔️ Linux VM

总结

本文概述了 STONITH 块设备(SBD)服务无法在 Red Hat Enterprise Server (RHEL) Pacemaker 群集中启动的常见方案,并提供识别和解决此问题的指导。

SBD 的工作原理

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

若要使用 SBD 隔离机制设置 Azure Pacemaker 群集,请使用以下两个选项之一:

现象

在群集节点上无法访问 SBD 设备时,SBD 守护程序无法启动并阻止 Pacemaker 群集启动。

若要获取 SBD 服务器详细信息,请使用群集节点上的以下方法:

  • 检查 /var/log/messages* 文件中的*日志。
  • 检查iscsiadm discovery命令输出。
  • 检查指示 SBD 服务器 IP 地址的 iSCSI 服务的状态。

方案 1:由于 iSCSI 服务故障,SBD 服务无法启动

iSCSI 服务使用 iSCSI 限定名称(IQN)在发起方和目标节点之间进行通信。 如果 iSCSI 服务失败,SBD 磁盘将无法访问。 在这种情况下,SBD 服务无法启动,Pacemaker 服务不会在群集节点上运行。

以下示例演示如何诊断 SBD 和 Pacemaker 服务故障:

  1. 查看 Pacemaker 集群的状态:

    sudo pcs status
    

    如果 Pacemaker 群集未运行,你将看到类似于以下文本的命令输出:

    Error: error running crm_mon, is pacemaker running?
      error: Could not connect to launcher: Connection refused
      crm_mon: Connection to cluster failed: Connection refused
    
  2. 检查 Corosync 服务的状态:

    sudo systemctl status corosync
    

    如果 Corosync 服务正在运行,你将看到类似于以下文本的命令输出:

    ● corosync.service - Corosync Cluster Engine
         Loaded: loaded (/usr/lib/systemd/system/corosync.service; enabled; preset: disabled)
         Active: active (running) since Thu 2024-08-01 11:22:28 UTC; 1min 22s ago
           Docs: man:corosync
                 man:corosync.conf
                 man:corosync_overview
       Main PID: 12793 (corosync)
          Tasks: 9 (limit: 48956)
         Memory: 113.9M
            CPU: 401ms
         CGroup: /system.slice/corosync.service
                 └─12793 /usr/sbin/corosync -f
    
    Aug 01 11:22:43 node1 corosync[12793]:   [KNET  ] link: Resetting MTU for link 0 because host 2 joined
    Aug 01 11:22:43 node1 corosync[12793]:   [KNET  ] host: host: 2 (passive) best link: 0 (pri: 1)
    Aug 01 11:22:43 node1 corosync[12793]:   [KNET  ] pmtud: PMTUD link change for host: 2 link: 0 from 469 to 1397
    Aug 01 11:22:43 node1 corosync[12793]:   [KNET  ] pmtud: Global data MTU changed to: 1397
    Aug 01 11:22:45 node1 corosync[12793]:   [QUORUM] Sync members[2]: 1 2
    Aug 01 11:22:45 node1 corosync[12793]:   [QUORUM] Sync joined[1]: 2
    Aug 01 11:22:45 node1 corosync[12793]:   [TOTEM ] A new membership (1.3e) was formed. Members joined: 2
    Aug 01 11:22:45 node1 corosync[12793]:   [QUORUM] This node is within the primary component and will provide service.
    Aug 01 11:22:45 node1 corosync[12793]:   [QUORUM] Members[2]: 1 2
    Aug 01 11:22:45 node1 corosync[12793]:   [MAIN  ] Completed service synchronization, ready to provide service.
    
  3. 检查 Pacemaker 服务的状态:

    sudo systemctl status pacemaker
    

    需要 SBD 服务才能启动 Pacemaker 服务。 如果 Pacemaker 服务由于依赖项失败而无法启动,你将看到类似于以下文本的命令输出:

    ○ pacemaker.service - Pacemaker High Availability Cluster Manager
         Loaded: loaded (/usr/lib/systemd/system/pacemaker.service; enabled; preset: disabled)
         Active: inactive (dead) since Thu 2024-08-01 11:22:22 UTC; 2min 9s ago
           Docs: man:pacemakerd
    https://clusterlabs.org/pacemaker/doc/
    Aug 01 11:24:28 node1 systemd[1]: Dependency failed for Pacemaker High Availability Cluster Manager.
    Aug 01 11:24:28 node1 systemd[1]: pacemaker.service: Job pacemaker.service/start failed with result 'dependency'.
    
  4. 列出 Pacemaker 服务的依赖项服务树:

    sudo systemctl list-dependencies pacemaker
    

    如果 Pacemaker 服务没有 SBD 服务作为依赖项,你将看到类似于以下文本的命令输出:

    pacemaker.service
    ● ├─corosync.service
    ● ├─dbus-broker.service
    × ├─sbd.service
    ● ├─system.slice
    ● ├─resource-agents-deps.target
    ● └─sysinit.target
    
  5. 检查 SBD 服务的状态:

    sudo systemctl status sbd
    

    如果 SBD 服务无法运行,你将看到类似于以下文本的命令输出:

    × sbd.service - Shared-storage based fencing daemon
         Loaded: loaded (/usr/lib/systemd/system/sbd.service; enabled; preset: disabled)
        Drop-In: /etc/systemd/system/sbd.service.d
                 └─sbd_delay_start.conf
         Active: failed (Result: exit-code) since Thu 2024-08-01 11:24:28 UTC; 1min 56s ago
       Duration: 55min 34.369s
           Docs: man:sbd(8)
        Process: 12794 ExecStart=/usr/sbin/sbd $SBD_OPTS -p /run/sbd.pid watch (code=exited, status=1/FAILURE)
            CPU: 46ms
    
    Aug 01 11:22:27 node1 systemd[1]: Starting Shared-storage based fencing daemon...
    Aug 01 11:22:27 node1 sbd[12794]:  warning: open_any_device: Failed to open /dev/disk/by-id/scsi-360014056eadbecfeca042d4a66b9d779. Trying any other config>
    Aug 01 11:24:28 node1 sbd[12794]:    error: open_any_device: No devices were available at start-up within 120 seconds.
    Aug 01 11:24:28 node1 systemd[1]: sbd.service: Control process exited, code=exited, status=1/FAILURE
    Aug 01 11:24:28 node1 systemd[1]: sbd.service: Failed with result 'exit-code'.
    Aug 01 11:24:28 node1 systemd[1]: Failed to start Shared-storage based fencing daemon.
    

解决方法:确保启用并运行 iscsid 和 iscsi 服务

若要解决此问题,请执行以下步骤:

  1. 确保按照 RHEL - 在 Azure 中的 Red Hat Enterprise Linux 上设置 Pacemaker 的描述设置正确的配置

  2. 启用iscsid和iscsi服务:

    sudo systemctl enable iscsi
    
    sudo systemctl enable iscsid
    
  3. 验证iscsid和iscsi服务的状态。

    sudo systemctl status iscsi 
    
    sudo systemctl status iscsid
    

    如果已启用并运行服务,你将看到类似于以下文本的命令输出:

    ● iscsi.service - Login and scanning of iSCSI devices
         Loaded: loaded (/usr/lib/systemd/system/iscsi.service; enabled; preset: enabled)
         Active: active (exited) since Thu 2024-08-01 10:28:36 UTC; 1h 0min ago
           Docs: man:iscsiadm(8)
                 man:iscsid(8)
        Process: 11174 ExecStart=/usr/sbin/iscsiadm -m node --loginall=automatic (code=exited, status=24)
       Main PID: 11174 (code=exited, status=24)
            CPU: 33ms
    
    Aug 01 10:28:36 nfs-0 systemd[1]: Starting Login and scanning of iSCSI devices...
    Aug 01 10:28:36 nfs-0 iscsiadm[1823]: Logging in to [iface: default, target: iqn.2006-04.nfs.local:nfs, portal: 10.0.0.17,3260]
    Aug 01 10:28:36 nfs-0 iscsiadm[1823]: Logging in to [iface: default, target: iqn.2006-04.nfs.local:nfs, portal: 10.0.0.18,3260]
    Aug 01 10:28:36 nfs-0 iscsiadm[1823]: Logging in to [iface: default, target: iqn.2006-04.nfs.local:nfs, portal: 10.0.0.19,3260]
    Aug 01 10:28:36 nfs-0 systemd[1]: Started Login and scanning of iSCSI devices.
    

方案 2:由于 SBD 配置问题,SBD 服务无法启动

SBD 服务由于以下问题而无法启动:

  • 缺少 SBD 配置。
  • SBD 配置不正确,例如不正确的 SBD 设备名称或语法错误。

解决方法:确保正确的 SBD 配置

  1. 验证 SBD 配置是否存在:

    sudo pcs stonith config sbd
    

    如果存在 SBD 配置,你将看到类似于以下文本的命令输出:

    Resource: sbd (class=stonith type=fence_sbd)
      Attributes: sbd-instance_attributes
        devices=/dev/disk/by-id/scsi-360014056eadbecfeca042d4a66b9d779,/dev/disk/by-id/scsi-36001405cbac988092e448059d25d1a4a,/dev/disk/by-
            id/scsi-36001405a29a443e4a6e4ceeae822e5eb
      Operations:
        monitor: sbd-monitor-interval-600
          interval=600
          timeout=15
    
  2. 验证并确保 SBD 配置文件 /etc/sysconfig/sbd 具有以下建议的参数和正确的 SBD 设备:

    SBD_PACEMAKER=yes
    SBD_STARTMODE=always
    SBD_DELAY_START=no
    SBD_WATCHDOG_DEV=/dev/watchdog
    SBD_WATCHDOG_TIMEOUT=5
    SBD_TIMEOUT_ACTION=flush,reboot
    SBD_MOVE_TO_ROOT_CGROUP=auto
    SBD_OPTS=
    SBD_DEVICE="/dev/disk/by-id/scsi-360014056eadbecfeca042d4a66b9d77;/dev/disk/by-id/scsi-36001405cbac988092e448059d25d1a4a;/dev/disk/by-id/scsi-36001405a29a443e4a6e4ceeae822e5eb"
    

方案 3:iSCSI 设备在群集节点上不可用

若要验证 iSCSI 设备是否在群集节点上可用,请 lsscsi 运行以下命令或 lsblk 命令。 如果 iSCSI 设备不可用,则不会在命令输出中显示 SBD 磁盘。

sudo lsscsi
[0:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sda
[1:0:1:0]    disk    Msft     Virtual Disk     1.0   /dev/sdb
[5:0:0:0]    cd/dvd  Msft     Virtual CD/ROM   1.0   /dev/sr0
sudo lsblk
NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                 8:0    0   64G  0 disk
├─sda1              8:1    0  200M  0 part /boot/efi
├─sda2              8:2    0  500M  0 part /boot
├─sda3              8:3    0    1M  0 part
└─sda4              8:4    0 63.3G  0 part
  ├─rootvg-tmplv  253:0    0    2G  0 lvm  /tmp
  ├─rootvg-usrlv  253:1    0   10G  0 lvm  /usr
  ├─rootvg-homelv 253:2    0    1G  0 lvm  /home
  ├─rootvg-varlv  253:3    0    8G  0 lvm  /var
  └─rootvg-rootlv 253:4    0    2G  0 lvm  /
sdb                 8:16   0   16G  0 disk
└─sdb1              8:17   0   16G  0 part /mnt
sr0                11:0    1  628K  0 rom

解决方法:启用自动登录到 iSCSI 目标服务器

  1. 验证所有群集节点上的启动器名称:

    sudo  cat /etc/iscsi/initiatorname.iscsi
    
    InitiatorName=iqn.2006-04.nfs-0.local:nfs-0
    
    sudo  cat /etc/iscsi/initiatorname.iscsi
    
    InitiatorName=iqn.2006-04.nfs-1.local:nfs-1
    
  2. 列出 SBD 配置文件中的所有 SBD 设备。

    sudo grep SBD_DEVICE /etc/sysconfig/sbd
    
    # SBD_DEVICE specifies the devices to use for exchanging sbd messages
    SBD_DEVICE="/dev/disk/by-id/scsi-360014056eadbecfeca042d4a66b9d779;/dev/disk/by-id/scsi-36001405cbac988092e448059d25d1a4a;/dev/disk/by-id/scsi-36001405a29a443e4a6e4ceeae822e5eb"
    
  3. 检查 SBD 设备是否正在运行且可访问。 如果 SBD 服务未运行且可访问,则会看到错误消息“sbd 失败;请检查日志。

    sudo  /usr/sbin/sbd -d /dev/disk/by-id/scsi-360014056eadbecfeca042d4a66b9d779 list
    
    == disk /dev/disk/by-id/scsi-360014056eadbecfeca042d4a66b9d779 unreadable!
    sbd failed; please check the logs.
    
    sudo /usr/sbin/sbd -d /dev/disk/by-id/scsi-36001405cbac988092e448059d25d1a4a list
    
    == disk /dev/disk/by-id/scsi-36001405cbac988092e448059d25d1a4a unreadable!
    sbd failed; please check the logs.
    
    sudo /usr/sbin/sbd -d /dev/disk/by-id/scsi-36001405a29a443e4a6e4ceeae822e5eb list
    
    == disk /dev/disk/by-id/scsi-36001405a29a443e4a6e4ceeae822e5eb unreadable!
    sbd failed; please check the logs.
    
  4. 启用对 iSCSI 目标服务器的自动登录。

    1. 在群集节点上执行iscsiadm发现操作:

      sudo iscsiadm -m discovery
      

      命令输出显示所有 iSCSI 目标服务器的 IP 地址和默认端口 3260:

      10.0.0.17:3260 via sendtargets
      10.0.0.18:3260 via sendtargets
      10.0.0.19:3260 via sendtargets
      
    2. 在给定 IP 地址处发现 iSCSI 目标服务器:

      sudo iscsiadm -m discovery --type=st --portal=10.0.0.17:3260
      

      命令输出显示目标名称,例如 iqn.2006-04.nfs.local:nfs:

      10.0.0.17:3260,1 iqn.2006-04.dbnw1.local:dbnw1
      10.0.0.17:3260,1 iqn.2006-04.ascsnw1.local:ascsnw1
      10.0.0.17:3260,1 iqn.2006-04.nfs.local:nfs
      
    3. 登录到 iSCSI 设备:

      sudo iscsiadm -m node -T iqn.2006-04.nfs.local:nfs --login --portal=10.0.0.17:3260
      
      Logging in to [iface: default, target: iqn.2006-04.nfs.local:nfs, portal: 10.0.0.17,3260]
      Login to [iface: default, target: iqn.2006-04.nfs.local:nfs, portal: 10.0.0.17,3260] successful.
      
    4. 启用对 iSCSI 设备的自动登录:

      sudo iscsiadm -m node -p 10.0.0.17:3260 -T iqn.2006-04.nfs.local:nfs --op=update --name=node.startup --value=automatic
      
    5. 验证 iSCSI 设备是否可用:

      sudo lsscsi
      
      [0:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sda
      [1:0:1:0]    disk    Msft     Virtual Disk     1.0   /dev/sdb
      [5:0:0:0]    cd/dvd  Msft     Virtual CD/ROM   1.0   /dev/sr0
      [6:0:0:0]    disk    LIO-ORG  sbdnfs           4.0   /dev/sdc
      
    6. 重复步骤 b-e 以确保其他 iSCSI 设备可用。

    7. 在另一个群集节点上重复步骤 a-f,以确保其他群集节点上的所有 iSCSI 设备都可用。

iSCSI 设备可用后, lsscsi 或 lsblk 命令输出应显示 SBD 磁盘。

sudo lsscsi
[0:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sda
[1:0:1:0]    disk    Msft     Virtual Disk     1.0   /dev/sdb
[5:0:0:0]    cd/dvd  Msft     Virtual CD/ROM   1.0   /dev/sr0
[6:0:0:0]    disk    LIO-ORG  sbdnfs           4.0   /dev/sdc
[7:0:0:0]    disk    LIO-ORG  sbdnfs           4.0   /dev/sdd
[8:0:0:0]    disk    LIO-ORG  sbdnfs           4.0   /dev/sde
sudo lsblk
NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                 8:0    0   64G  0 disk
├─sda1              8:1    0  200M  0 part /boot/efi
├─sda2              8:2    0  500M  0 part /boot
├─sda3              8:3    0    1M  0 part
└─sda4              8:4    0 63.3G  0 part
    ├─rootvg-tmplv  253:0    0    2G  0 lvm  /tmp
    ├─rootvg-usrlv  253:1    0   10G  0 lvm  /usr
    ├─rootvg-homelv 253:2    0    1G  0 lvm  /home
    ├─rootvg-varlv  253:3    0    8G  0 lvm  /var
    └─rootvg-rootlv 253:4    0    2G  0 lvm  /
sdb                 8:16   0   16G  0 disk
└─sdb1              8:17   0   16G  0 part /mnt
sdc                 8:32   0   50M  0 disk
sdd                 8:48   0   50M  0 disk
sde                 8:64   0   50M  0 disk
sr0                11:0    1  628K  0 rom

方案 4:节点在隔离后无法重新加入群集

如果 SBD 槽未处于干净状态,则隔离后节点将无法重新加入群集。 在这种情况下,节点上的 SBD 设备处于故障状态,另一个节点处于挂起状态。

若要验证 SBD 槽的状态,请运行以下命令:

sudo lsscsi
[0:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sda
[1:0:1:0]    disk    Msft     Virtual Disk     1.0   /dev/sdb
[5:0:0:0]    cd/dvd  Msft     Virtual CD/ROM   1.0   /dev/sr0
[6:0:0:0]    disk    LIO-ORG  sbdnfs           4.0   /dev/sdc
[7:0:0:0]    disk    LIO-ORG  sbdnfs           4.0   /dev/sdd
[8:0:0:0]    disk    LIO-ORG  sbdnfs           4.0   /dev/sde
sudo sbd -d /dev/sdc list
0       node1   clear
1       node2   reset   node1
sudo sbd -d /dev/sdd list
0       node1   clear
1       node2   reset   node1
sudo  sbd -d /dev/sde list
0       node1   clear
1       node2   reset   node1

解决方法:清除 SBD 槽

  1. 验证SBD_STARTMODE 参数是否在 SBD 配置文件 /etc/sysconfig/sbd 中设置为 always 或者 clean :

    sudo grep -i SBD_STARTMODE  /etc/sysconfig/sbd
    
    SBD_STARTMODE=clean
    

    该 SBD_STARTMODE 参数决定节点是否重新加入。 如果它设置为 always,即使节点之前已隔离,也会重新加入群集。 如果设置为 clean,则该节点在清除 SBD 槽后会重新加入群集。 这是预期的行为。 它检测到节点的 SBD 槽中的隔离类型消息,不允许节点重新加入群集,除非手动清除 SBD 槽。

  2. 清除之前被隔离且无法重新加入集群的节点上的 SBD 槽:

    sudo sbd -d <SBD_DEVICE> message LOCAL clear
    

    如果知道节点名称,可以使用以下命令清除 SBD 槽:

    sudo sbd -d <DEVICE_NAME> message <NODENAME> clear
    

    注意

    替换 <SBD_DEVICE>,<DEVICE_NAME> 并 <NODENAME> 相应地。

    例如,该命令可以是以下命令:

    sudo sbd -d /dev/sdc message node2 clear
    
  3. 清除 SBD 插槽后,启动群集服务。

    如果群集服务再次失败,请运行以下命令来解决此问题:

    sudo iscsiadm -m node -u
    
    sudo iscsiadm -m node -l
    

方案 5:添加新 SBD 设备后 SBD 服务无法启动

将新的 SBD 设备添加到群集后,会看到以下症状:

  • 通过运行以下命令 sudo systemctl status sbd 检查 SBD 服务状态时,会收到错误消息“sbd 失败;请检查日志“和”无法启动 sbd.service:作被拒绝”。

  • 通过 SBD 设备将测试消息发送到节点时,还会收到相同的错误消息:

    sudo sbd -d  /dev/disk/by-id/scsi-360014056eadbecfeca042d4a66b9d779 message node1 test
    
    sbd failed; please check the logs.
    

    在 /var/log/messages 文件中,还将找到以下日志:

    Mar  2 06:58:06 node1 sbd[11105]: /dev/disk/by-id/scsi-360014056eadbecfeca042d4a66b9d779:    error: slot_msg: slot_msg(): No recipient / cmd specified.
    Mar  2 06:58:06 node1 sbd[11104]: warning: messenger: Process 11105 failed to deliver!
    
  • 运行命令 sbd -d list 时,将显示一个空白输出。 有关详细信息,请参阅 显示空白输出的 SBD 设备列表。

解决方法:重启 Pacemaker 群集

使用 SBD 作为隔离设备并为 Pacemaker 群集启用它时,应在群集控制下管理服务。 因此,无法手动启动或停止它。 将任何新的 SBD 设备添加到 Pacemaker 群集后,应重启 Pacemaker 群集,以使 SBD 设备在群集控制下生效。

  1. 停止并重新启动所有群集节点上的群集服务。

    sudo pcs cluster stop --all
    
    sudo pcs cluster start --all
    
  2. 检查 SBD 服务是否已成功启动。

    sudo systemctl status sbd.service 
    
    ● sbd.service - Shared-storage based fencing daemon
       Loaded: loaded (/usr/lib/systemd/system/sbd.service; enabled; vendor preset: disabled)
       Active: active (running)
    

SBD 服务运行后,该 sbd -d list 命令不会显示空白输出:

sudo sbd -d /dev/disk/by-id/scsi-360014056eadbecfeca042d4a66b9d779 list
0   node1   clear   
1   node2   clear   

资料来源与适用范围

资料来源
微软官方 Linux 虚拟机排障文档
适用范围
Azure Linux 虚拟机;按正文发行版、内核及代理版本
内容语言
中文;命令、路径和错误标识保留技术原文
本地收录日期
2026-10-26
授权说明
CC BY 4.0

正文与所需资源由本站本地存储。查看来源及更新记录 ↗

请按适用版本和实际日志确认原因;本站没有对每一种系统或设备逐项执行文中的操作。