Ubuntu下配置rsync+inotify-tools实现文件实时同步

契机:
为了做一套基于nginx的反向代理兼负载均衡服务器,我准备了三台服务器,部署成功后发现一个问题:每台反向代理服务器都要负责解析服务器下的PHP代码,如果一台服务器上的网站代码更新了,为保持一致性代码也要同步到另外一台服务器上面。为了同步数据每天去手动检测文件是否发生更改实在是很麻烦的事情,这样做也不符合运维工程师的思想,即尽可能的自动化处理问题。
于是开始着手部署通过rsync同步数据,因为同步必须要能实时处理,即有任何变更都必须立刻同步,所以还需要一个程序负责监控文件的变化,于是找到了inotify-tools。

软件介绍:
rsync是Unix下的一款应用软件,它能同步更新两处计算机的文件与目录,并适当利用差分编码以减少数据传输。rsync可拷贝/显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。
inotify-tools是一款监控软件,它可以监控指定目录下文件资料,如果文件放生增加、删除、修改、甚至文件权限变更时,都可以利用此程序发送相关报告到相应的日志记录中。
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)
注:上面所说的文件也包括目录。

设计思路:
在A服务器上开放文件传输端口(FTP或者SCP),并对A服务器上面的文件变化进行监控,当A服务器上面有文件传输进来时,监控程序检测发生变化的文件,并调用A服务器的同步程序向B服务器同步数据,B服务器常驻同步程序的守护进程,当检测到有同步请求时则通过B服务器的同步程序在B服务器上同步数据,从而完成整个数据同步过程。

部署情况:
服务器编号                              A                             B
IP地址                           192.168.1.248         192.168.1.249
rsyncd.pass内容              password_b              user:password
安装软件                    rsync + inotify-tools           rsync
文件更新方式                    远程上传                  数据同步

实现方法:
配置服务器B:
首先在B服务器上面安装rsync同步软件:

sudo apt-get install rsync

然后要使得rsync可以以守护进程方式启动,编辑/etc/default/rsync文件,修改RSYNC_ENABLE=true:

vim /etc/default/rsync

守护进程需要调用配置文件来预先加载相关信息参数,文件默认为/etc/rsyncd.conf,但是软件安装后没有这个文件,不过我们可以从/usr/share/doc/rsync/examples/rsyncd.conf复制一份到/etc/rsyncd.conf。

sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/rsyncd.conf

然后在rsyncd.conf文件中添加下面的代码,并且为了可以防止同步的时候要求密码,我们指定密码文件路径,以便在运行程序时可自动加载密码:

建立并编辑密码文件,然后修改密码文件的权限:

sudo echo -ne user:password > /etc/rsyncd.pass
sudo chmod 600 /etc/rsyncd.pass

我们现在启动rsync服务:

sudo service rsync restart

好了,执行ps -aux | grep rsync来查看一下软件运行情况:

可以看出来软件已经以守护进程方式在后台运行了,并且还预加载了我们定义好的rsyncd.conf文件。
下面我们需要建立同步数据所需要的文件夹,并对文件夹授权:

sudo mkdir /data
sudo chown -R webuser:webuser /data

到这里,服务器B的配置就算完成了。

配置服务器A:
首先在服务器A上面安装软件:

sudo apt-get install rsync inotify-tools

建立rsync运行所需要的密码文件,并更改运行权限:

sudo echo -ne password > /etc/rsyncd.pass
chmod 600 /etc/rsyncd.pass

在/usr/bin/下面编辑脚本文件,使得inotify-tool检测到文件变化后可以自动运行rsync程序:

sudo touch /usr/bin/inotify2rsync
sudo vim /usr/bin/inotify2rsync

sudo chmod 755 /usr/bin/inotify2rsync

将脚本添加到开机加载文件中:

sudo vim /etc/rc.local

同样建立同步数据所需要的文件夹,并对文件夹授权:

sudo mkdir /data
sudo chown -R webuser:webuser /data

重启A服务器,完成配置。

测试:
在A服务器的/data文件夹中添加文件或者文件夹,看看B服务器上面的data文件夹是否发生改变。

link:
http://www.fkblog.org/blog795


Comments are closed.