Cluster Red Hat: falha de um dos dois serviços que compartilham o mesmo IP virtual destrói o IP

Cluster Red Hat: falha de um dos dois serviços que compartilham o mesmo IP virtual destrói o IP

Estou criando um cluster de failover 2+1 no Red Hat 5.5 com 4 serviços, dos quais 2 devem ser executados no mesmo nó, compartilhando o mesmo endereço IP virtual. Um dos serviços em cada nó (chamadodisco1edisco2no cluster.conf abaixo) precisa de um disco (SAN), o outro não (eles são chamadosnodisk1enodisk2). Portanto, em cada nó deve haver um serviço que precisa de um disco (discoN) e seu serviço correspondente que não precisa de disco (nodiskN). Estou usando HA-LVM.

Quando desligo (via ifdown) as duas interfaces conectadas à SAN para simular falha da SAN, o serviço que precisa do disco é desabilitado, o outro continua rodando, conforme o esperado. Surpreendentemente (e infelizmente), o endereço IP virtual compartilhado pelos dois serviços na mesma máquina também é removido, tornando inútil o serviço ainda em execução. Como posso configurar o cluster para manter o endereço IP ativo? A única maneira que encontrei até agora foi atribuir um endereço IP virtual diferente para cada serviço que não precisa de disco (não implementado no seguinte cluster.conf).

cluster.conf se parece com isto:

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

Responder1

Acho que você precisará de outro serviço para manter esse IP. O problema é que quando o serviço SAN falha, o rgmanager emite um ip addr del <ip>no nó que está executando o serviço. Como esse IP é compartilhado, ele é retirado do outro serviço. Portanto, você precisará adicionar outro serviço, como:

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

A maneira como você configura seus domínios de failover é fundamental; se você fizer isso errado, acabará com o IP em um nó e os serviços no outro. Infelizmente não tenho um cluster para testar atualmente, mas estou pensando que você deseja todos os três serviços (os dois que precisam do IP e do próprio IP) em um único domínio de failover restrito com uma prioridade de pelo menos 1.

Tenha sempre em mente que, se você estiver fazendo alterações /etc/cluster/cluster.confmanualmente, aumente o número da versão e, em seguida, use ccs_tool update /etc/cluster/cluster.confpara enviar a configuração para outros nós. Outra coisa a ter em mente é que ccs_toolestá sendo descontinuado, mas no RHEL 5.4 ainda deve funcionar. O outro comando a lembrar é rg_testque permitirá que você veja exatamente o que o cluster está fazendo quando você inicia/interrompe serviços. Configure seus níveis de depuração e sempre observe os arquivos de log. Boa sorte!

Responder2

Você já tentou colocar os dois serviços que dependem do disco em seu próprio grupo de recursos?

Parece que a melhor ação seria descartar o IP e o serviço em execução quando a falha for detectada e, em seguida, mover o IP e ambos os serviços para outro membro do cluster.

Responder3

A única maneira de fazer isso funcionar era fornecer aos serviços que não precisavam de disco seus próprios endereços IP virtuais.

cluster.conf agora se parece com isto:

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

informação relacionada