Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1100152
  • 博文数量: 276
  • 博客积分: 10077
  • 博客等级: 上将
  • 技术积分: 2513
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-24 20:31
文章分类

全部博文(276)

文章存档

2020年(1)

2015年(5)

2012年(2)

2011年(6)

2010年(7)

2009年(224)

2008年(31)

我的朋友

分类:

2009-08-10 15:28:02

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
阅读(873) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~