Red Hat 클러스터: 동일한 가상 IP를 공유하는 두 서비스 중 하나에 오류가 발생하면 IP가 중단됩니다.

Red Hat 클러스터: 동일한 가상 IP를 공유하는 두 서비스 중 하나에 오류가 발생하면 IP가 중단됩니다.

Red Hat 5.5에서 4개의 서비스가 포함된 2+1 장애 조치 클러스터를 만들고 있는데, 그 중 2개는 동일한 가상 IP 주소를 공유하는 동일한 노드에서 실행되어야 합니다. 각 노드의 서비스 중 하나(라고 함)디스크1그리고디스크2아래의 Cluster.conf에서)에는 (SAN) 디스크가 필요하지만 다른 하나는 필요하지 않습니다(이들을 호출함)nodisk1그리고nodisk2). 따라서 각 노드에는 디스크가 필요한 하나의 서비스가 있어야 합니다(디스크N) 및 디스크가 필요하지 않은 해당 서비스(노디스크N). HA-LVM을 사용하고 있습니다.

SAN 장애를 시뮬레이션하기 위해 SAN에 연결된 두 개의 인터페이스를 종료(ifdown을 통해)하면 디스크가 필요한 서비스가 비활성화되고 다른 인터페이스는 예상대로 계속 실행됩니다. 놀랍게도 (그리고 불행하게도) 동일한 시스템의 두 서비스가 공유하는 가상 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인 제한된 단일 장애 조치 도메인에서 세 가지 서비스(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>

관련 정보