czb项目实施的7套ha中,有两套se共享存储的,没有任何问题。5套le镜像版的都有问题,问题让我没有想到。
因为镜像版的占用两个免费license,所以没有license了,监控数据库只能用脚本。脚本的方式是登录到数据库,查看数据库状态是否是“read write”,如果是说明数据库正常。
#!/bin/sh
while true; do
sleep 30
value=`su - oracle -c "export oracle_sid=oratsa;sqlplus -silent /nolog @/opt/redflag/hacluster/scripts/check.sql"`
if [ "$value" = "read write" ]
then
echo "ok"
else
exit 2
fi
done
———————————————————————————————————————————————————— set pagesize 0 ; select open_mode from v$database; exit;
|
这个监控方式是没有问题的,但是数据库方面又提出要求了:数据库审计功能已经停止了,但是以sysdba登录数据库的用户操作还是被记录到日志里面了,ha30秒监控一次数据库,就是说每30秒都要有一个sysdba用户登录,造成日志飞速增长。这个数据库的问题我还真没有想到,解决起来也简单。建一个普通用户,只要有对v$database的select权限即可。
问题解决了,那么需要思考的就来了:ha监控应用到底还有哪些隐含的问题的?能想到的几个一一列出来:
1、磁盘默认在一侧挂载10次就做一次fsck。很多时候做ha挂载的存储非常大,几百g的空间,如果做fsck需要的时间不少,对ha来说,ha就会出现一个超时,而且无法停止对磁盘的fsck操作,那么最终导致ha暂时失败,此时人为也无法操作,只能等待fsck做完。
2、自己写监控脚本,那么这个监控脚本是死循环的,只有当应用出现问题的时候,此脚本才退出,ha发现之后触发切换。这里面有一个问题:当正常停止组的时候,监控停止脚本是没有改的,这时候应用会切走,但是监控脚本还在死循环呢,最后会误报“监控应用失败”一次。这倒不影响ha,但是分析问题时会混淆。解决也简单,监控停止脚本中加入一行,用来杀掉监控脚本。
3、应用和监控启动停止不记录的问题。当然这些ha是提供记录的方式了,但是日志不轮转是一个问题。
4、应用启动脚本放到后台时,ha无法正确捕获启动是否正常,从而影响“只切换一次”的功能。czb就有此问题,应用占用前台,只能&放到后台。但是应用依赖数据库,如果数据库有异常应用启动不成功,但是ha却不知道,因为&放到后台的都会返回0,ha就以为启动正常了。这样就会出现应用两边无限制的切换。
5、ha两组之间如果有前后依赖关系的。
|
这些问题都可以解决,但是需要形成一个规法。怕只怕谁都知道怎么解决,但是现场实施时却忘记了、忽略了。
czb几台单机系统需要设置数据库和应用开机启动。oracle数据库好说,有系统服务,可以设置开机启动,但是应用就需要在rc.local上做文章了。
一开始脚本是这样写的:
. /etc/profile
export lang=zh_cn.gb18030
export lc_all=zh_cn.gb18030
cd /opt/jit/kmc50/
./kmc.sh -start &
|
这个脚本应该是没有任何问题的,因为登录系统后执行此脚本可以正常启动应用。但是放到rc.local中就不能启动应用。通过后来不断的测试才发现,应用需要依赖数据库的侦听中有sid之后才能正常启动。也就是说,应用也要求sqlplus system/password@sid能登录才行,这跟ha的oracle agent要求一样的。
因为他是oracle 10.2,这个问题我一直都知道。从10.2开始,用netca建立的侦听文件中,缺少sid_name部分,所以侦听起来之后,需要一段时间,数据库才能把sid注册到侦听里面。我做ha的时候都是修改侦听文件,里面写死sid,达到侦听一起sid就注册进去。
不过这边我不想改他的侦听,吉大正元的哥们也说是否有别的办法?当然有了,脚本我是比较熟练的。下面是最终结果:
#!/bin/sh
while true
do
sleep 5
su - oracle -c "lsnrctl status"|grep orakmc
if [ "$?" = 0 ]
then
sleep 30
value=`su - oracle -c "export oracle_sid=orakmc;sqlplus -silent /nolog @/opt/check.sql"`
if [ "$value" = "read write" ]
then
. /etc/profile
export lang=zh_cn.gb18030
export lc_all=zh_cn.gb18030
cd /opt/jit/kmc50/
./kmc.sh -start &
exit
fi
fi
done
|
上面脚本首先看侦听里面是否有sid了,如果有再判断数据库是否可读写,如果还正常再启动应用。
阅读(1301) | 评论(0) | 转发(0) |