1. MC/SG双机系统安装和配置
1.1 MC/Service Guard的安装
完全安装MC/SG
首先将MC/SG的安装光盘mount到某个目录下
运行命令swinstall
选择安装从本地的安装光盘中安装
选定[ Auto Select Marked target ]
选定MC/Service Guard软件包
执行Action中的install选项
Ø 安装MC/SG 的PATCH包
首先确定操作系统的版本号
#uname -a
HP-UX FADATA1 B.11.00
再确定系统中已安装的MC/SG软件包及版本号
#swlist
从最新的HP网上资源中下载 MC for A500的补丁包
该补丁包文件为X1_mobile_patches.depot,大小为254,648,320Bytes,将该文件传输到/tmp目录下
Ø 安装该补丁包
#swinstall -s /tmp/X1_mobile_patches.depot
Ø 查看已安装的补丁包
#swlist|grep MC
PHSS_11.230 MC/Service Guard
1.2 MC/SG的配置
1.2.1 网络设置
使用lanscan可以查找系统中有几块网卡及其相关的信息,在本工程中可以看到每台机器上有lan0、lan1、lan2等三块网卡,其作用如下:
Ø lan0:心跳线heart beating network
双机心跳线使用10 Base-T网卡,配置在不同网段192.168.0.1,使用直连线连接。(直连线的制作需要自己动手,HP不提供,请参阅有关文档)
Ø lan1:工作用网卡
可通过系统工具sam进行将网卡IP地址更改到需要的工作网段上,并可通过查看/etc/rc.config.d/netconf文件来查看当前网络的配置情况,在配置完工作网卡的IP地址后,要选定一个工作用的IP地址,应和工作网卡在同一个网段,如:
XXDATA1: xx.xx.xx.21
XXDATA2: xx.xx.xx.22
CLUSTER: xx.xx.xx.23
Ø lan2:备份网卡
备份用网卡不配置IP地址。
Ø 信任访问设置
/.rhosts文件设置
XXDATA1 root
XXDATA1 root
XXDATA2 root
Ø /etc/hosts.equiv文件设置
XXDATA1 root
XXDATA1 oracle
XXDATA2 root
XXDATA2 oracle
Ø 拷贝文件为MC的节点目录列表文件
cp /etc/hosts.equiv /etc/cmcluster/cmclnodelist
rcp /etc/hosts.equiv fadata1:/etc/hosts.equiv
rcp /etc/hosts.equiv fadata1:/etc/cmcluster/cmclnodelist
1.2.2 锁盘设置
Ø 在XXDATA1和XXDATA2主机上创建一个200M的VGLOCK
创建PV
pvcreate -f -s 200M /dev/rdsk/c3t0d4 /dev/rdsk/c4t1d4
创建VG
#mkdir /dev/vglock
#mknod /dev/vglock/group c 64 0x040000
#vgcreate /dev/vglock /dev/dsk/c3t0d4 /dev/dsk/c4t1d4
显示VG
#vgdisplay -v vglock
/dev/dsk/c3t0d4
/dev/dsk/c3t1d4
Ø 将XXDATA1上VGLOCK信息export出来
#vgexport -v -p -s -m /tmp/vglock.map /dev/vglock
#rcp /tmp/vglock.map XXDATA2:/tmp/vgolck.map
Ø 在XXDATA2上将VGLOCK的信息import出来
#mkdir /dev/vglock
#mknod /dev/vglock/group c 64 0x040000
#vgimport -v -s -m /tmp/vglock.map
#vgchange -a y /dev/vglock
在XXDATA2上显示VGLOCK的信息
#vgdisplay -v /dev/vglock
/dev/dsk/c3t1d4
/dev/dsk/c4t0d4
Ø 将VG设置为非自动激活
#vi /etc/lvmrc
其中
AUTO_VG_ACTIVATE=1 修改为0
1.2.3 重新启动系统,
确定XXDATA1和XXDATA2双机上的VG01、VG02、VG03、VGLOCK处于非活动状态
#vgdisplay
/dev/vg01 not activate
/dev/vg02 not activate
/dev/vg03 not activate
/dev/vglock not activate
1.2.4 配置双机MC
Ø 确定一台主机
通过hostname来查看各主机的名称,并确定在CRCT1为主机,CRCT2为备份机。
Ø 在CRCT1上生成cluster.ascii文件
#cmquerycl -n XXDATA1 –n XXDATA2 -v -C /etc/cmcluster/cluster.ascii
Ø 编辑/etc/cmcluster/cluster.ascii文件,修改如下参数
NODE_NAME XXDATA1
NETWORK_INTERFACE lan0
HEARTBEAT_IP 192.168.0.1
NETWORK_INTERFACE lan1
xx.xx.xx.21
NETWORKINTERFACE lan2
FIRST_CLUSTER_LOCK_PV /dev/dsk/c3t1d4
NODENAME XXDATA2
NETWORK_INTERFACE lan0
HEARTBEAT_IP 192.168.0.2
NETWORK_INTERFACE lan1
xx.xx.xx.22
NETWORKINTERFACE lan2
FIRST_CLUSTER_LOCK_PV /dev/dsk/c3t0d4
MAX_CONFIGURED_PACKAGE 2
Ø 对配置进行检查
#cmcheckconf -v -C /etc/cmcluster/cluster.ascii
Ø 将vglock激活
#vgchange -a y /dev/vglock
Ø 将配置信息分发到各节点上
#cmapply -v -C /etc/cmcluster/cluster.ascii
Ø 启动双机
#cmrunck -v
Ø 查看双机信息
#cmviewcl –v
1.2.5 配置运行在双机MC的包(package)
以上只是将双机运行起来了,下面开始配置运行在双机上的包
在XXDATA1主机上生成Oracle包的配置参考文件
#mkdir /etc/cmcluster/pkg1
Ø 生成程序包配置模板
#cmmakepkg -p /etc/cmcluster/informix/pkg1.conf
#配置pkg1.conf 如下:
PACKAGE_NAME pkg1
FAILOVER_POLICY CONFIGURED_NODE
FAILBACK_POLICY MANUAL
NODE_NAME xxdata1
NODE_NAME....................................................................................................................................................................... xxdata2
RUN_SCRIPT /etc/cmcluster/pkg1/pkg1.cntl
RUN_SCRIPT_TIMEOUT NO_TIMEOUT
HALT_SCRIPT /etc/cmcluster/pkg1/pkg1.cntl
HALT_SCRIPT_TIMEOUT NO_TIMEOUT
SERVICE_NAME xxecs
SERVICE_FAIL_FAST_ENABLED NO
SERVICE_HALT_TIMEOUT 300
SUBNET xx.xx.xx.0
PKG_SWITCHING_ENABLED YES
NET_SWITCHING_ENABLED YES
NODE_FAIL_FAST_ENABLED NO
Ø 生成程序包控制脚本
cmmakepkg –s /etc/cmcluster/pkg1/oracle.sh
脚本如下:
ORA_8_1_X=yes
SID_NAME=xxecs
ORACLE_HOME=/oracle/app/oracle/product/8.1.7
SQLNET=no
NET8=yes
MONITOR_INTERVAL=30
ora_ckpt_${SID_NAME} ora_smon_${SID_NAME} ora_lgwr_${SID_NAME} ora_reco_${SID_NAME} ora_arc0_${SID_NAME}
set -A MONITOR_PROCESSES
export HOST=`hostname`
export DATE=`date`
PATH=${ORACLE_HOME}/bin:/sbin:/usr/bin:/usr/sbin:/etc:/bin
export ORACLE_SID=${SID_NAME}
export ORACLE_HOME
function oracle_run_cmds
{
PFILE=${ORACLE_HOME}/dbs/init${SID_NAME}.ora
if [[ -f ${PFILE}.${HOST} ]]
then
PFILE=${PFILE}.${HOST}
fi
if [[ ! -f ${PFILE} ]]
then
print "ORACLE: The file ${PFILE} does not exist."
print "\tERROR: Failed to start Oracle database."
exit 1
fi
if [[ ${ORA_7_3_X} = yes || ${ORA_8_0_X} = yes || ${ORA_8_1_X} = yes ]]
then
su oracle -c ${ORACLE_HOME}/bin/svrmgrl <
connect internal
startup pfile=${PFILE}
exit
EOF
else
su oracle -c ${ORACLE_HOME}/bin/sqldba lmode=y <
connect internal
startup pfile=${PFILE}
exit
EOF
fi
if [[ $? != 0 ]]
then
print "Oracle startup failed."
else
print "Oracle startup done."
fi
# Start the listener process for SQL*Net V2 or Net8.
if [[ ${ORA_7_3_X} = yes || ${ORA_8_0_X} = yes || ${ORA_8_1_X} = yes ]]
then
if [[ ${SQLNET} = yes || ${NET8} = yes ]]
then
su oracle -c "${ORACLE_HOME}/bin/lsnrctl start ${LISTENER_NAME}"
if [[ $? != 0 ]]
then
print "Oracle lsnrctl start failed."
else
print "Oracle lsnrctl start done."
fi
fi
fi
}
function oracle_shutdown_cmds
{
if [[ ${ORA_7_3_X} = yes || ${ORA_8_0_X} = yes || ${ORA_8_1_X} = yes ]]
then
su oracle -c ${ORACLE_HOME}/bin/svrmgrl <
connect internal
shutdown immediate
exit
EOF
else
su oracle -c ${ORACLE_HOME}/bin/sqldba lmode=y <
connect internal
shutdown immediate
exit
EOF
fi
if [[ $? != 0 ]]
then
print "Oracle shutdown failed."
else
print "Oracle shutdown done."
fi
}
function oracle_abort_cmds
{
set -m
${0} kill &
KILL_PID=$!
if [[ ${ORA_7_3_X} = yes || ${ORA_8_0_X} = yes || ${ORA_8_1_X} = yes ]]
then
su oracle -c ${ORACLE_HOME}/bin/svrmgrl <
connect internal
shutdown abort
exit
EOF
if [[ ${SQLNET} = yes || ${NET8} = yes ]]
then
su oracle -c ${ORACLE_HOME}/bin/lsnrctl <
set password ${LISTENER_PASS}
stop ${LISTENER_NAME}
exit
EOF
fi
else
su oracle -c ${ORACLE_HOME}/bin/sqldba lmode=y <
connect internal
shutdown abort
exit
EOF
if [[ ${SQLNET} = yes || ${NET8} = yes ]]
then
su oracle -c ${ORACLE_HOME}/bin/lsnrctl <
set password ${LISTENER_PASS}
stop ${LISTENER_NAME}
exit
EOF
fi
fi
if [[ $? != 0 ]]
then
print "Oracle abort failed."
else
print "Oracle abort done."
fi
typeset -i c
typeset -i num_procs=${#MONITOR_PROCESSES[@]}
while true
do
for i in ${MONITOR_PROCESSES[@]}
do
id=`ps -fu oracle | awk '/'${i}$'/ { print $2 }'` #JAGad06432
if [[ ${id} = "" ]] #JAGad06432
then
print "\n *** ${i} process has stopped. ***\n"
c=0
while (( c < $num_procs ))
do
if [[ ${MONITOR_PROCESSES[$c]} = $i ]]
then
unset MONITOR_PROCESSES[$c]
c=$num_procs
fi
(( c = c + 1 ))
done
fi
done
if [[ ${MONITOR_PROCESSES[@]} = "" ]]
then
job=$(jobs | grep -v Done)
if [[ ${job} != "" ]]
then
print "Killing the kill_hung_processes script\n"
kill %1
fi
exit 0
# fix for 1653287920
fi
sleep 5
done
}
function terminate
{
print "This monitor script has been signaled to terminate\n"
exit
}
function kill_hung_processes
{
sleep ${TIME_OUT}
for i in ${MONITOR_PROCESSES[@]}
do
id=`ps -fu oracle | awk '/'${i}$'/ { print $2 }'` #JAGad06432
if [[ ${id} != "" ]]
then
kill -9 ${id}
if [[ $? != 0 ]]
then
print "\n *** ${0} kill_hung_processes function did NOT find process ***\n *** ${i} running. ***\n"
else
print "\n *** ${0} kill_hung_processes function did find process ***\n *** ${i} running. Sent SIGKILL. ***\n"
fi
else
print " *** kill_hung_processes function did NOT find ANY process running. ***\n"
fi
done
}
function monitor_processes
{
typeset -i n=0
for i in ${MONITOR_PROCESSES[@]}
do
MONITOR_PROCESSES_PID[$n]=`ps -fu oracle | awk '/'${i}$'/ { print $2 }'` #JAGad06432
print "Monitored process = ${i}, pid = ${MONITOR_PROCESSES_PID[$n]}"
if [[ ${MONITOR_PROCESSES_PID[$n]} = "" ]]
then
print "\n\n"
ps -ef
print "\n *** ${i} has failed at startup time. Aborting Oracle. ***"
# set -m
nohup ${0} fault & # The script calls itself with the fault option.
# set +m
# sleep 999999
fi
(( n = n + 1 ))
done
sleep ${MONITOR_INTERVAL}
while true
do
for i in ${MONITOR_PROCESSES_PID[@]}
do
kill -s 0 ${i} > /dev/null
if [[ $? != 0 ]]
then
print "\n\n"
ps -ef
print "\n *** ${i} has failed. Aborting Oracle. ***"
# set -m
nohup ${0} fault & # The script calls itself with the fault option.
# set +m
# sleep 999999
fi
done
sleep ${MONITOR_INTERVAL}
done
}
function halt_package
{
cmhaltpkg ${PACKAGE_NAME}
cmmodpkg -d -n ${HOST} ${PACKAGE_NAME}
sleep 1
cmmodpkg -e ${PACKAGE_NAME}
}
print "\n *** $0 called with $1 argument. ***\n"
case $1 in
fault)
halt_package
;;
kill)
kill_hung_processes
;;
monitor)
monitor_processes
;;
start)
print "\n \"${HOST}\": Starting Oracle SESSION $SID_NAME at ${DATE} "
oracle_run_cmds
;;
halt)
print "\n \"${HOST}\": Aborting Oracle SESSION $SID_NAME at ${DATE} "
oracle_abort_cmds
;;
shutdown)
print "\n \"${HOST}\": Shutting down Oracle SESSION $SID_NAME at ${DATE} "
oracle_shutdown_cmds
;;
*)
print "Usage: ${0} [ shutdown | halt | start | monitor ]"
;;
esac
1.2.6 验证程序包的配置
#cmcheckconf –k -v –p /etc/cmcluster/pkg1/pkg1.conf
正常条件:
程序包有效,至少有一个NODE_NAME项
没有重复的参数项
参数值在许可的范围内
运行和暂停脚本在集群的所有节点都存在,并且是可以执行的.
运行和暂停超时少于4294秒
配置的资源在集群节点可用.
1.3 集群和程序包的维护和使用
1.3.1 使用CMVIEWCL命令检查群集和程序包状态
有关群集状态的信息保存在状态数据库中,此数据库可在群集的每个节点上进行维护.发出cmviewcl命令,可显示数据库中包含的信息:
#cmviewcl -v
1.3.2 群集的状态
群集状态可能是下列中的某一种:
up.至少在一个节点上有运行的群集守候进程,且没有发生重新配置
Down. 任何群集节点上都没有正在运行的群集守候进程
Starting 群集正在确定其活动成员关系.至少有一个群集守候进程运行
Unknown 发出cmviewcl 命令的节点不能与群集中的其他节点通信.
1.3.3 节点状况与状态
节点状态是运行还是停止取决于群集守候进程是否运行。注意:从群集的角度来看一个节点可能处于停止状态,但它仍旧在运行HP-UX。
节点还可以处于下列几种状态:
Failed:此状态下的节点永远也看不到它自己。如果此节点在活动的群几种,则群集中其他活动的成员会看到处于此状态的节点,但是此节点不再是活动的并且未暂停。
Reforming:群集重组时节点处于这种状态。节点当前运行的协议可确保所有节点都同意活动的群集中新的成员关系。如果达成了一致,状态数据库将更新,以便反映新的群集成员关系。
Running :对于最终的重组来说,处于这种状态的节点已完成所有要求的操作并正常运行
Halted:此状态下的节点永远也看不到它自己。此节点从容的离开活动的群集之后,其他节点将会看到节点处于此状态,如通过使用cmhaltnode命令
Unknown:此状态下的节点永远也看不到它自己。如果某个节点从来不是活动的群集成员,则其他节点将把此状态指派给此节点。
1.3.4 程序包状况和状态
Up:程序包控制脚本是活动的
Down:程序包控制脚本是非活动的
Unknown
程序包状态可能是下列中的某一种
Starting:控制脚本重的启动指令开始运行。
Running:服务是活动的,且正在受监视
Halting:控制脚本中的暂停指令正在运行
1.3.5 程序包切换属性
程序包还具有下列切换属性:
程序包切换。启用它意味着万一出现故障时,程序包可以切换到另一个节点
节点切换启用。启用意味着程序包可以切换到引用的节点。禁用则意味着程序包不能切换到指定的节点,除非已使用cmmodpkg命令为该程序包启用了节点
1.3.6 服务状态
服务仅有如下状态:
Up。服务正在受监视
Down。服务没有运行,它可能暂停或者已经出现故障
Uninitialized。群集配置中包括服务,但是不能在控制脚本中使用运行命令启动此服务
1.3.7 网络状态
网络接口仅有如下状态:
Up。
Down。
Unknown。我们不能确定接口是运行还是停止。群集停止时会发生这种情况,备用接口具有这种状态
1.3.8 故障切换和故障返回策略
对于FAILOVER_POLICY参数,程序包可配置为两个值中的一个:
CONFIGURED_NODE。程序包会故障切换到程序包配置文件的节点列表中的下一个节点
MIN_PACKAGE_NODE。程序包会故障切换到群集运行的程序包最少的节点
对于FAILBACK_POLICY参数,程序包也可配置为两个值中的一个:
AUTOMATIC。当主节点再次可用时,具有这种设置的程序包将在故障切换后返回到它的注 节点
MANUAL。具有这种设置的程序包必须在故障切换后由系统管理员返回到它的原节点。
故障切换和故障返回策略可在CMVIEWCL –V命令的输出中显示出来
1.3.9 使用MC/ServiceGuard命令启动群集
使用cmrunpkg 命令可以在特殊节点上运行程序包,然后使用cmmodpkg命令来启用程序包切换。例如
#cmrunpkg –n xxdata1 pkg1
#cmmodpkg –e pkg1
此命令将启动xxdata1上的程序包,接着启动程序包切换。由于暂停程序包会禁用切换,所以当程序包以前曾在某个节点上暂停时,必须按此顺序操作
1.3.10 暂停程序包
如果不想使用程序包但是还是希望节点继续运行,可暂停MC/ServiceGuard程序包。使用cmhaltpkg命令可暂停程序包,如下所述:
#cmhaltpkg pkg1
此命令可暂停pkg1程序包并禁用切换到另一个节点
1.3.11 移动程序包
使用MC/ServiceGuard命令可以从一个节点移动程序包到另一个节点
移动程序包之前,使用cmhaltpkg命令在主节点上暂停此程序包,此操作不仅暂停程序包,而且还将禁止程序包切换回暂停节点,所以在移动程序包之后,必须重新启动此程序包并启用切换,在cmrunpkg之后发出cmmodpkg –e package_name命令可以做到这一点。例如:
#cmhaltpkg pkg1
#cmrunpkg –n xxdata1 pkg1
#cmmodpkg –e pkg1
阅读(925) | 评论(0) | 转发(0) |