Clúster de Red Hat: la falla de uno de los dos servicios que comparten la misma IP virtual destruye la IP

Clúster de Red Hat: la falla de uno de los dos servicios que comparten la misma IP virtual destruye la IP

Estoy creando un clúster de conmutación por error 2+1 en Red Hat 5.5 con 4 servicios de los cuales 2 deben ejecutarse en el mismo nodo y compartir la misma dirección IP virtual. Uno de los servicios en cada nodo (llamadodisco1ydisco2en cluster.conf a continuación) necesita un disco (SAN), el otro no (se llamannodisk1ynodisk2). Entonces, en cada nodo debería haber un servicio que necesite un disco (discoN) y su correspondiente servicio que no necesita disco (nodiskN). Estoy usando HA-LVM.

Cuando apago (a través de ifdown) las dos interfaces conectadas a SAN para simular una falla de SAN, el servicio que necesita el disco se desactiva y el otro sigue ejecutándose, como se esperaba. Sorprendentemente (y desafortunadamente), la dirección IP virtual compartida por los dos servicios en la misma máquina también se elimina, lo que inutiliza el servicio que aún se está ejecutando. ¿Cómo puedo configurar el clúster para mantener la dirección IP activa? La única forma que encontré hasta ahora fue asignar una dirección IP virtual diferente a cada uno de los servicios que no necesitan un disco (no implementado en el siguiente cluster.conf).

cluster.conf tiene este aspecto:

<?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>

Respuesta1

Creo que necesitarás otro servicio para mantener esta IP. El problema es que cuando falla el servicio SAN, rgmanager emite un mensaje ip addr del <ip>en el nodo que ejecuta el servicio. Dado que esta IP es compartida, se elimina del otro servicio. Entonces necesitarás agregar otro servicio como:

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

La forma en que configura sus dominios de conmutación por error es clave; si lo hace mal, terminará con la IP en un nodo y los servicios en el otro. Desafortunadamente, actualmente no tengo un clúster para realizar pruebas, pero creo que desea los tres servicios (los dos que necesitan la IP y la IP en sí) en un único dominio de conmutación por error restringido con una prioridad de al menos 1.

Siempre tenga en cuenta que si realiza cambios /etc/cluster/cluster.confmanualmente, incremente el número de versión y luego utilícelo ccs_tool update /etc/cluster/cluster.confpara enviar la configuración a los otros nodos. Otra cosa a tener en cuenta es que ccs_toolse está eliminando gradualmente, pero en RHEL 5.4 aún debería funcionar. El otro comando para recordar es rg_testque le permitirá ver exactamente qué está haciendo el clúster cuando inicia/detiene los servicios. Configure sus niveles de depuración y observe siempre los archivos de registro. ¡Buena suerte!

Respuesta2

¿Ha intentado colocar los dos servicios que dependen del disco en su propio grupo de recursos?

Parece que el mejor curso de acción sería descartar la IP y el servicio en ejecución cuando se detecta la falla, luego mover la IP y ambos servicios a otro miembro del clúster.

Respuesta3

La única forma de hacer que esto funcionara era dar a los servicios que no necesitaban un disco sus propias direcciones IP virtuales.

cluster.conf ahora tiene este aspecto:

<?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>

información relacionada