Slony 复制进程的检查及自动维护

目的:

自动检查、自动恢复复制进程以及把检查结果自动发电邮给指定邮箱。


因为Slony是放在后台跑的,如果服务器停电或出现异常断电什么的,就会因此出现复制异常或进程中断,所以系统管理员有必要每天去检查复制是否正常。

基于上一遍文章设置的Slony运行环境,检查Slony的log即可知道复制进程是否运行正常,通常我是用 tail -f slon_s.out.YYYYMMDD这样看的,但后来又觉得,每天做重复的事情对于一般人是无奈,对于会写程式的人来说是浪费生命,如果交给程序自动运行,会做的更完美,检查次数会更多。于是花了点时间写了一套可以自动检查、自动维护以及把检查结果自动发电邮给指定邮箱的程序集。


因为这是好几年前设计的script,所以只能通过查看cronjob来开始找了^_^:

切换到root,然后crontab -e,找到如下一段:

# replication tasks by rock
25 02 * * *  /live/bin/replbms/smain.sh stop
20 06 * * *  /live/bin/replStart.sh
30 07 * * *  /live/bin/chk_repl.sh 1
30 09 * * *  /live/bin/chk_repl.sh
00 14 * * *  /live/bin/chk_repl.sh
00 16 * * *  /live/bin/chk_repl.sh
我的设置是,凌晨两点二十五分停掉所有复制进程(所有数据库的复制都停掉),然后六点二十分又开启, 七点半检查一次复制是否正常,检查结果无论是否有问题均发电邮通知,余下那几个检查时间点检查,没有问题是不会发电邮的。对了,chk_repl.sh除了检查复制进程、发电邮之外,如果发现该数据库的复制进程出现问题,会自动重新启动复制进程。


replStart.sh复制重启数据库复制,其实是分别调用了replbms和replsmtbms两组复制:

#!/bin/sh
#
# replStart.sh      This script takes care of starting and stopping
#               the replication
#
# chkconfig: 2345 91 35
# description: Start replication
#
/live/bin/replbms/smain.sh stop
sleep 1
/live/bin/replbms/smain.sh start
sleep 1
/live/bin/replsmtbms/smain.sh start

chk_repl.sh,这个有点复杂,把要检查的数据库放到KEYS变量中,它会逐个检查是否复制正常,或检查是否有运行复制进程,没有则启动。如果发现错误则会自动发电邮通知指定用户
#!/bin/sh
# by rock

LOG_PATH="/tmp/chkrepl"
MAIL_USER="abcdef@abc.com"
MAIL="/usr/sbin/sendmail -f mis.websupport@abc.com -t "
SENDOK="$1"
KEYS="bms
smtbms
"

if [ ! -d $LOG_PATH ]; then
  mkdir -p $LOG_PATH
fi

Test_repl_running()
{
 DB="$1db"
 #echo "/bin/ps -aux|/bin/grep slon|/bin/grep $DB >$LOG_PATH/chk.log"
  /bin/ps -aux|/bin/grep slon|/bin/grep $DB >$LOG_PATH/chk$DB.log
  if /bin/grep "$DB host=" $LOG_PATH/chk$DB.log >/dev/null 2>&1; then
      echo "sss"
	  return 1
  else
      echo "fff"
      return 0
  fi
}
ERROR=""

for key in $KEYS ;do
    PATH="/live/bin/repl$key"
	Test_repl_running $key			
	if [ $? = 0 ] ; then
		echo "Test replication for $key Failed,restart it ..."
		echo "$PATH/smain.sh start"
		$PATH/smain.sh start
		/bin/sleep 3
		ERROR=$ERROR"\n.Test replication for $key Failed,restart it ..."
		#exit 0
	else
		echo "Test replication for $key successed."
	fi
	LOG_PAT="*_s*`/bin/date +%Y``/bin/date +%m``/bin/date +%d`"
	LOG_FILE="`/bin/ls $PATH/log/$LOG_PAT`"
	#/bin/grep ERROR  $LOG_FILE
	if [ -f "$LOG_FILE" ] ; then
	   echo "Found log file $LOG_FILE"
	else
	   echo "Not found log file '$LOG_FILE' for $key"db
	   ERROR=$ERROR"\n.Not found log file '$LOG_FILE' for $key"db
	   continue
	fi
		echo "Checing log file $LOG_FILE ..."
		if /bin/grep "ERROR" $LOG_FILE >/dev/null 2>&1; then
		  echo "$key replication found error,please check ."
		  ERROR=$ERROR"\n.$key replication found error,please check ."
		else
		  echo "OK."
		fi	  

done	

if [ -n "$ERROR" ]; then   
	echo -e "\n\n================================================================================"
	echo "ERROR List"
	echo -e $ERROR
	EMAILHEADER="TO: $MAIL_USER\n"
	EMAILHEADER=$EMAILHEADER"Subject: [ERROR] BMS LIVE -> RPT replication check Log ($HOSTNAME)"
	ERROR=$EMAILHEADER""$ERROR
	/bin/echo -e $ERROR >$LOG_PATH/error_mail.log
	$MAIL <$LOG_PATH/error_mail.log
else 	
    if [ -n "$SENDOK" ]; then 
		EMAILHEADER="TO: $MAIL_USER\n"
		EMAILHEADER=$EMAILHEADER"Subject: [OK] BMS LIVE -> RPT replication check Log ($HOSTNAME)"
		ERROR=$EMAILHEADER"\nAll replication is running."
		/bin/echo -e $ERROR >$LOG_PATH/error_mail.log
		$MAIL <$LOG_PATH/error_mail.log
        echo "email sent."
	fi 
fi 



相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...