一、问题背景
我们平时一般都采用 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
对采用rsync + inotify数据同步方式进行健康检测,布布扣,bubuko.com
对采用rsync + inotify数据同步方式进行健康检测
原文:http://sofar.blog.51cto.com/353572/1391119