Red Hat クラスタ: 同じ仮想 IP を共有する 2 つのサービスのうちの 1 つに障害が発生すると、IP が切断される

Red Hat クラスタ: 同じ仮想 IP を共有する 2 つのサービスのうちの 1 つに障害が発生すると、IP が切断される

私はRed Hat 5.5で2+1フェイルオーバークラスタを作成しています。4つのサービスのうち2つは同じノードで実行され、同じ仮想IPアドレスを共有する必要があります。各ノードのサービスのうちの1つ(ディスク1そしてディスク2下のcluster.confにあるように、一方はSANディスクを必要とし、もう一方は必要としません(これらはディスクなし1そしてノーディスク2)。したがって、各ノードにはディスクを必要とするサービスが 1 つあるはずです (ディスクN) と、ディスクを必要としない対応するサービス (ディスクなしN)。HA-LVM を使用しています。

SAN 障害をシミュレートするために SAN に接続された 2 つのインターフェイスをシャットダウン (ifdown 経由) すると、ディスクを必要とするサービスは無効になり、他のサービスは予想どおり実行され続けます。驚いたことに (そして残念なことに)、同じマシン上の 2 つのサービスによって共有されている仮想 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 が 1 つのノードに配置され、サービスが別のノードに配置されてしまいます。残念ながら、現在テストできるクラスターはありませんが、3 つのサービス (IP を必要とする 2 つのサービスと IP 自体) すべてを、優先度が少なくとも 1 の単一の制限付きフェイルオーバー ドメインに配置する必要があると思います。

/etc/cluster/cluster.conf手動で変更を行う場合は、バージョン番号を増分してから、 を使用しccs_tool update /etc/cluster/cluster.confて構成を他のノードにプッシュすることを常に念頭に置いてください。 はccs_tool段階的に廃止されますが、RHEL 5.4 ではまだ機能するはずです。 覚えておくべきもう 1 つのコマンドは、rg_testサービスを開始/停止するときにクラスターが何をしているかを正確に確認できることです。 デバッグ レベルを上げて、常にログ ファイルを監視してください。 幸運を祈ります!

答え2

ディスクに依存する 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>

関連情報