> CentOS > CentOS服务器 > 文件同步 >

unison + inotify双向同步

介绍篇:

Unison是一款跨windows/linux/MAC OS平台的文件同步工具,不仅支持本地对本地同步,也支持通过SSH、RSH和Socket等网络协议进行同步。Inotify可以监控文件系统操作,比如读取、写入和创建等,通过和Unison配合可以做到将数据实时的进行同步。

Unison双向同步基本原理是:假如有A B两个文件夹,A文件夹把自己的改动同步到B,B文件夹也把自己的改动同步到A,最后A B两文件夹的内容相同,是AB文件夹的合集。

Unison双向同步的一个缺点是:对于一个文件在两个同步文件夹中都被修改时,unison是不会去同步的,因为unison无法判断以那个为准。

如果检测到两个文件夹有所不同,unison会提示,让你选择相应的操作。

 

安装篇:

下载ocaml组件并安装: 

wget http://caml.inria.fr/pub/distrib/ocaml-4.02/ocaml-4.02.1.tar.gz

下载unison :

wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/beta/unison-2.48.1.tar.gz

下载inotify:

wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

安装ocaml组件:

tar zxvf ocaml-4.02.1.tar.gz;cd ocaml-4.02.1;./configure;make world opt && make install

安装unison程序:

tar zxvf unison-2.48.1.tar.gz;cd unison-2.48.1;make UISTYLE=text
make install

(make UISTYLE=text 报错时,需要创建/root/bin/文件夹后再运行make install。mkdir /root/bin/;make install;cp unison /root/bin/;cp unison /usr/local/bin/

报etags错误可以忽略或者安装etags:yum -y install ctags-etags)

编译好的unsion可拷贝到客户端服务器的/usr/local/bin/下使用

安装inotify:

tar zxvf inotify-tools-3.14.tar.gz; cd inotify-tools-3.14;./configure ; make && make install

使用篇:

首次运行一次unison使其生成配置文件,命令为:/usr/local/bin/unison

使用脚本实现双向同步:

服务端:配置文件以及脚本信息

[root@mysql-test tmp]# cat /root/.unison/default.prf

# Unison preferences file

batch = true

owner = true

group = true

perms = -1

#fastcheck = false

fastcheck = true

rsync = false

sshargs = -C

xferbycopying = true

confirmbigdel = false

log = true

logfile = /var/log/unison.log

maxthreads = 300

#repeat = 1

retry = 3

#ignore = Path /tmp/www.91town.xxx/log/

[root@mysql-test tmp]# cat /tmp/watch.sh

#!/bin/bash

host1=192.168.0.231

host2=192.168.0.225

host3=192.168.0.232

src=/tmp/www.91town.xxx/

#inotifywait -mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w%f%e ‘ -e close_write,delete,create,attrib $src |while read files

inotifywait -mrq -e close_write,delete,create,attrib $src |while read files

do

#/usr/local/bin/unison $src ssh://$host1/$src

/usr/local/bin/unison $src ssh://$host2/$src

#/usr/local/bin/unison $src ssh://$host3/$src

echo “$files” >> /tmp/sh.unison.log

echo `date | cut -d ” ” -f1-4` >> /tmp/inotify.log

done

 

客户端:配置文件以及脚本信息

[root@vm4 tmp]# cat /root/.unison/default.prf

# Unison preferences file

root = /tmp/www.91town.xxx #本地文件夹

root = ssh://root@192.168.0.230//tmp/www.91town.xxx #远程文件夹

batch = true #表示全自动模式,接受并执行默认动作。

owner = true #表示保持同步的文件属主信息。

group = true #表示保持同步的文件属组信息。

perms = -1 #表示保持同步的文件读写权限。

#fastcheck = false

fastcheck = true #true表示同步时通过文件的创建时间来比较两地文件;false表示同步时通过比较两地文件内容。

rsync = false #默认值是true,用于激活rsync传输模式。

sshargs = -C #使用ssh的压缩传输方式。

xferbycopying = true #优化传输参数,默认值为true。

confirmbigdel = false #默认值为true,表示当需要同步的两个目录有一个为空时,unison将停止。设置为false可以保证当需要同步的某个目录为空时,unison不会停止运转。

log = true #表示在终端输出运行信息。

logfile = /var/log/unison.log #指定同时输出写入log文件。

maxthreads = 300 #指定同步时最大线程数。

#repeat = 1 #表示间隔1秒后开始一次新的同步检查

#retry = 3 #指定失败重试次数

#path = www

#同步指定的子目录及文件,而非整个目录。可以写多个path,如在下面再写一个path = wwwbak。

#ignore = Path WEB-INF/tmp

#忽略/wwwroot下面的WEB-INF/tmp目录,即同步时不同步它。注意,这里是”Path”,而不是”path”。

 

[root@vm4 tmp]# cat /tmp/watch.sh

#!/bin/bash

src=/tmp/www.91town.xxx/

#inotifywait -mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w%f%e ‘ -e close_write,delete,create,attrib $src |while read files

inotifywait -mrq -e close_write,delete,create,attrib $src |while read files

do

unison

echo “$files” >> /tmp/sh.unison.log

echo `date | cut -d ” ” -f1-4` >> /tmp/inotify.log

done

 



(责任编辑:IT)