Red Hat 集群:两个共享同一虚拟 IP 的服务之一发生故障,导致 IP 地址被破坏

Red Hat 集群:两个共享同一虚拟 IP 的服务之一发生故障,导致 IP 地址被破坏

我在 Red Hat 5.5 下创建了一个 2+1 故障转移群集,其中包含 4 个服务,其中 2 个必须在同一节点上运行,共享同一个虚拟 IP 地址。每个节点上的一个服务(称为磁盘1磁盘2在下面的 cluster.conf 中)需要一个(SAN)磁盘,另一个则不需要(它们被称为nodisk1nodisk2)。因此,每个节点上应该有一个需要磁盘的服务(磁盘N) 及其对应的不需要磁盘的服务(无磁盘)我正在使用 HA-LVM。

当我关闭(通过 ifdown)连接到 SAN 的两个接口以模拟 SAN 故障时,需要磁盘的服务被禁用,而另一个服务继续运行,正如预期的那样。令人惊讶的是(不幸的是),同一台机器上的两个服务共享的虚拟 IP 地址也被删除,导致仍在运行的服务变得毫无用处。我该如何配置集群以保持 IP 地址正常运行?到目前为止,我发现的唯一方法是为每个不需要磁盘的服务分配不同的虚拟 IP 地址(未在以下 cluster.conf 中实现)。

cluster.conf 如下所示:

<?xml version="1.0" ?>
<cluster config_version="1" name="cluster">
  <fence_daemon clean_start="0" post_fail_delay="0" post_join_delay="3"/>
  <cman shutdown_timeout="10000"/>
  <clusternodes>
<clusternode name="node1" nodeid="1" votes="1">
  <fence>
    <method name="1">
      <device name="device1"/>
    </method>
  </fence>
</clusternode>
<clusternode name="node2" nodeid="2" votes="1">
  <fence>
    <method name="1">
      <device name="device2"/>
    </method>
  </fence>
</clusternode>
<clusternode name="node3" nodeid="3" votes="1">
  <fence>
    <method name="1">
      <device name="device3"/>
    </method>
  </fence>
</clusternode>
  </clusternodes>
  <fencedevices>
      <fencedevice agent="fence_ilo" ipaddr="10.0.24.101" login="admin" name="device1" passwd="password"/>
      <fencedevice agent="fence_ilo" ipaddr="10.0.24.102" login="admin" name="device2" passwd="password"/>
      <fencedevice agent="fence_ilo" ipaddr="10.0.24.103" login="admin" name="device3" passwd="password"/>
  </fencedevices>
  <rm>
<failoverdomains>
  <failoverdomain name="domain1" nofailback="0">
    <failoverdomainnode name="node1" priority="1"/>
  </failoverdomain>
  <failoverdomain name="domain2" nofailback="0">
    <failoverdomainnode name="node2" priority="1"/>
  </failoverdomain>
</failoverdomains>
<resources>
  <ip address="10.0.24.111" monitor_link="1"/>
  <ip address="10.0.24.112" monitor_link="1"/>
</resources>
<service autostart="1" exclusive="0" name="disk1" recovery="restart" domain="domain1">
  <ip ref="10.0.24.111"/>
  <script file="/etc/init.d/disk1" name="disk1"/>
  <fs device="/dev/VolGroup10/LogVol10" force_fsck="0" force_unmount="1" fstype="ext3" mountpoint="/mnt/lun1" name="lun1" self_fence="1"/>
  <lvm lv_name="LogVol10" name="VolGroup10/LogVol10" vg_name="VolGroup10"/>
</service>
<service autostart="1" exclusive="0" name="nodisk1" recovery="restart" domain="domain1">
  <ip ref="10.0.24.111"/>
  <script file="/etc/init.d/nodisk1" name="nodisk1"/>
</service>
<service autostart="1" exclusive="0" name="disk2" recovery="restart" domain="domain2">
  <ip ref="10.0.24.112"/>
  <script file="/etc/init.d/disk2" name="disk2"/>
  <fs device="/dev/VolGroup20/LogVol20" force_fsck="0" force_unmount="1" fstype="ext3" mountpoint="/mnt/lun2" name="lun2" self_fence="1"/>
  <lvm lv_name="LogVol20" name="VolGroup20/LogVol20" vg_name="VolGroup20"/>
</service>
<service autostart="1" exclusive="0" name="nodisk2" recovery="restart" domain="domain2">
  <ip ref="10.0.24.112"/>
  <script file="/etc/init.d/nodisk2" name="nodisk2"/>
</service>
  </rm>
</cluster>

答案1

我认为您需要另一项服务来维护此 IP。问题是,当 SAN 服务发生故障时,rgmanager 会ip addr del <ip>在运行该服务的节点上发出一个。由于此 IP 是共享的,因此它会从其他服务中移除。因此您需要添加另一项服务,例如:

<service autostart="1" domain="<fo_domain_of_services>" name="floating_ip">
  <ip ref="your_ip" />
</service>

设置故障转移域的方式很关键,如果设置错误,IP 会位于一个节点上,而服务位于另一个节点上。遗憾的是,我目前没有集群可供测试,但我认为您需要将所有三个服务(需要 IP 的两个服务和 IP 本身)放在一个优先级至少为 1 的单个受限故障转移域中。

请务必记住,如果您手动进行更改,/etc/cluster/cluster.conf请增加版本号,然后使用ccs_tool update /etc/cluster/cluster.conf将配置推送到其他节点。另一件需要记住的事情是,该命令ccs_tool正在逐步淘汰,但在 RHEL 5.4 中它应该仍然有效。要记住的另一个命令是,rg_test当您启动/停止服务时,它将允许您准确查看集群正在做什么。设置您的调试级别并始终查看日志文件。祝你好运!

答案2

您是否尝试过将依赖于磁盘的两个服务放入它们自己的资源组中?

听起来最好的行动方案是在检测到故障时删除 IP 和正在运行的服务,然后将 IP 和两个服务移动到另一个集群成员。

答案3

实现这一目标的唯一方法是给予不需要磁盘的服务自己的虚拟 IP 地址。

cluster.conf 现在如下所示:

<?xml version="1.0" ?>
<cluster config_version="1" name="cluster">
  <fence_daemon clean_start="0" post_fail_delay="0" post_join_delay="3"/>
  <cman shutdown_timeout="10000"/>
  <clusternodes>
    <clusternode name="node1" nodeid="1" votes="1">
      <fence>
        <method name="1">
          <device name="device1"/>
        </method>
      </fence>
    </clusternode>
    <clusternode name="node2" nodeid="2" votes="1">
      <fence>
        <method name="1">
          <device name="device2"/>
        </method>
      </fence>
    </clusternode>
    <clusternode name="node3" nodeid="3" votes="1">
      <fence>
        <method name="1">
          <device name="device3"/>
        </method>
      </fence>
    </clusternode>
  </clusternodes>
  <fencedevices>
      <fencedevice agent="fence_ilo" ipaddr="10.0.24.101" login="admin" name="device1" passwd="password"/>
      <fencedevice agent="fence_ilo" ipaddr="10.0.24.102" login="admin" name="device2" passwd="password"/>
      <fencedevice agent="fence_ilo" ipaddr="10.0.24.103" login="admin" name="device3" passwd="password"/>
  </fencedevices>
  <rm>
    <failoverdomains>
      <failoverdomain name="domain1" nofailback="0">
        <failoverdomainnode name="node1" priority="1"/>
      </failoverdomain>
      <failoverdomain name="domain2" nofailback="0">
        <failoverdomainnode name="node2" priority="1"/>
      </failoverdomain>
    </failoverdomains>
    <resources>
      <ip address="10.0.24.111" monitor_link="1"/>
      <ip address="10.0.24.112" monitor_link="1"/>
      <ip address="10.0.24.113" monitor_link="1"/>
      <ip address="10.0.24.114" monitor_link="1"/>
    </resources>
    <service autostart="1" exclusive="0" name="disk1" recovery="restart" domain="domain1">
      <ip ref="10.0.24.111"/>
      <script file="/etc/init.d/disk1" name="disk1"/>
      <fs device="/dev/VolGroup10/LogVol10" force_fsck="0" force_unmount="1" fstype="ext3" mountpoint="/mnt/lun1" name="lun1" self_fence="1"/>
      <lvm lv_name="LogVol10" name="VolGroup10/LogVol10" vg_name="VolGroup10"/>
    </service>
    <service autostart="1" exclusive="0" name="nodisk1" recovery="restart" domain="domain1">
      <ip ref="10.0.24.112"/>
      <script file="/etc/init.d/nodisk1" name="nodisk1"/>
    </service>
    <service autostart="1" exclusive="0" name="disk2" recovery="restart" domain="domain2">
      <ip ref="10.0.24.113"/>
      <script file="/etc/init.d/disk2" name="disk2"/>
      <fs device="/dev/VolGroup20/LogVol20" force_fsck="0" force_unmount="1" fstype="ext3" mountpoint="/mnt/lun2" name="lun2" self_fence="1"/>
      <lvm lv_name="LogVol20" name="VolGroup20/LogVol20" vg_name="VolGroup20"/>
    </service>
    <service autostart="1" exclusive="0" name="nodisk2" recovery="restart" domain="domain2">
      <ip ref="10.0.24.114"/>
      <script file="/etc/init.d/nodisk2" name="nodisk2"/>
    </service>
  </rm>
</cluster>

相关内容