实时同步应用描述如下:
A机器为更新的文件,需要实时同步到线上环境上的应用服务器B上面,因此这里需要用inotify实时检查A机器上文件修改状态,如果有更新,则立刻触发rsync进行同步。
B机器作为rsync服务,A为rsync客户端,客户端向服务器传送最新数据。
A:192.168.0.201 数据文件目录为/root/web1
B:192.168.0.202
B机器的rsync配置如下:
- uid = nobody
- gid = nobody
- use chroot = no
- max connections = 10
- strict modes = yes
- pid file = /var/run/rsyncd.pid
- lock file = /var/run/rsync.lock
- log file = /var/log/rsyncd.log
- [rhel02_web]
- path = /var/www/html
- comment = rhel02_web file
- ignore errors
- read only = no
- write only = no
- list = false
- uid = root
- gid = root
- auth users = webuser
- secrets file = /var/www/webuser.pass
其中,rhel02_web为模块,为避免客户端同步文件的时候,输入密码验证,这里用auth users选项和secrets file分别制定模块的用户名和密码文件,其中用户名为自定义名字,和Linux操作系统的用户无关,密码文件则为用户名和密码,都为明文,格式如下:
user:password
密码文件其他用户不能有任何权限,因此这里需要把密码文件权限设置为600
A机器只需要安装了rsync即可用命令进行手动同步数据:
rsync -vzrtopg --delete --progress --password-file=/var/www/webuser.pass /root/web1 webuser@192.168.0.202::rhel02_web
A机器的密码文件也为明文,内容仅仅是user的密码,权限也为600
如果要A机器更新文件时,自动实时同步文件到B,则需要使用inotify来实现,命令如下:
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %e %w%f' -e close_write,delete,create,attrib /root/web1/
命令执行后会挂起,如果/root/web1目录下有文件修改更新,则会输出--format制定格式的输出信息:
14/09/12 22:41 CLOSE_WRITE,CLOSE /root/web1/index.html
这里使用一个脚本auto_rsync.sh,来联合inotifywait和rsync来达到自动同步文件的目的:
- #! /bin/sh
- webserver_host=192.168.0.202
- src=/root/web1
- user_pass=/var/www/webuser.pass
- dst_mod=rhel02_web
- user=webuser
- /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %e %w%f' -e close_write,delete,create,attrib $src |
- while read files_format
- do
- /usr/bin/rsync -vzrtopg --delete --progress --password-file=${user_pass} $src ${user}@${webserver_host}::${dst_mod}
- echo "${files_format} rsyncd ok" >> /tmp/rsync.log 2>&1
- done
以上脚步的功能为inotifywait检查文件更新状态,如果有更新,则打印一条消息,并把消息送给while循环,从而执行循环里面的rsync同步操作。
整个环境配置完毕后,启动B机器的rsync服务,后台执行脚本即可
nohup ./auto_rsync.sh &
测试:更新A机器的文件,B机器的文件也被更新。