1.这是很简单的一个 文件监控+触发同步脚本

监控一台服务器下的一个文件夹,发生改变则向另一个个文件夹进行同步。

具体的inotify命令  rsync命令  可以看linux分类下的介绍

inotify:https://www.cnblogs.com/centos2017/p/7896715.html

rsync: https://www.cnblogs.com/centos2017/p/7896702.html

#!/bin/sh

SRC=/var/www/channel/
DST=/var/www/webroot/channel/
INWT=/usr/local/bin/inotifywait
RSYNC=/usr/bin/rsync
$INWT -mrq -e create,move,delete,modify $SRC | while read D E F;do
            rsync -aHqzt $SRC $DST
done

2.下面是两台机器同步的脚本,rsync 使用daeom模式,

从45机器向70机器同步,70机器上设置rsync daeom模式,rsync具体配置可以参考 linux分类下 rsync文章

由于需要同步的源目录有三层,每个数字编号的文件夹下都有一千多图片
目录结构(如下)

supp/upload/1,2,3 ……9999/
supp/public/1,2,3 …… 9999/ 
如果将同步源目录直接设置为 supp,rsync 每次都是全量的同步 若有10个图片发生更改,
就触发10次rsync supp全量同步(一次rsync需要30分钟——简直就是噩梦)
这种在需要同步的源目录文件量很大的情况下,简直是不堪重负。不仅耗CPU还耗时,根本不可以做到实时同步

改良方法:通过脚本确定每次发生变化的最小目录 例如:supp/upload/1
这样只同步supp/upload/1
这个文件夹就好了

(这里要注意 rsync -R 的用法)
rsync -avz ./upload/1 user@ip::{supp/}   结果直接在supp目录下生成1 文件夹
rsync -avzR ./upload/1 user@ip::{supp/}   结果在supp目录下生成upload/1
文件夹

inotifywait 排除一个目录不监控,使用--include
版本1. 网上找的

#!/bin/bash

# 需要同步的源路径
src=/var/www/yunshuerqi/webroot/supp/

# 目标服务器上 rsync --daemon 发布的名称
des=oldfile

# 目标服务器上 rsync 用户登录名
user=yunshu

# rsync验证的密码文件   
rsync_passwd_file=/etc/rsyncd/rsyncd.secrets

# 目标服务器        
ip1=10.xx.xx.70

#进入同步源的根目录
 # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致

cd ${src}

#开始监控目录,排除Admin这个目录(不监控)                              
/usr/local/bin/inotifywait -mrq --format  '%Xe %w%f' --include='Admin' -e modify,create,delete,attrib,close_write,move ./ | while read file

do

# 把inotify输出切割 把事件类型部分赋值给INO_EVENT
# 把inotify输出切割 把文件路径部分赋值给INO_FILE
        INO_EVENT=$(echo $file | awk '{print $1}')      
        INO_FILE=$(echo $file | awk '{print $2}')       
        echo "-------------------------------$(date)------------------------------------"
        echo $file

#增加、修改、写入完成、移动进事件
#增、改放在同一个判断,因为他们都肯定是针对文件的操作,
#即使是新建目录,要同步的也只是一个空目录,不会影响速度。 
# 判断事件类型
        if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         
        then
                echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO' 
                rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}       
        fi
# INO_FILE变量代表路径哦  -c校验文件内容                 
#仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量
#即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件
#现在可以在不漏文件下也有不错的速度 做到平衡)
#然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性

#删除、移动出事件    
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
        then
       echo 'DELETE or MOVED_FROM'
       rsync -avzcR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} 
        fi
#看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误
#所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,
#这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录越多,同步删除的操作就越花时间。
        
 #修改属性事件 指 touch chgrp chmod chown等操作
        if [[ $INO_EVENT =~ 'ATTRIB' ]]
        then
                echo 'ATTRIB'
                if [ ! -d "$INO_FILE" ]                 
# 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,
#等此目录下的文件发生同步时,rsync会顺带更新此目录。               
                then
                        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}             
                fi
        fi
done

版本2. 修改新建目录同步卡死问题

版本1的问题,后台跑总是自己停,时间一般都在早上,
原因:如果新增一个目录  /supp/upload/8888

则同步命令为
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}    代码
rsync -avzcR --password-file=${rsync_passwd_file} ./upload yunshu@10.xx.xx.70::oldfile                      命令

这条命令会把整个shell脚本卡主,同步也停止了

改进一下,如果新增8888文件夹,则不进行同步,等文件夹内有文件生成时再一起同步,
(增加了一个判断和提示,若为文件夹则不同步——红字为修改)

do
        INO_EVENT=$(echo $file | awk '{print $1}')      
        INO_FILE=$(echo $file | awk '{print $2}')       
        echo "-------------------------------$(date)------------------------------------"
        echo $file
       
        if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         
        then
                echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO-start rsync'
                  if [ ! -d "$INO_FILE" ];then
                     rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}       
                  fi        
        fi

版本3. 优化同步效率

在版本1和2中,新增一个图片会产生好几个消息,如下

7个消息,也就是这个文件夹同步了七次!!!!

1-------------------------------Mon Oct 30 02:02:08 CST 2017------------------------------------
CREATE ./upload/day_171029/1509247844658982.jpg
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
building file list ... done
sent 2493 bytes  received 16 bytes  5018.00 bytes/sec
total size is 4869177  speedup is 1940.68
2-------------------------------Mon Oct 30 02:02:08 CST 2017------------------------------------
MODIFY ./upload/day_171029/1509247844658982.jpg
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
building file list ... done
sent 2493 bytes  received 16 bytes  5018.00 bytes/sec
total size is 4869177  speedup is 1940.68
3-------------------------------Mon Oct 30 02:02:08 CST 2017------------------------------------
MODIFY ./upload/day_171029/1509247844658982.jpg
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
building file list ... done
sent 2493 bytes  received 16 bytes  5018.00 bytes/sec
total size is 4869177  speedup is 1940.68
4-------------------------------Mon Oct 30 02:02:08 CST 2017------------------------------------
MODIFY ./upload/day_171029/1509247844658982.jpg
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
building file list ... done
sent 2493 bytes  received 16 bytes  5018.00 bytes/sec
total size is 4869177  speedup is 1940.68
5-------------------------------Mon Oct 30 02:02:08 CST 2017------------------------------------
MODIFY ./upload/day_171029/1509247844658982.jpg
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
building file list ... done
sent 2493 bytes  received 16 bytes  5018.00 bytes/sec
total size is 4869177  speedup is 1940.68
6-------------------------------Mon Oct 30 02:02:08 CST 2017------------------------------------
MODIFY ./upload/day_171029/1509247844658982.jpg
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
building file list ... done
sent 2493 bytes  received 16 bytes  5018.00 bytes/sec
total size is 4869177  speedup is 1940.68
7-------------------------------Mon Oct 30 02:02:08 CST 2017------------------------------------
CLOSE_WRITEXCLOSE ./upload/day_171029/1509247844658982.jpg
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
building file list ... done
sent 2493 bytes  received 16 bytes  1672.67 bytes/sec
total size is 4869177  speedup is 1940.68

3.两台机器间同步,使用rsync  ssh的认证方式
两台机器之间使用 公钥直接连接的方式(不用输入密码)
对方服务器使用的是24端口

#!/bin/sh
SRC=/var/www/xxxx/webroot/special/
DST=/usr/local/apache/htdocs/xxxx_wap/special/
INWT=/usr/local/bin/inotifywait
RSYNC=/usr/bin/rsync
$INWT -mrq -e create,move,delete,modify $SRC | while read D E F;do
rsync -aHqzte 'ssh -p 24 ' $SRC 10.11.0.49:$DST
done

shell脚本 inotify + rsync 同步脚本的更多相关文章

  1. shell生成rsync同步脚本

    test #!/bin/bash # # Rsync Install Script # Last Updated # ##### modify by Jinayf ##### ######手动修改以下 ...

  2. Shell脚本 server rsync 控制脚本

    [root@backup ~]# vim /etc/init.d/rsync#!/bin/bash #this script for start|stop rsync daemon service s ...

  3. rsync同步脚本

    #!/bin/bash export LANG=C date=`date +%Y-%m-%d-%H%M` red=`echo -e "\033[0;31m"` blue=`echo ...

  4. inotify +rsync进行实时同步

    1.安装rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpmyum -y install ino ...

  5. rsync+inotify实时同步环境部署记录

    随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足.首先,rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传输.如果文件 ...

  6. inotify+rsync实现实时同步并邮件通知

    服务器之间文件实时同步,监控文件的变化,发送邮件通知,并实时同步文件. 由于人工同步多台服务器的文件比较吃力,可以借助这样一套软件,自动化的实现这样的工作. 并且可以事实监控变化发送邮件给系统管理人员 ...

  7. 项目cobbler+lamp+vsftp+nfs+数据实时同步(inotify+rsync)

    先配置好epel源 [root@node3 ~]#yum install epel-release -y 关闭防火墙和selinux [root@node3 ~]#iptables -F [root@ ...

  8. 第2章 rsync(二):inotify+rsync详细说明和sersync

    本文目录: inotify+rsync 1.1 安装inotify-tools 1.2 inotifywait命令以及事件分析 1.3 inotify应该装在哪里 1.4 inotify+rsync示 ...

  9. rsync(二):inotify+rsync详细说明和sersync

    以下是rsync系列篇: inotify+rsync 如果要实现定时同步数据,可以在客户端将rsync加入定时任务,但是定时任务的同步时间粒度并不能达到实时同步的要求.在Linux kernel 2. ...

随机推荐

  1. 两个关于 Java 面试的 Github 项目

    哈喽,大家好.相信大家都知道金九银十,在人才市场上是指每年的 9 月和 10 月是企业的招聘高峰期.这个时候企业往往有大量招聘需求,求职者在这个时候就找工作无疑是最适合的.需求大,谈工资什么的就更容易 ...

  2. Falco 进入 CNCF Incubator 项目 | 云原生生态周报 Vol. 35

    作者 | 王思宇.陈洁.敖小剑 业界要闻 Falco 进入 CNCF Incubator 项目 原于 2018 年 8 月进入 sandbox,旨在 Kubernetes 运行时环境下支持配置规则来加 ...

  3. 【UWP】使用 LiteDB 存储数据

    序言: 在 UWP 中,常见的存储数据方式基本上就两种.第一种方案是 UWP 框架提供的 ApplicationData Settings 这一系列的方法,适用于存放比较轻量的数据,例如存个 Bool ...

  4. crawler 听课笔记 碎碎念 1 初步了解各种选择器极其简单的使用

    css中 身份证  id对应# 衣服      class对应 . 图片 pyquery...as pq html= request.get(url=''.....'') doc=pq(html) d ...

  5. 使用read、readline、readlines和pd.read_csv、pd.read_table、pd.read_fwf、pd.read_excel获取数据

    从文本文件读取数据 法一: 使用read.readline.readlines读取数据 read([size]):从文件读取指定的字节数.如果未给定或为负值,则去取全部.返回数据类型为字符串(将所有行 ...

  6. 并行网关 Parallel Gateway

    并行网关 Parallel Gateway 作者:Jesai 2018年3月25日 00:26:21 前言: 做工作流时间长后,慢慢的就会发现,很多客户会需要会签的功能,会签的情况也有很多种,实现的方 ...

  7. 「 从0到1学习微服务SpringCloud 」13 断路器Hystrix

    背景与功能 在微服务架构中,很多情况下,各个服务之间是相互依赖,一个服务可能会调用了好几个其他服务,假设其中有一个服务故障,便会产生级联故障,最终导致整个系统崩溃无法使用(这称为雪崩效应),Sprin ...

  8. P2869 [USACO07DEC]美食的食草动物Gourmet Grazers

    P2869 [USACO07DEC]美食的食草动物Gourmet Grazers 题目:约翰的奶牛对食物越来越挑剔了.现在,商店有M 份牧草可供出售,奶牛食量很大,每份牧草仅能供一头奶牛食用.第i 份 ...

  9. 文件上传三:base64编码上传

    介绍三种上传方式: 文件上传一:伪刷新上传 文件上传二:FormData上传 文件上传三:base64编码上传 Flash的方式也玩过,现在不推荐用了. 优点: 1.浏览器可以马上展示图像,不需要先上 ...

  10. 理想乡题解 (线段树优化dp)

    题面 思路概述 首先,不难想到本题可以用动态规划来解,这里就省略是如何想到动态规划的了. 转移方程 f[i]=min(f[j]+1)(max(i-m,0)<=j<i 且j符合士兵限定) 注 ...