inotify+rsync实现双向自动同步文件,这个在实验是由于本人所在公司一项业务需要实现双向同步,inotify+rsync的大多数配置都是单向实施的,这个双向实验经过验证是可行的,对于没有共享存储的但是又需要实现数据双向一致性的场景还是比较实用的。


Inotify+rsync实现双向同步实验

机器地址:192.168.14.202

          192.168.14.203


目录为/var/www/html/web202和/var/www/html/web203目录的所有者和所属组为rsync


用户为:rsync


部署步骤:


1、 在202上建立rsync服务器配置文件

[root@S202 ~]# vim /etc/rsyncd.conf

 

uid = nobody

gid = nobody

use chroot = no

max connections = 200

timeout = 60

strict modes = yes

log file = /var/log/rsyncd.log

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log format = %t %a %m %f %b

[web202]

path = /var/www/html/wwwlvyecn/web202

ignore errors

read only = no

write only = no

list = false

gid = rsync

uid = rsync

hosts allow = 192.168.14.203

auth users = rsync

secretsfile = /etc/rsyncd.passwd

 

配置文件参数说明:

Uid:此选项用于指定该模块传输文件时守护进程具有的用户ID默认是nobody

Gid:此选项用于指定该模块传输文件时守护进程具有的用户组ID默认是nobody

Maxconnections:指定最大的并发连接数,以包括服务器。超过限制的请求将被暂时限制,默认值为0 ,没有限制

Strictmodes:此选项用于指定是否检查口令文件的权限,yes为检查,反之为no,如果设置为yes,密码文件的权限必须为root用户的权限

[web202]:表示定义一个模块的开始,web202就是对应模块的名称

Path:用于指定需要备份的文件和目录。

Ignoreerror:表示可以忽略一些I/O错误

Read  only:设置为no 表示客户端可以上传文件,设置为yes表示只读

Write  only:设置为no表示客户端可以下载文件,设置为yes表示不能下载文件

Hosts  allow:设置可以连接rsync服务器的主机

Hostsdeny:设置禁止连接服务器的主机

List:设定当客户请求可以使用的模块列表是,该模块是否被列出,默认是true,如果需要建立隐藏的模块,可以设置为false

Vauth users:用来定义可以连接该模块的用户名,多个用户以空格或者逗号分隔开。需要注意的是,这里的用户和linux系统用户没有任何关系,这里指定的用户是backup

Secrets file:指定一个包含”用户名:密码”格式的文件,用户名就是auth users选项定义的用户,密码可以随便指定


2、 建立用户和密码文件

[root@S202 ~]#echo “rsync:network”>/etc/rsyncd.passwd

[root@S202 ~]#chmod 600 /etc/rsyncd.passwd


3、 启动rsync服务器

[root@S202 ~]#rsync –daemon

4、 在203上安装inotify-tools工具包,并编写脚本如下:

[root@203 ~]# vim /etc/rsync-bak.sh

 

#!/bin/sh

#create time 2014/11/20

Host=192.168.14.203

SRC=/var/www/html/web203

DES=web202

USER=rsync

/usr/bin/inotifywait -mrq –timefmt '%d/%m/%y%H:%M'  --format '%T %w%f%e'   -e  create,move,modify,attrib $SRC | while read files

       do

rsync -auzq --exclude "p_w_upload"--password-file=/etc/rsyncd.passwd  $SRC$USER@$Host::$DES

        echo "${files} was rsynced">>/tmp/rsync.log 2>&1

 

脚本说明:


在使用inotify是时候可能需要调整的系统参数:

/proc/sys/fs/inotify/max_user_watches:表示每个inotify实例相关联的watches的上线,也就是inotify实例可以监控的最大目录数量

 

/proc/sys/fs/inotify/max_user_instances:每个real ID可以创建的inotify instances数量的上线

 

/proc/sys/fs/inotify/max_queued_events:在调用inotify_init时分配到inotify instances中可排队的event数的最大值,超过这个值的时间被丢弃

 

Inotifywait:

-m:即”monitor”,表示始终将保持事件监听状态

-r:即”recuresive”,表示递归查询目录

-q:即”quit”,表示打印出监控事件

-e:即”event”

--timefmt :指定时间的输出格式

--format:指定变化文件的详细信息

有时候会遇到这样的情况,向监控目录中写入一个很大的文件,当写入这个文件需要一段时间,inotify会持续不断的输出该文件被更新的信息,这样就会不断的触发rsync执行同步操作,占用大量的系统资源,针对这种情况,最理想的做法是等待文件写完后再触发rsync同步,这种情况下,可以修改inotify的监控时间即”-e close_write,delete,create,attrib”

        

 

Rsync:

         z:表示压缩

         r:表示递归

         t:用来保持文件时间信息

         o:用来保持文件属主信息

         p:用来保持文件权限

         g:用来保持文件的属组信息

         --exclude:用来拍出不需要传输的目录或文件

         --delete:制定以rsync服务器为基准进行数据进项同步,也就是要保持rsync服务器目录和客户端目录完全一样,谨慎使用。

         a:等于rlptgoD的集合

 

5、 建立密码文件

[root@203 ~]# echo “network”>/etc/rsyncd.passwd

[root@S203 ~]#chmod 600 /etc/rsyncd.passwd


6、 启动脚本


[root@S203~]#nohup sh /etc/rsync-bak.sh &

 

  以上步骤实施完成后,单项同步及完成,把以上步骤再在202和203上反向部署一次就可以得到双向同步