您的位置:首页 > 其它

对采用rsync+inotify数据同步方式进行健康检测

2014-04-06 14:49 405 查看
一、问题背景
我们平时一般都采用 rsync + inotify 的方式进行网站数据实时同步,有时会遇到不能正常推送到某台服务器,而不能及时发现,因此有必要对数据同步进行健康检测。

二、技术原理
在源端服务器定期构造简单测试数据,休息若干秒后,然后从各个目的端服务器进行测试数据拉取,同时将拉取信息记录在“/tmp/check_rsync_health.log”,以做进一步的告警处理。

三、SHELL脚本代码(/data/scripts/check_rsync_health.sh)

#!/bin/bash
#===================================================================================================
# 检测网站源端服务器代码数据推送是否正常
# 发生异常时,会产生邮件、RTX、短信告警
#===================================================================================================
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

## WEB数据目录
WEB_DATA_PATH="/data/web/data"

## 其他Apache地址列表
IP_LIST_FILE="/usr/local/inotify/iplist.txt"

## 代码同步rsync参数
user="backup"
pwdfile="/usr/local/rsync/etc/rsyncd.pwd"
rsync="/usr/local/rsync/bin/rsync"

srcdir="webdata"
dstdir="/tmp/"

## 短信、RTX、邮件告警程序
MOINITOR_BIN_PATH="/usr/local/oms/agent/alarm/BusMonitorAgent"
TOKEN="service_monitor"

## 状态标记
RSYNC_FLAGS=0

## 检测结果LOG文件
RESULT_LOG_FILE="/tmp/check_rsync_health.log"

## 同步测试文件
TEST_FILE="check_rsync_health.dat"

#===================================================================================================
echo "MY_WEB_DATA"`date +'%Y%m%d%H%M%S'` > ${WEB_DATA_PATH}/${TEST_FILE}
sleep 20
echo -n "" > ${RESULT_LOG_FILE}

for IPADDR in `sed '/^$/d' ${IP_LIST_FILE}`
do
recv_count=`ping -c 2 ${IPADDR} | awk '/received/ {print $4}'`
[[ ${recv_count} -eq 0 ]] && echo "远程服务器: ${IPADDR} ping不可达 ^_^" && continue

${rsync} -qzrtopgl --include "${TEST_FILE}" --exclude '*' --bwlimit=40960 ${user}@${IPADDR}::${srcdir} ${dstdir} --password-file=${pwdfile}
if [[ ! -e /tmp/${TEST_FILE} ]]; then
RSYNC_FLAGS=1
else
retval=`sort -nr ${WEB_DATA_PATH}/${TEST_FILE} /tmp/${TEST_FILE} | uniq -u | wc -l`
[[ ${retval} -gt 0 ]] && RSYNC_FLAGS=1
fi

if [[ ${RSYNC_FLAGS} -gt 0 ]]; then
echo "${IPADDR}|no" >> ${RESULT_LOG_FILE}
RSYNC_FLAGS=0
else
echo "${IPADDR}|yes" >> ${RESULT_LOG_FILE}
fi

rm -f /tmp/${TEST_FILE}
done

#---------------------------------------------------------------------------------------------------
retval=`awk -F '|' '$2=="no" {print $2}' ${RESULT_LOG_FILE} | wc -l`
if [[ ${retval} -gt 0 ]]; then
killall -9 rsync.sh inotifywait >/dev/null 2>&1
cd /usr/local/inotify && nohup ./rsync.sh &
${MOINITOR_BIN_PATH} -c 2 -f ${TOKEN} -t "同步健康检测" -i "网站源端代码推送发生异常,已修复完毕,请尽快确认 ^_^"
fi

rm -f ${WEB_DATA_PATH}/${TEST_FILE} /tmp/${TEST_FILE} `pwd`/connect_error.log

## 防止文件锁不能正常释放,而导致下次未能正常调度运行
retval=`fuser /var/run/check_rsync.lock`
if [[ "${retval}X" != "X" ]]; then
rm -f /var/run/check_rsync.lock && touch /var/run/check_rsync.lock
kill -9 `ps -A -oppid,pid,cmd | grep check_rsync_health.sh | grep -v grep | awk '{print $2}'` >/dev/null 2>&1
fi

#===================================================================================================
#The End

四、crontab信息添加
*/10 * * * * (flock --timeout=0 /var/run/check_rsync.lock /data/scripts/check_rsync_health.sh >/dev/null 2>&1)
注:增加了文件锁“/var/run/check_rsync.lock”,以保证单实例运行

本文出自 “人生理想在于坚持不懈” 博客,请务必保留此出处http://sofar.blog.51cto.com/353572/1391119
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: