Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2104258
  • 博文数量: 220
  • 博客积分: 8531
  • 博客等级: 中将
  • 技术积分: 4976
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-18 13:33
文章分类

全部博文(220)

文章存档

2017年(1)

2015年(1)

2014年(5)

2013年(6)

2012年(6)

2011年(30)

2010年(37)

2009年(53)

2008年(41)

2007年(40)

分类: LINUX

2009-09-12 12:33:10

    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了,如果有再判断数据库是否可读写,如果还正常再启动应用。
阅读(1436) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~