Кластер Red Hat: сбой одного из двух сервисов, использующих один и тот же виртуальный IP, разрушает IP
Я создаю отказоустойчивый кластер 2+1 в Red Hat 5.5 с 4 службами, из которых 2 должны работать на одном узле, используя один и тот же виртуальный IP-адрес. Одной из служб на каждом узле (называемой disk1 и disk2 в cluster.conf ниже) требуется диск (SAN), а другой - нет (они называются nodisk1 и nodisk2). Таким образом, на каждом узле должен быть один сервис, которому нужен диск (diskN), и соответствующий сервис, которому не нужен диск (nodiskN). Я использую HA-LVM.
Когда я закрываю (через ifdown) два интерфейса, подключенных к SAN для имитации сбоя SAN, служба, нуждающаяся в диске, отключается, а другой продолжает работать, как и ожидалось. Удивительно (и, к сожалению), виртуальный 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>
3 ответа
Я думаю, что вам понадобится еще один сервис для поддержания этого 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-адрес одного узла, а службы - другого. К сожалению, в настоящее время у меня нет кластера для тестирования, но я думаю, что вы хотите, чтобы все три службы (две, для которых нужен IP и сам IP) находились в одном ограниченном отказоустойчивом домене с приоритетом не менее 1.
Всегда имейте в виду, что если вы вносите изменения в /etc/cluster/cluster.conf
вручную, чтобы увеличить номер версии, а затем использовать ccs_tool update /etc/cluster/cluster.conf
выдвинуть конфигурацию к другим узлам. Еще одна вещь, которую нужно иметь в виду, это то, что ccs_tool
постепенно сокращается, но в RHEL 5.4 все равно должно работать. Другая команда для запоминания rg_test
это позволит вам точно увидеть, что делает кластер при запуске / остановке служб. Установите уровни отладки и всегда просматривайте файлы журналов. Удачи!
Вы пытались поместить две службы, которые зависят от диска, в их собственную группу ресурсов?
Похоже, что лучшим способом было бы сбросить IP-адрес и работающую службу при обнаружении сбоя, а затем переместить IP-адрес и обе службы на другой элемент кластера.
Единственный способ сделать эту работу - дать сервисам, которым не нужен диск, свои собственные виртуальные 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>