我正在Red Hat 5.5下创build一个2 + 1的故障转移群集,其中4个服务需要在同一个节点上运行,共享相同的虚拟IP地址。 每个节点上的一个服务(在下面的cluster.conf中称为disk1和disk2 )需要一个(SAN)磁盘,另一个不需要(它们被称为nodisk1和nodisk2 )。 所以在每个节点上应该有一个服务需要一个磁盘( diskN )及其相应的不需要磁盘的服务( nodiskN )。 我正在使用HA-LVM。
当我closures连接到SAN的两个接口(通过ifdown)来模拟SAN故障时,需要磁盘的服务被禁用,另一个按预期运行。 令人惊讶的是(不幸的是)同一台机器上的两个服务所共享的虚拟IP地址也被删除,导致仍在运行的服务无用。 如何configuration群集以保持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>
我想你会需要另一项服务来维护这个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位于一个节点和服务。 不幸的是,我目前没有一个集群来进行testing,但是我认为你希望所有三个服务(需要IP和IP的两个)在一个受限的故障切换域中,优先级至less为1。
请记住,如果要手动更改/etc/cluster/cluster.conf以增加版本号,然后使用ccs_tool update /etc/cluster/cluster.conf将configuration推送到其他节点。 还有一点需要注意的是ccs_tool正在被淘汰,但在RHEL 5.4中它仍然可以正常工作。 另一个要记住的命令是rg_test它可以让你准确地看到当你启动/停止服务时,集群正在做什么。 设置您的debugging级别,并始终观看日志文件。 祝你好运!
你有没有尝试把依赖于磁盘的两个服务放在自己的资源组中?
听起来最好的方法是在检测到故障时放弃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>