inotify+rsync 实时同步文件 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
hellojammy
V2EX    Linux

inotify+rsync 实时同步文件

 
  •   hellojammy
    hellojammy 2016-12-07 12:44:57 +08:00 2816 次点击
    这是一个创建于 3232 天前的主题,其中的信息可能已经有所发展或是发生改变。

    点击访问原文 您还可以加入全栈技术交流群( QQ 群号: 254842154 )


    对于一个系统管理员来说,如何较实时地在多台服务器之间同步文件,是一个很重要的任务。之前我有一篇文章介绍了如何定时同步服务器文件,但是无法做到实时。今天给大家介绍一个 inotify+rsync 的实时同步方案,可以应用于文件备份,多台负载服务器代码同步等场景。

    前提条件

    inotify 是 linux 内核从 2.6.13 引入的文件系统变化通知机制。因此,需要检查你的服务器版本是否支持 inotify 机制

    grep INOTIFY_USER /boot/config-$(uname -r) 

    假如输出

    CONFIG_INOTIFY_USER=y 

    则代表支持。

    安装 inofity-tools 工具包

    yum install inotify-tools 

    应用场景

    多台负载服务器的代码通常需要实时地保持一致,传统的做法是使用 crontab 定时任务同步,这种方法不够实时而且效率低下。 今天以 inotify+rsync 为搭配介绍新的代码同步方案。 假设现在有三台服务器 A,B,C ,三台服务器是负载服务器,站点所在目录结构一致。现在要实现只发布代码到 A 服务器,自动同步代码到 B 和 C 服务器。首选需要让 A 服务器可以通过公钥方式登录到 B 和 C ,执行以下三步:

    ①在服务器 A 生成一对公钥和秘钥。使用 ssh-keygen -t rsa 生成,一路回车即可;

    ②进入秘钥文件夹查看文件。其中 id_rsa.pub 是公钥, id_rsa 是私钥; cd ~/.ssh

    ③打开 id_rsa.pub 文件,并把它的内容拷贝到服务器 B 和 C 的 /root/.ssh/authorized_keys 文件中,假如 /root/.ssh 目录下没有 authorized_keys 文件,则新建一个文件。

    现在,在 A 服务器就可以直接通过 ssh 命令实现无密码登录了

    //指定端口号,把 ip_address 替换成你 ip 地址 ssh root@ip_address -p 27631 //默认端口号 ssh root@ip_address 

    编写脚本:

    #!/bin/sh #var src="http://www.v2ex.com/var/www/html/t/" des_ip="ip_address1 ip_address2" #function inotify_fun () { /usr/bin/inotifywait -mrq --timefmt '%Y%m%d-%H:%M' --format '%T %e %w%f' \ -e attrib,close_write,delete,create,modify,move $1|while read time file do for ip in $des_ip do echo $des_ip echo "`date +%Y%m%d-%T`: rsync -avzq --delete --progress $1 root@$ip:$1" rsync -avzrtopgq --delete --progress $1 root@$ip:$1 #echo done done } #main for a in $src do inotify_fun $a done 

    des_ip 中的 ip_address1ip_address2 替换成实际的 ip 地址,多个 ip 地址用空格隔开。src是需要实时同步的目录,源服务器和目标服务器的目录结构一致。保存脚本文件为 rsync.sh ,然后用定时任务运行它一次,运行成功后取消该定时任务(我暂时不知道如何运行脚本一次,只能用这个土方法了。。。哪位大神知道麻烦告知一声)。

    inotifywait 的 e 参数表示要监听哪些事件:

    access 访问,读取文件。 modify 修改,文件内容被修改。 attrib 属性,文件元数据被修改。 move 移动,对文件进行移动操作。 create 创建,生成新文件 open 打开,对文件进行打开操作。 close 关闭,对文件进行关闭操作。 delete 删除,文件被删除。 

    查看任务是否在运行

    ps -ef |grep inotify 

    假如修改了脚本文件,需要关闭 inotify 之后再重新运行定时任务再取消。

    sudo pkill inotifywait 

    点击访问原文 您还可以加入全栈技术交流群( QQ 群号: 254842154 )


    shoaly
        1
    shoaly  
       2016-12-07 13:21:08 +08:00
    也可以通过 git 的 hook 来触发
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5490 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 08:34 PVG 16:34 LAX 01:34 JFK 04:34
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86