Cluster da Red Hat: Falha de um dos dois serviços compartilhando o mesmo IP virtual derrubando IP

1

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

Quando encerro (via ifdown) as duas interfaces conectadas à SAN para simular a falha da SAN, o serviço que precisa do disco está desativado e a outra continua em execução, como esperado. Surpreendentemente (e infelizmente), o endereço IP virtual compartilhado pelos dois serviços na mesma máquina também é removido, tornando o serviço ainda em execução inútil. 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 a cada um dos serviços que não precisassem de um disco (não implementado no seguinte cluster.conf).

cluster.conf tem esta aparência:

<?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>
    
por js. 18.11.2011 / 10:44

3 respostas

1

Acho que você precisará de outro serviço para manter esse IP. O problema é que, quando o serviço da SAN falha, o rgmanager emite um ip addr del <ip> no nó que está executando o serviço. Desde que este IP é compartilhado é arrancado do outro serviço. Então você precisa 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 é a chave, se você fizer isso errado, você terminará com o IP em um nó e os serviços no outro. Infelizmente eu não tenho um cluster para testar no momento, mas estou pensando que você quer 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 estiver fazendo alterações em /etc/cluster/cluster.conf manualmente, para incrementar o número da versão e, em seguida, usar ccs_tool update /etc/cluster/cluster.conf para enviar a configuração para os outros nós. Outra coisa a ter em mente é que ccs_tool está sendo eliminado, mas no RHEL 5.4 ele ainda deve funcionar. O outro comando a lembrar é que rg_test permitirá que você veja exatamente o que o cluster está fazendo quando você inicia / interrompe os serviços. Defina seus níveis de depuração e sempre observe os arquivos de log. Boa sorte!

    
por 20.11.2011 / 04:40
0

Já tentou colocar os dois serviços dependentes do disco no seu próprio grupo de recursos?

Parece que o melhor curso de 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 os dois serviços para outro membro do cluster.

    
por 20.11.2011 / 02:22
0

A única maneira de fazer isso funcionar é dar aos serviços que não precisam de um disco seus próprios endereços IP virtuais.

cluster.conf agora se parece com isso:

<?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>
    
por 28.11.2011 / 12:46