WEB开发网
开发学院服务器服务器方案 HACMP 5.x 完全手册,第 4 部分:脚本设计和经验共... 阅读

HACMP 5.x 完全手册,第 4 部分:脚本设计和经验共享

 2008-11-12 10:55:16 来源:WEB开发网   
核心提示:脚本部分 HACMP 的作用在于关键时刻能根据发生的情况自动通过预先制定好的策略进行相应的操作,如切换,HACMP 5.x 完全手册,第 4 部分:脚本设计和经验共享,使得用户经过短暂的中断即可继续使用服务,而对于用户来说,在最后,提供给您 2 个实用的 HACMP 配置模板,“服务可用”才是

脚本部分

HACMP 的作用在于关键时刻能根据发生的情况自动通过预先制定好的策略进行相应的操作,如切换。使得用户经过短暂的中断即可继续使用服务。而对于用户来说,“服务可用”才是 HACMP 切换成功的标志,而这一点不光是 HACMP 配置本身,还大大倚赖于启停脚本的可用性。

自 IBM 的 HACMP5205 以后,趋于稳定,BUG 很少。这使得 HACMP 切换不成功的主要原因集中在启停脚本的问题上。而很多时候,脚本的问题是非常隐蔽和难以测试的,所以在编写启停脚本时需要考虑周全,系统上线后要仔细维护。

通过多年的实践,我们形成了自己的一套脚本编制方式,共享出来,供大家参考。

脚本规划

启停方式

对于启动脚本,完全放在后台,不影响 HACMP 的切换。

对于停止脚本,通过后台启动,前台检查的方式进行,并使用清理 VG 的进程,确保停止成功。

由于启停是由启停各个部件启动组成的,如 host1 的启停就是启停 tuxedo 和 xom 软件组成,host2 的启停就是有启动 DB 和 listener 组成。我们把主机的启动分割为多个部分,这样综合写出共性的公用脚本程序,这样虽然第一次编写测试这些公用程序会花费大量的时间和精力,但最终将大大减轻管理员的重复工作,简化了脚本的编写,保证了脚本的质量。

文件存放目录表

目录 用途 举例
/usr/sbin/cluster/app 存放 HA 启停脚本
/usr/sbin/cluster/app/log 存放启停应用的详细 log
/home/scripts/`hostname` 存放应用启停脚本 /home/scripts/host1
/tmp 存放启停应用的 log /tmp/ha_app.out

文件命名表:

以主机名为特征进行命名,这样比较方便使用和区分。

脚本 命名规则 举例
HA 启动脚本 start_`hostname` start_host1
应用启动脚本 start_`hostname`_app start_host1_app
HA 停止脚本 stop_`hostname` stop_host2
应用停止脚本 stop_`hostname`_app stop_host2_app
启停应用 log /tmp/ha_app.out
启动应用详细 log start_`hostname`_app`yyyymmddHHMM`log start_host1_app200712241722.log
停止应用详细 log stop_`hostname`_app`yyyymmddHHMM`log stop_host1_app200712241722.log

启停跟踪

为了便于跟踪和阅读,应用的启停 log 不写入 /tmp/hacmp.out,而是另行输出到单独的 log。一般情况下,管理员只需跟踪 /tmp/ha_app.out 即可,一直等不到结束,再查看 /usr/sbin/cluster/app/log 下详细 log。

[host2][root][/]>tail -f /tmp/ha_app.out
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Starting--- host2 at Tue Dec 18 11:17:51 BEIST 2007
Waiting------- DB testdb --------- start,Press any key to cancel..
DB testdb is started!
Waiting------- listener testdb --------- start,Press any key to cancel..
testdb -- LISTENER is started!
Waiting------- listener testdb port 1521--------- start,Press any key to cancel..
LISTENER testdb port 1521 is listening!
start eai1d1 successful! at Tue Dec 18 11:20:43 BEIST 2007
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[host2][root][/]>cd /usr/sbin/cluster/app
[host2][root][/]>more start_host2_app200712181117.log
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Starting--- eai1d1 at Mon Dec 24 16:06:35 BEIST 2007
Mon Dec 24 16:06:35 BEIST 2007
Waiting------- DB eaiz1dev --------- start,Press any key to cancel..
SQL*Plus: Release 10.2.0.2.0 - Production on Mon Dec 24 16:06:35 2007
Copyright (c) 1982, 2005, Oracle. All Rights Reserved.
Connected to an idle instance.
SQL> ORACLE instance started.
Total System Global Area 1543503872 bytes
Fixed Size 2071488 bytes
Variable Size 369099840 bytes
Database Buffers 1157627904 bytes
Redo Buffers 14704640 bytes
....Database mounted.
.Database opened.
SQL> Disconnected from Oracle Database 10g Enterprise
Edition Release 10.2.0.2.0 - 64bit Production
……

编写注意事项:

值得注意的是,经过测试和实际使用发现,由 HA 启动脚本时, 如有嵌套,相对目录执行程序将不能生效,必须写成绝对路径 。如下面的情况将导致错误:

start_host1: nohup /home/scripts/host1/start_host1_app &
start_host1_app: /home/scripts/comm/start_db.sh orarun testdb 1521
start_db.sh: cd /home/scripts/comm
check_db_main.sh testdb
check_db_main.sh not found

需要改写为

start_db.sh: /home/scripts/comm/check_db_main.sh testdb

启动脚本

由于 HACMP 的启动和应用的启动可以分开,为避免应用脚本的启动不正常导致 HACMP 的报错,建议将 HACMP 的启动脚本简化,将启动应用的部分放在另一个应用启动脚本里。

基于规划,start_host2_app 的启动脚本使用了公用程序 start_db.sh 和 wait_db_start.sh,源代码如下,供大家参考:

start_db.sh 代码:

#start_db.sh oracle_sid listener_name
ORACLE_SID=$1
sqlplus " / as sysdba"<< EOF
startup
EOF
lsnrctl start $2

wait_db_start.sh 代码:

wait_db.sh oracle_user oracle_sid listner_port
#return code: 1---press key canceled
waitout ()
{
printf "Waiting------- ${1} ${2} ${3}--------- start,Press any key to cancel."
}
#main
CURRENT_PATH=`pwd`
SCRIPTS_PATH=`dirname ${0}`
cd $SCRIPTS_PATH
waitout DB $2
i=1
while [ $i -gt 0 ]
do
waitkey
$SCRIPTS_PATH/check_db_main.sh $1 $2
i=$?
done
waitout listener $2
i=1
while [ $i -gt 0 ]
do
waitkey
$SCRIPTS_PATH/check_db_listener.sh $1 $2 $4
i=$?
done
waitout listener $2 "port $3"
i=1
while [ $i -gt 0 ]
do
waitkey
$SCRIPTS_PATH/check_port.sh $3
i=$?
done
echo "nLISTENER $2 port $3 is listening!"
cd $CURRENT_PATH
exit 0

实际使用 start_host1 代码如下:

#start_host1
MACHINE=host1
GATEWAY=10.2.200.254
HA_LOG=log/start_"$MACHINE"_app`date +%C%y%m%d%H%M`.log
SCRIPTS_PATH=`dirname ${0}`
if [ "$SCRIPTS_PATH" = "." ];then
SCRIPTS_PATH=`pwd`
fi
if [ `hostname` = "$MACHINE" ]; then
route delete 0
route add 0 $GATEWAY
fi
> $SCRIPTS_PATH/$HA_LOG
nohup /home/scripts/comm/tail_log.sh start_app $SCRIPTS_PATH/$HA_LOG "!!!!!!!!!!!!|
started!|Waiting---|listening!|starting---|successful!" "successful!" >>/tmp/ha_app.out &
sleep 1
nohup /home/scripts/$MACHINE/start_"$MACHINE"_app ha >$HA_LOG &
exit 0

停止脚本

由于必须保证应用正常停止,才切换过去,所以停止脚本的正常结束才是 HACMP 停止应用服务器成功的标志。

停止脚本需要设定一个等待时间的阀值,超过这个阀值,将进行异常中止脚本的运行。

此外,为了防止停止时出现停不下来的现象,导致 HACMP 超时报 too long 广播,需要注意以下停止脚本的编写:

停止数据库脚本

停止数据库之前,必须记得先清理掉远程连接的用户,这样才能保证数据库能在可预测的时间内正常停止。

如 oracle 数据库停止之前,建议增加以下代码:

ps -ef|grep ora|grep $ORACLE_SID|grep "LOCAL=NO"|awk '{print "kill -9 "$2}'|sh

如果数据库超过一段时间仍停不下来,必须启动异常停止脚本。

最后加上清理文件系统的脚本

这一点很容易被忽略,因为有时即使应用正常停止,以下原因都可能导致导致 HACMP 不能 umount 这个文件系统 :

有用户登录在该文件系统下;

有其他程序使用了该文件系统下的库文件;

该文件系统与应用无关,但正在被使用。

结果均会最终导致 HACMP 停止不了该节点,切换失败。

基于这个原因,我们编写了 kill_vg_user.sh, 使用起来非常方便有效,都放在 /home/scripts/comm 下。现提供源代码,供大家使用和指正。

kill_vg_user.sh 代码 :

#kill_vg_user.sh vg_name
#kill_vg_user.sh erpapp_vg
if [ $# -le 0 ] ;then
echo "no para, example:kill_vg_user.sh erpapp_vg "
exit
fi
#main
SCRIPTS_PATH=`dirname ${0}`
df -k|awk '{print $7 }'|grep -v Mounted >/tmp/fs_mounted.txt
for i in `lsvg -l $1 |grep -vE "N/A|vg|MOUNT"|awk '{print $7}'`
do
if [ `grep -c $i /tmp/fs_mounted.txt` -ge 1 ] ; then
echo kill_fs_user.sh $i
$SCRIPTS_PATH/kill_fs_user.sh $i
fi
done

调用的 kill_fs_user.sh 代码 :

#kill_fs.sh fs_name
#kill_fs.sh /oracle
if
[ ` df -k|grep $1|grep -v grep|awk '{print $7}'|grep -v [0-9a-zA-Z]$1
|grep -v $1[0-9a-zA-Z_-]|wc -l` -eq 1 ] ;
then
fuser -kcux $1
fi

实际使用 stop_host1 代码:

MACHINE=host1
VGNAME=host1vg
HA_LOG=log/stop_"$MACHINE"_app`date +%C%y%m%d%H%M`.log
SCRIPTS_PATH=`dirname ${0}`
if [ "$SCRIPTS_PATH" = "." ];then
SCRIPTS_PATH=`pwd`
fi
cd $SCRIPTS_PATH
>$HA_LOG
/home/scripts/comm/tail_log.sh stop_app $SCRIPTS_PATH/$HA_LOG "!!!!!!!!!!!!!!!!!!|
stopped!|Waiting---|stopping---|successful!" "successful!" >>/tmp/ha_app.out &
sleep 1
/home/scripts/$MACHINE/stop_"$MACHINE"_app ha >$HA_LOG 2 >&1#stop_host1
/home/scripts/comm/kill_vg_user.sh $VGNAME
exit 0

同步 HA 的脚本

由于 HA 切换后,切换的时间有可能超过一天,而切换时很可能另一台机器已无法开启,不能拿到最新的 crontab 和后台相关脚本,所以 crontab 和脚本最好能每天自动同步。

编写 sync_HA.sh

在 host1 上编写

sync_HA.sh 的代码:

OMACHINE=host2
rsh $OMACHINE "cd /home/scripts;tar -cvf ${OMACHINE}_scripts.tar $OMACHINE"
rcp $OMACHINE:/home/scripts/${OMACHINE}_scripts.tar /home/scripts
cd /home/scripts
rm -rf $OMACHINE
tar -xvf ${OMACHINE}_scripts.tar
rcp $OMACHINE:/var/spool/cron/crontabs/root /home/scripts/$OMACHINE/crontab_${OMACHINE}

修改 Crontab 生效

###sync crontab
0 0 * * * /home/script/sync_HA.sh >/tmp/sync_HA.log 2>&1

同样在 host2 上编写,但注意 OMACHINE 修改为 host1。

经验共享

异常情况的人工干预

本文没有详细描述 HACMP 异常情况的处理,这是因为每个系统每次异常可能情况都不一样,而且一般来说,安装 HACMP 的系统都是核心系统,给你留的时间会非常短,快速处理的要求更严格。

所以,我们试图找到一个办法,来应对 HACMP 本身异常 99% 的异常情况,而对于脚本和系统参数的不匹配,只能通过找出问题所在来处理。

场景 1:host1 出现问题,但 HACMP 没有切换成功,处于僵死状态

快速强制停止 host1 机器运行host1:halt -q

确保应用服务继续

在 host2 上使用手工启动 host1_RG,

smitty hacmp->System Management (C-SPOC)-> HACMP Resource Group and Application Management ->Bring a Resource Group Online 选择 host1_RG,host2

Bring a Resource Group Online
Type or select values in entry fields.
Press Enter AFTER making all desired changes.
[Entry Fields]
Resource Group to Bring Online host1_RG

Node on Which to Bring Resource Group Online host2 即在 host2 上启动 host1 的资源组。

检查和确认应用已可以访问。

如发现仍然不正常,请参考场景 2 的第 3 步。

检查和修正问题。

host2: 强制停止 HACMP;

重新启动 host1,确认无硬件问题;

检查 HACMP 的环境,阅读 /tmp/hacmp.out 等 log,看看能否找出问题所在;

修正 HACMP 或其它部分

确认无误申请短暂停机时间,重起 HACMP 回原。

场景 2:host1 出现问题,HACMP 切换过来,但处于僵死状态

由于此场景的起因有很多,3,4 点只能根据具体系统来细化,但还是强烈建议每个系统编制一份手工切换手册,详细列明 HACMP 不可用的情况下如何手工启动应用,以备紧急情况使用。

停止 host1 机器运行host1:halt -q

host2 强制停止 HACMP

检查和修正目前状况

HACMP 异常情况修正表

序号 目前状况 目前状况 修正 备注
1 服务 IP 地址 smitty tcpip 手工添加
2 vg 状况 未 varyon varyonvg 手工执行 如果锁住加 varyonvg -bu
3 fs 状况 未 mount mount 手工执行 如损坏,执行 fsck -y
4 应用程序状况 执行异常 强制停止,重起 确认 1-3 ok 再做

手工修正目前状况

检查和修正问题

重新启动 host1,确认无硬件问题;

检查 HACMP 的环境,阅读 /tmp/hacmp.out 等 log,看看能否找出问题所在;

修正 HACMP 或其它部分;

确认无误申请短暂停机时间,重起 HACMP 回原。

其它有用的经验

HACMP 自动启动的实现

有的系统,希望开机就把 HACMP 自动启动,也就不需要人工干预就启动了应用,这需要 clstart 时指明 :

[host1][root][/]>smitty clstart
Start Cluster Services
* Start now, on system restart or both restart
Start Cluster Services on these nodes [host1]
BROADCAST message at startup? true
Startup Cluster Information Daemon? false
Reacquire resources after forced down ? false

这样,HACMP 会自动才 /etc/initab 里增加以下一行

hacmp6000:2:wait:/usr/es/sbin/cluster/etc/rc.cluster -boot -b # Bring up Cluster
Stop Cluster Services

这样就实现了自动启动 HACMP 和应用。

如果希望取消这种设定,需要运行 clstop:

[host1][root][/]>smitty clstop
Stop Cluster Services
* Stop now, on system restart or both restart
Stop Cluster Services on these nodes [bgbcb04]
BROADCAST cluster shutdown? true
* Shutdown mode graceful

可以看到 /etc/initab 里这一行消失了。

HACMP 的 too long 报警广播的修正

在有些系统运行很长时间的情况下,有可能停止的时间会超出我们预期,如 oracle 数据库的某些资源被交换到 Pagespace 里。缺省如果超过 180s,就会广播报警,直至 HACMP 异常。这时你可以修正这个参数,以避免广播出现。

smitty hacmp->Extended Configuration ->Extended Event Configuration ->Change/Show Time Until Warning

Max. Event-only Duration (in seconds) [360]
Max. Resource Group Processing Time (in seconds) [360]
Total time to process a Resource Group event 12 minutes and 0 seconds
before a warning is displayed
NOTE: Changes made to this panel must be
propagated to the other nodes by
Verifying and Synchronizing the cluster

同样,修改后需要 HACMP 同步。

HACMP 的 DMS 问题的修正

DMS(deadman switch) 是用来描述系统 kernel extension 用的,它可以在系统崩溃前关闭系统,并产生 dump 文件,以供日后检查使用。

DMS 存在的目的是为了保护共享外置硬盘及数据,当系统挂起时间长过一定限制时间时,DMS 会自动关闭该系统,由 HACMP 的备份节点接管系统,以保护数据和业务的正常进行,避免潜在的问题,特别是外置磁盘阵列。

errpt 确认 DMS 的发生:

LABEL:     KERNEL_PANIC
IDENTIFIER:   225E3B63
Date/Time:    Thu Apr 25 21:26:16                    
Sequence Number: 609                           
Machine Id:   0040613A4C00                       
Node Id:     localhost
Class:      S
Type:      TEMP
Resource Name:  PANIC
Descrīption
SOFTWARE PROGRAM ABNORMALLY TERMINATED
Recommended Actions                        
PERFORM PROBLEM DETERMINATION PROCEDURES             
Detail Data
ASSERT STRING                              
                                     
PANIC STRING

DMS 起作用的原因主要有以下几点:

某种应用程序的优先级大于 clstrmgr deamon , 导致 clstrmgr 无法正常重置 DMS 计数器;

在系统上存在大量 I/O 操作,导致 CPU 没有时间相应 clstrmgr deamon;

内存泄漏或溢出问题;

大量的系统错误日志活动。

换句话说,当以上情况出现时,HACMP 认为系统崩溃,会自动切换到另一台节点机上去,这是我们想要的结果吗?

一般情况下,原有的缺省设置无需更改。但由于系统运行了较长时间后,负荷可突破原有设计(平均小于 45%),而且某些情况下会持续 100%,我们就不希望发生切换。如果发生了 DMS 造成的切换,我们先延长 HACMP 的确认的时间,即调整心跳线的 诊断频率 :

smitty hacmp->Extended Topology Configuration ->Configure HACMP Network Modules -> Change a Network Module using Predefined Values 选择 r232

* Network Module Name rs232
Description RS232 Serial Protocol
Failure Detection Rate Slow
NOTE: Changes made to this panel must be
propagated to the other nodes by
Verifying and Synchronizing the cluster

同样,记得同步 HACMP。

如果还是发生 DMS 导致的 HACMP 切换,排除异常后,只好禁用 DMS 了, 这点 IBM 不推荐,因为有可能造成切换时数据丢失或损坏。

修改 rc.cluster 文件增加 -D 参数:

[host1][root][/]> vi /usr/es/sbin/cluster/etc/rc.cluster
if [ "$VERBOSE_LOGGING" = "high" ]
then
clstart -D -smG $CLINFOD $BCAST
else
clstart -D -smG $CLINFOD $BCAST 2>/dev/console
fi

重起 HACMP 生效。

SNMP 的调整(AIX5.3 不需要)

在 AIX 5.2 下要对 SNMP 做一些调整才可以看到真正的 HACMP 的状态。

具体来说, AIX 5.2 的 SNMP 默认是 version 3 :

[host1][root][/]>ls -l |grep snmp
lrwxrwxrwx 1 root system 8 Apr 08 17:55 clsnmp -> clsnmpne
-rwxr-x--- 1 root system 83150 Mar 12 2003 clsnmpne
-rwxr-x--- 1 root system 55110 Mar 12 2003 pppsnmpd
lrwxrwxrwx 1 root system 9 Apr 08 17:55 snmpd -> snmpdv3ne

而 HACMP 只支持 SNMP version 1 . 所以我们要做一下调整:

stopsrc -s snmpd
/usr/sbin/snmpv3_ssw -1
startsrc -s snmpd
[host1][root][/usr/sbin]>ls -l |grep snmp
lrwxrwxrwx 1 root system 18 Apr 21 13:40 clsnmp -> /usr/sbin/clsnmpne
-rwxr-x--- 1 root system 83150 Mar 12 2003 clsnmpne
-rwxr-x--- 1 root system 55110 Mar 12 2003 pppsnmpd
lrwxrwxrwx 1 root system 17 Apr 21 13:40 snmpd -> /usr/sbin/snmpdv1

小结

本部分论述了富有特色的 HACMP 脚本编著,也就特殊情况下的一些 HACMP 场景的处理做了详尽的描述,相信对希望进一步深入掌握 HACMP 的读者会有所帮助,对现实工作具有较强的参考意义。总的来说,本文采用类似教程的方式,一步一步由浅入深,细致完整的描述了 IBM HACMP 实施的各个方面,是不可多得的 HACMP 的使用手册。在最后,提供给您 2 个实用的 HACMP 配置模板,您可以在下载部分获得到。

下载

描述名字大小下载方法
HACMP 实用配置模板template.zip9891.84KBHTTP

Tags:HACMP 完全 手册

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接