设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 832|回复: 0

[经验分享] ssh-keygen+rsync+inotifywait实现数据实时动态同步

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-11-14 09:40:03 | 显示全部楼层 |阅读模式
#!/bin/bash
#运行该脚本前请确保主从服务器中已安装如下程序或服务,需备份服务器(master):ssh、rsync、inotify-tools;备份服务器(slave):ssh
#Synopsis:ssh-keygen+rsync+inotifywait组合,生成可从远程备份服务器slave server实时动态备份生产服务器master server数据的功能
#Function:本脚本需要本地服务器(master server)免密码登陆到备份服务器(slave server),因此需要主从服务器上均安装有ssh服务
#此版本用到rsync的ssh协议传输,所以需要用到ssh-keygen生成公私钥,该功能脚本在另一篇日志已贴出,该脚本有log日志记录功能
#为防止误操作,对于master server监视目录中delete或move from的文件或目录,将会在slave server上暂时保留,并未彻底删除
#Usage:在需要备份的服务器上运行本脚本:./inotifyRsync.sh 2>/var/log/inotify/rsyncstd_error.log &,可根据需要添加到
#/etc/rc.local,以实现开机自启
#Notes:使用本脚本要求master和slave服务器上的路径相同;运行脚本一定要当前进程执行,如果sh program执行,则有的事件无法捕捉到,
#导致同步失败
#Date:2016/11
#Author:Jian
#Version:v1.0

#Variable definition
inoDir="/var/log/inotify"
#slave server ip
rsServer="192.168.1.26"
#slave server username
rsUsr="root"
#master & slave server watched directory
srcDir="/rsbackup/rs"
#slave server directory(delete or moved_from the watched dir)
#该目录为从服务器上的备份目录,目的是为防止主服务器上误操作,从监视目录中删除文件后,从服务器会将相同
#文件先移出slave的监视目录,而移出的目标目录就是oldFiles
oldFiles="/oldFiles"
#判断slave server监视目录和备份目录是否存在,否则创建之
ssh -t -q -n "$rsUsr"@"$rsServer" "[ ! -d "$srcDir" ] && mkdir -p "$srcDir""
ssh -t -q -n "$rsUsr"@"$rsServer" "[ ! -d "$oldFiles" ] && mkdir -p "$oldFiles""
#判断master server日志目录是否存在,否则创建之
[ ! -d "$inoDir" ] && mkdir -p "$inoDir"
#master 开启inotifywait,监视指定目录
/usr/local/inotify-3.14/bin/inotifywait -mrq -e close_write,create,moved_to,moved_from,attrib,delete \
--format '%w*%f*%Xe' $srcDir | tee $inoDir/inotify_events.`date +%Y%m%d`.log \
| while read line
do
#inotifywait命令输出格式如:/rsbackup/rs/*backup*MOVED_FROMXISDIR
  inoPath=$(echo $line | awk -F"*" '{print $1}')    #inotifywait命令输出分段,eg:inoPath=/rsbackup/rs/
  inoFile=$(echo $line | awk -F"*" '{print $2}')    #eg:inoFile=backup
  inoAction=$(echo $line | awk -F"*" '{print $3}')  #eg:inoAction=MOVED_FROMXISDIR
  rsyncSuccess=$inoDir/rsync_success.`date +%Y%m%d`.log #rsync同步成功记录日志
  rsyncError=$inoDir/rsync_error.`date +%Y%m%d`.log     #rsync同步失败记录日志
  #下面对捕捉到的inotifywait输出的每一个Filename和Action分别处理
  #file or dir moved from start location
  if [ "$inoAction" = "MOVED_FROM" ] || [ "$inoAction" = "MOVED_FROMXISDIR" ] || [ "$inoAction" = "DELETE" ] || [ "$inoAction" = "DELETEXISDIR" ]
  then
      ssh -t -q -n "$rsUsr"@"$rsServer" "[ -d "$inoPath$inoFile" ] || [ -f "$inoPath$inoFile" ] &&  mv $inoPath$inoFile "$oldFiles""
      if [ $? -eq 0 ];then
        echo "`date "+%Y%m%d%H%M%S"` : FILE OR DIR(moved from successfuly) : $inoPath$inoFile" >> $rsyncSuccess
      else
        echo "`date "+%Y%m%d%H%M%S"` : FILE OR DIR(file or dir moved from failure) : $inoPath$inoFile" >> $rsyncError
      fi
    fi
  #file or dir moved from end location
  #new file create start location
  echo "$inoFile" | grep -Ev "\...*sw[a-z]x?$" > /dev/null #grep -Ev用于排除正在编辑的.swx/.swp/.swpx等临时文件
  if [ $? -eq 0 ];then  
    if [ "$inoAction" = "CLOSE_WRITEXCLOSE" ];then
      rsync -ahzc -e ssh "$inoPath$inoFile" "$rsUsr"@"$rsServer":"$inoPath"  #rsync同步
      if [ $? -eq 0 ];then  #判断上面的rsync同步是否成功执行,否则生成传输错误日志
        echo "`date "+%Y%m%d%H%M%S"` : FILE(create or edit or cp -af successfuly) : $inoPath$inoFile" >> $rsyncSuccess
      else
        echo "`date "+%Y%m%d%H%M%S"` : FILE(create or edit or cp -af failure) : $inoPath$inoFile" >> $rsyncError
      fi
    fi
  fi
  #new file create end location
  #file renamed or moved start location
    if [ "$inoAction" = "MOVED_TO" ] ;then
      rsync -ahzc -e ssh "$inoPath$inoFile" "$rsUsr"@"$rsServer":"$inoPath"
      if [ $? -eq 0 ];then
        echo "`date "+%Y%m%d%H%M%S"` : FILE(renamed or moved successfuly) : $inoPath$inoFile" >> $rsyncSuccess
      else
        echo "`date "+%Y%m%d%H%M%S"` : FILE(renamed or moved failure) : $inoPath$inoFile" >> $rsyncError
      fi
    fi
    #file renamed or moved end location
    #dir create or cp -r start location
    if [ "$inoAction" = "CREATEXISDIR" ];then
      rsync -aruzc -d -e ssh "$inoPath$inoFile" "$rsUsr"@"$rsServer":"$inoPath"
      if [ $? -eq 0 ];then
        echo "`date "+%Y%m%d%H%M%S"` : DIR(create or cp -r successfuly) : $inoPath$inoFile" >> $rsyncSuccess
      else
        echo "`date "+%Y%m%d%H%M%S"` : DIR(create or cp -r failure) : $inoPath$inoFile" >> $rsyncError
      fi
    fi
   #dir create or cp -r end location
   #dir renamed or moved to start location
    if [ "$inoAction" = "MOVED_TOXISDIR" ];then
      rsync -aruzc -e ssh "$inoPath$inoFile" "$rsUsr"@"$rsServer":"$inoPath"
      if [ $? -eq 0 ];then
        echo "`date "+%Y%m%d%H%M%S"` : DIR(renamed or moved to successfuly) : $inoPath$inoFile" >> $rsyncSuccess
      else
        echo "`date "+%Y%m%d%H%M%S"` : DIR(renamed or moved to failure) : $inoPath$inoFile" >> $rsyncError
      fi
    fi
   #dir renamed or moved to end location
   #file attrib changed start location
   if [ "$inoAction" = "ATTRIB" ];then
     rsync -aruzc -e ssh "$inoPath$inoFile" "$rsUsr"@"$rsServer":"$inoPath"
      if [ $? -eq 0 ];then
        echo "`date "+%Y%m%d%H%M%S"` : FILE(attribute changed successfuly) : $inoPath$inoFile" >> $rsyncSuccess
      else
        echo "`date "+%Y%m%d%H%M%S"` : FILE(attribute changed failure) : $inoPath$inoFile" >> $rsyncError
      fi
   fi
   #file attrib changed end location
   #dir attrib changed start location
   if [ "$inoAction" = "ATTRIBXISDIR" ] && [ -n "$inoFile" ];then
     rsync -auzc -d -e ssh "$inoPath$inoFile" "$rsUsr"@"$rsServer":"$inoPath"
      if [ $? -eq 0 ];then
        echo "`date "+%Y%m%d%H%M%S"` : DIR(attribute changed successfuly) : $inoPath$inoFile" >> $rsyncSuccess
      else
        echo "`date "+%Y%m%d%H%M%S"` : DIR(attribute changed failure) : $inoPath$inoFile" >> $rsyncError
      fi
   fi
   #dir attrib changed end location
done



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-300090-1-1.html 上篇帖子: Samba通过Openldap统一认证 下篇帖子: Linux SSH登陆配置文件修改 动态
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表