Кластер Red Hat: сбой одной из двух служб, использующих один и тот же виртуальный IP, приводит к разрыву IP

Кластер Red Hat: сбой одной из двух служб, использующих один и тот же виртуальный IP, приводит к разрыву IP

Я создаю отказоустойчивый кластер 2+1 под Red Hat 5.5 с 4 службами, 2 из которых должны работать на одном узле, разделяя один и тот же виртуальный IP-адрес. Одна из служб на каждом узле (называетсядиск1идиск2в cluster.conf ниже) нужен диск (SAN), другой — нет (они называютсянодиск1иnodisk2). Таким образом, на каждом узле должна быть одна служба, которой нужен диск (дискN) и соответствующая служба, которой не нужен диск (nodiskN). Я использую 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>

Связанный контент