inotify + rsync 实现 linux 文件实时同步

inotify + rsync实现linux文件实时同步

作者:ZIY

出处:http://www.ziy.cc/topic/24110-inotify-rsync%E5%AE%9E%E7%8E%B0linux%E6%96%87%E4%BB%B6%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5/


一.项目需求:
服务器A的数据目录内容变化后,改变要实时更新到多台服务器B C 的相关目录。
二.解决方法:
    1、多台服务器做为rsync服务器端,服务器A做为rsync客户端,使用rsync命令同步数据内容。
    2、inotify做为触发器,当服务器A数据目录内容变化时,执行rsync命令同步数据。
    A  192.168.13.151  
    B  192.168.13.252
    C  192.168.13.253
三.安装配置
服务器端BC (192.168.13.252 192.168.13.253)
# wget  http://www.samba.org/ftp/rsync/src/rsync-3.0.7.tar.gz
# tar zxvf rsync-3.0.7.tar.gz
# cd  rsync-3.0.7
# ./configure –prefix=/usr/local/rsync
# make
# maek install
# vi /etc/rsyncd.conf


uid = root
gid = root
use  chroot  = no
max connections =  10
pid  file  =   / var / run / rsyncd.pid
lock  file  =  / var / run / rsync.lock
log  file  =   / var / log / rsync.log
[ images ]
path =  / opt / images
read  only = no
auth  users  = valeRsync
secrets  file  =  / etc / rsyncd.secrets
建立用户认证文件
# echo -ne “valeRsync:Vale.com-init” >   /etc/rsyncd.secrets
# chmod 600 /etc/rsyncd.secrets
开机自动执行
# echo -ne “rsync –daemon –config=/etc/rsyncd.conf”   >> /etc/rc.local
启动服务
# /usr/local/rsync/bin/rsync –daemon –config=/etc/rsyncd.conf
客户端A (192.168.13.251)
# wget  http://www.samba.org/ftp/rsync/src/rsync-3.0.7.tar.gz
# tar zxvf rsync-3.0.7.tar.gz
# cd  rsync-3.0.7
# ./configure –prefix=/usr/local/rsync
# make
# maek install
# wget  http://ncu.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
# tar zxvf inotify-tools-3.13.tar.gz
# cd inotify-tools-3.13
# ./configure –prefix=/usr/local/inotify
# make
# make install
建立用户密码文件
# echo -ne “Vale.com-init”  > /etc/rsyncd.secrets
# chmod 600 /etc/rsyncd.secrets
开机自动执行
# echo -ne ‘/root/InotifyRsync.sh &’ >> /etc/rc.local
我的脚本
# vi  /root/InotifyRsync.sh


#!/bin/bash
host_1 =192.168.13.252
host_2 =192.168.13.253

src = / opt / image /
dst =images
user =valeRsync

/ usr / local / inotify / bin / inotifywait  -mrq   --timefmt   '%d/%m/%y %H:%M'   --format   '%T %w%f'   -e  modify,delete,create,attrib  $src   |   while read   file
     do
    rsync  -avzP   --delete    --password-file = / etc / rsyncd.secrets  $src   $user @ $host_1 :: $dst    >   / dev / null
    rsync  -avzP   --delete    --password-file = / etc / rsyncd.secrets  $src   $user @ $host_2 :: $dst    >   / dev / null
     #echo "${file} was rsynced"
done
exit   0
四.inotify支持的触发事件
IN_ACCESS,即文件被访问
IN_MODIFY,文件被 write
IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
IN_CLOSE_WRITE,可写文件被 close
IN_CLOSE_NOWRITE,不可写文件被 close
IN_OPEN,文件被 open
IN_MOVED_FROM,文件被移走,如 mv
IN_MOVED_TO,文件被移来,如 mv、cp
IN_CREATE,创建新文件
IN_DELETE,文件被删除,如 rm
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
IN_UNMOUNT,宿主文件系统被 umount
IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)
备注:


#!/bin/sh
#set -x
#var 
src = "/usr/local/nginx/html/lib /usr/local/nginx/html/www /usr/local/nginx/html/var/www.work.com.conf.php"
des_ip = "172.18.1.35 172.18.1.36 172.18.1.37 172.18.1.38"
#function
inotify_fun  ( )
{
/ usr / local / bin / inotifywait  -mrq   --timefmt   '%d/%m/%y-%H:%M'   --format   '%T %w%f'   -e  modify,delete,create,move $ 1
|   while   read   time   file
do
for  ip  in   $des_ip
do
echo   "`date +%Y%m%d-%T`: rsync -avzq --delete --progress $1 $ip:`dirname $1`"
rsync  -avzq   --delete   --progress  $ 1   $ip : ` dirname  $ 1 `
echo
done
done
}

#main
for  a  in   $src
do
inotify_fun  $a    &
done  

你可能感兴趣的:(inotify + rsync 实现 linux 文件实时同步)