以前搞过微软的Cluster--MSCS(Exchagne2003),感觉原理非常简单,最近在做一个Oracle DG的项目,平台是Linux,总想模仿MSCS写个自动切换的脚本,搞了半天,搞出来了分享一下。

   目的:实现主节点在物理失效的情况下的从节点的服务自动接管,集群资源为IP地址和Oracle数据库服务。

   思路:集群用的IP地址进行定期的健康检查,当发现IP地址失效时夺取该IP地址并启动本节点对应的服务。

   脚本:

   config.sh

quorum_ip=172.17.100.254
cluster_ip=172.17.100.50
error_count=3
my_interface=eth1:1
net_mask=255.255.255.0
logfile=/var/log/cluster.log

   clustercheck.sh

source config.sh
#echo $cluster_ip
res=`ping $cluster_ip -c $error_count|grep Unreachable|wc -l`
#echo $res
if [ $res -eq $error_count ];
then
echo "Cluster IP resource is not active!"    >>$logfile
echo "Check if this node is online:"        >>$logfile
qres=`ping $quorum_ip -c $error_count|grep Unreachable|wc -l`
if [ $qres -eq $error_count ];
then
echo "This node is offline!"            >>$logfile
sh deactiveservice.sh   
ifconfig $my_interface down     
else
echo "Active this node! `date`"            >>$logfile   
ifconfig $my_interface $cluster_ip netmask $net_mask
sh activeservice.sh
exit 0
fi
else
echo "Cluster IP resource is active! `date`"    >>$logfile
actres=`arp -a |grep $cluster_ip|wc -l`
if [ $actres -eq 0 ];
then
echo "This node is the active node!"        >>$logfile
fi
fi

说明:

其实逻辑很简单,此脚本适用的环境也比较简单,此脚本检查的只是IP地址的有效性,并没有对Oracle监听进行更进一步的检查,所以适用的环境仅仅是IP地址失效的情况,包括主机实效导致的IP地址实效、网络失效导致的IP地址失效。

通过 ping $cluster_ip -c的命令检查集群IP地址的活跃性,如果活跃则认为集群健康,如果不活跃则去检查第三方节点以验证本节点是否脱网,如果未脱网则将集群IP绑定到本节点的服务网络适配器上,然后通过activeservice.sh 脚本启动集群提供的相应服务,当然也可以进行NFS、ISCSI的连接和mount,实现共享磁盘的切换;如果脱网则删除自己的集群IP绑定,执行deactiveservice.sh停止服务,释放其它集群资源。

当然,如果每个节点都支持IPMI等管理指令,可以在启动服务后给被接管的节点发送一个重新启动的命令,使对方自动重起获得新生。

当然也可以在通过其它机制完成重起操作,比如通过使用NFS更改对方的文件信号,对方通过定期判断信号状态自行重起等等。

非常简单,原理也非常清晰,肯定有很多没想到的,在实践中慢慢完善吧。