大概内容参照文档 史应生版的
但是几个内容需要注意
一是搞清楚 redhat群集里面包含的network种类和作用
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||、
public interface (公网ip,浮动ip飘在上面)
private interface(心跳线) 群集通过私网心跳线在两台主机间确定对方是否还活着。
fence network(所谓的篱笆网络)
这个fence network可以建立在 private interface 上,又可以加在public interface上,当群集发现状态不对时,会通过fence network做重启机器的工作。
注意了,群集怎么才能根据(你的)配置来认为某个网络是心跳网络,或者是public网络呢。
我之前没弄懂就吃过这个亏。
原来,需要在/etc/hosts里面定义,
比如我的hosts表如下:
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
#172.16.100.5 linux-2
#172.16.100.3 linux-1
13.13.13.3 linux-1
13.13.13.4 linux-2
172.16.100.2 linux-fd
192.168.10.10 BACKUPSERVER
从上面定义的hosts表,群集就会这样认为:
13.13.13.3就是主机名为linux-1的私网心跳IP,
13.13.13.4就是主机名为linux-2的私网心跳IP.
注意了,如果私网心跳断掉的话,群集的两台机器都会认为对方挂掉了。
(因为群集是通过心跳来了解对方信息的)
如果此时fence走的不是心跳(走的是public)
而且正常工作的话,
两台机器会不断地重启。
这是因为一边认为对方不正常了,一起来就通过fence把对方干掉,
而另一边也不甘示弱。
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||、
关于服务器的脚本,
群集服务的脚本要符合linux脚本规范,
具体的说,是一定要实现三个功能:
start,stop,status
那我的脚本举例来说:
群集是在两台服务器之间管理oracle10g的服务,
1.这个脚本能启动群集服务,(对应我的群集就是能启动oracle服务及oracle Listener)。
2.能够关闭群集服务。
3.能够查看群集服务状态。
注意:
这个status很重要,它在群集服务不正常的时候应该是 exit 1,
正常的时候应该是 exit 0。
群集会定时的执行status脚本来查看服务的运行状态,以此来确定群集本身的状态。
晒晒我的oracle10g 脚本
#!/bin/bash
# /etc/rc.d/init.d/oracle10g
# chkconfig: 2345 02 98
# description: oracle10g is meant to run under Linux Oracle Server
# Source function library.
/etc/rc.d/init.d/functions
PATH=/usr/local/sbin:$PATH
ORACLE_HOME=/u01/app/oracle
ORACLE_NAME=oracle
RETVAL=0
#Start the oracle Server
#The following command assumes that the oracle login will not prompt the password
start() {
echo -n "Starting Oracle10G Server:"
su - $ORACLE_NAME -c '$ORACLE_HOME/bin/lsnrctl start'
su - oracle -c ". /u01/cluster/script/oracle_start" >>/u01/cluster/script/oracle_start.log
echo
}
stop() {
echo -n "Shutting down Oracle9iR2 Server:"
su - $ORACLE_NAME -c '$ORACLE_HOME/bin/lsnrctl stop'
su - oracle -c "/u01/cluster/script/oracle_stop" >>/u01/cluster/script/oracle_stop.log
echo
}
restart() {
echo -n "Restart Oracle10G Server"
stop
start
echo
}
case "$1" in
start)
start
;;
stop)
stop
exit 0
;;
status)
ps -ef |grep -v grep |grep -q ora_smon
if [ $? = 0 ]
then
echo "oracle is running"
exit 0
fi
echo "oracle is not running"
exit 1
;;
restart|reload)
stop
start
;;
*)
echo "Usage: $0 {start|stop|reload|restart|status}"
exit 1
;;
esac
exit 0
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
关于fence设备和群集切换试验
当初最不懂的就是fence这一块,这个项目做了之后,对它理解也就比较清晰了,
说白了fence就是用来互相重启的。因为群集的一个节点接管资源的时候,
如果不知道对方的状态,或发现对方的状态异常,就可以通过这个fence来干掉对方,
防止两边都挂上磁盘阵列,并同时对盘阵读写的情况出现。
所以做为fence设备,一定要有这个能力,就是远程接受重启主机的命令,并干掉主机(POWER RESTART)
一般能做fence的设备有两类,
一种是外置的,比如 一些交换机,电源控制器等等
一种是内置的,比如我这个项目用到的HP IlO
fence的支持列表可以在红帽的官方文档里面查到(我的资源里可以下载相关文档)
我做群集的切换测试的时候,
一旦拔掉心跳线(我做的是直连的),两边就都被对方干掉了。
因为fence走的是public,没有被影响,
但是心跳线掉了,于是两个节点间就不断的互相PK。
如果做的是外置fence就不会有这个问题了。
或者按照redhat工程师的建议,还是走内置fence,但是还要添加一个vote盘,用于投票决定哪台机器真正有问题,然后让fence老大把有问题的干掉。(文档里面有,但我没有做这个了)
我的群集切换测试实现了这个功能,
就是一旦一边的oracle服务不正常了,
另一边会接管它。
这个需要在配置群集时,群集模式上选择 relocate才行(不能是默认的 restart)。
晒一下我的 cluster.conf
<?xml version="1.0"?>
<cluster alias="OracleCluster" config_version="12" name="OracleCluster">
<fence_daemon post_fail_delay="0" post_join_delay="10"/>
<clusternodes>
<clusternode name="linux-1" nodeid="1" votes="1">
<fence>
<method name="1">
<device name="iLOlinux1"/>
</method>
</fence>
</clusternode>
<clusternode name="linux-2" nodeid="2" votes="1">
<fence>
<method name="1">
<device name="iLOlinux2"/>
</method>
</fence>
</clusternode>
</clusternodes>
<cman expected_votes="1" two_node="1"/>
<fencedevices>
<fencedevice agent="fence_ilo" hostname="172.16.100.16" login="Administrator" name="iLOlinux1" passwd="BGI96IA3"/>
<fencedevice agent="fence_ilo" hostname="172.16.100.17" login="Administrator" name="iLOlinux2" passwd="G8FEFGCU"/>
</fencedevices>
<rm>
<failoverdomains>
<failoverdomain name="redhat_fd" ordered="0" restricted="0">
<failoverdomainnode name="linux-1" priority="1"/>
<failoverdomainnode name="linux-2" priority="1"/>
</failoverdomain>
</failoverdomains>
<resources>
<ip address="172.16.100.2" monitor_link="1"/>
<fs device="/dev/sda1" force_fsck="0" force_unmount="1" fsid="15674" fstype="ext3" mountpoint="/oradata" name="oradata" options="" self_fence="0"/>
<script file="/etc/init.d/oracle10g" name="oracle_script"/>
</resources>
<service autostart="1" domain="redhat_fd" name="OracleService" recovery="relocate">
<ip ref="172.16.100.2"/>
<fs ref="oradata"/>
<script ref="oracle_script"/>
</service>
</rm>
</cluster>
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
一些命令
群集服务移动命令
在shell提示下启动群集软件,只需键入:
Clusvcadm –d redhat_service
如何启动服务在 linux-1上?
Clusvcadm –e redhat-service –m linux-1
如何把服务从linux-1重新定向到linux-2上
Clusvcadm –r redhat-service –m linux-2
for example
[root@linux-1 log]# clusvcadm -r OracleService -m linux-1
Trying to relocate service:OracleService to linux-1...Success
service:OracleService is now running on linux-1
查看群集ip的命令
ip addr show dev eth0
查看群集状态
clustat
for example
[root@linux-2 ~]# clustat
Member Status: Quorate
Member Name ID Status
------ ---- ---- ------
linux-1 1 Online, rgmanager
linux-2 2 Online, Local, rgmanager
Service Name Owner (Last) State
------- ---- ----- ------ -----
service:OracleServic linux-1 started
群集fence测试的命令
这里以HP ilo为列,当前edb1、edb2的ilo IP分别是10.11.0.1、10.11.0.2用户名密码为redhat,在edb1中测试:
# fence_ilo -a 10.11.0.2 -l redhat -p redhat -o status
在edb2中测试:
# fence_ilo -a 10.11.0.1 -l redhat -p redhat -o status
如果返回正确,证明fence已经正常
for example
[root@linux-2 ~]# fence_ilo -a 172.16.100.16 -l Administrator -p BGI96IA3 -o status
power is ON
success
[root@linux-2 ~]# fence_ilo -a 172.16.100.17 -l Administrator -p G8FEFGCU -o status
power is ON
success
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||