rsync+inotify实现文件实时同步
关于rsync,在我个人理解中,这个命令在使用时和scp很像,因为这两个命令在使用时的格式大体相同。所以在记忆的时候可以类比scp命令来记忆。
rsync最大的好处是可以进行差量传输文件,不是机械性的拷贝过去,这一点使得rsync在传输过程中的效率要高于scp。之所以能够实现差量传输,是因为rsync在传输前要扫描所有文件后进行比对,这一点是其优点,但也是其短板所在,当文件系统中文件数量非常庞大的时候,rsync的效率就会下降,故而在文件系统十分庞大的时候是不建议使用rsync的。而且,rsync不支持实时监测、同步文件系统的变化,这也是rsync的一个不足之处。
在linux中,inotify可以很好的弥补rsync实时同步的短板。Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
inotify可以监控文件系统的各种变化,搭配rsync使用时,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。
rsync命令:
rsync+SSH安全同步 下行:rsync [选项]user@host:源目录 本地目录 上行:rsync [选项] 本地目录 user@host:目标目录 rsync+rsync同步[服务端默认端口873] 下行:rsync [选项]user@host::共享名 本地目录 上行:rsync [选项] 本地目录 user@host::共享名
常用选项:
-a:归档模式,相当于-rlptgoD -v:显示同步过程详细信息 -z:传输过程中启用压缩 -H:保留硬连接文件 -A:保留文件的ACL属性信息 --delete:删除目标有而源没有的文件 --checksum:根据校验和来决定是否要同步 --password-file=:指定认证口令文件 -a= rlptgoD -r:递归,包括目录/子目录及所有文件 -l:保留符号链接文件 -p、-t:保留文件的权限、时间标记 -o、-g:保留文件的属主/属组标记 -D:保留设备文件及其他特殊文件
inotify命令:
inotifywait[-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
选项:
-h,�Chelp:输出帮助信息 @:排除不需要监视的文件,可以是相对路径,也可以是绝对路径。 �Cfromfile:从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。 -m, �Cmonitor:接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。 -d, �Cdaemon:跟�Cmonitor一样,除了是在后台运行,需要指定�Coutfile把事情输出到一个文件。也意味着使用了�Csyslog。 -o, �Coutfile:输出事情到一个文件而不是标准输出。 -s, �Csyslog:输出错误信息到系统日志 -r, �Crecursive:监视一个目录下的所有子目录。 -q, �Cquiet:指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。 �Cexclude:正则匹配需要排除的文件,大小写敏感。 �Cexcludei:正则匹配需要排除的文件,忽略大小写。 -t , �Ctimeout:设置超时时间,如果为0,则无限期地执行下去。 -e , �Cevent:指定监视的事件。 -c, �Ccsv:输出csv格式。 �Ctimefmt:指定时间格式,用于�Cformat选项中的%T格式。 �Cformat:指定输出格式。 %w 表示发生事件的目录 %f 表示发生事件的文件 %e 表示发生的事件 %Xe 事件以“X”分隔 %T 使用由�Ctimefmt定义的时间格式
inotifywait可监听事件
access 文件读取
modify 文件更改。
attrib 文件属性更改,如权限,时间戳等。
close_write 以可写模式打开的文件被关闭,不代表此文件一定已经写入数据。
close_nowrite 以只读模式打开的文件被关闭。
close 文件被关闭,不管它是如何打开的。
open 文件打开。
moved_to 一个文件或目录移动到监听的目录,即使是在同一目录内移动,此事件也触发。
moved_from 一个文件或目录移出监听的目录,即使是在同一目录内移动,此事件也触发。
move 包括moved_to和 moved_from
move_self 文件或目录被移除,之后不再监听此文件或目录。
create 文件或目录创建
delete 文件或目录删除
delete_self 文件或目录移除,之后不再监听此文件或目录
unmount 文件系统取消挂载,之后不再监听此文件系统。
使用rsync+inotify实现对文件实时同步功能时,需要清楚,这个组合搭配是用inotify-tools工具监视文件系统的变化,然后再使用rsync将变化的文件传递给其目标主机。
在这个过程中,我们需要将文件发生变化的服务器端配置成为rsync客户端和inotify服务端。相反,在目标文件存储主机端我们要配置成为rsync服务器端。这一过程有点绕,需要理清思路。
在本文中,主机10.60.77.159是作为一台存储服务器,当主机10.60.77.210上的文件有变化的时候,要实时同步到存储服务器。所以,要在主机10.60.77.159上配置rsync服务端,要在主机10.60.77.210上安装rsync和inotify+tools,并且使用脚本实时监控目标目录。
以下是具体配置过程,主机10.60.77.159上的配置:
1、下载安装rsync
[root@10-60-77-159-static1~]# wget http://rsync.samba.org/ftp/rsync/rsync-3.1.1.tar.gz [root@10-60-77-159-static1~]# tar -zxf rsync-3.1.1.tar.gz -C /usr/src/ [root@10-60-77-159-static1~]# cd /usr/src/rsync-3.1.1/ [[email protected]]# ./configure --prefix=/usr/local/rsync/ [[email protected]]# make && make install
2、准备rsync配置文件,此文件一般不存在,需要手动创建。
[root@10-60-77-159-static1 ~]# cat/etc/rsyncd.conf uid = root //进程uid gid = root //进程gid use chroot = no //不使用chroot log file = /var/log/rsyncd.log //日志文件位置 pid file = /var/run/rsyncd.pid //pid文件位置 [tiup] //共享名 path = /tiup //共享文件路径 read only = no //非只读,可写入 comment = rsync share auth users = rsync //认证用户名 secrets file = /etc/rsyncd.pas //认证密码文件
3、准备认证密码文件并修改该文件权限为600
[root@10-60-77-159-static1 ~]# cat/etc/rsyncd.pas rsync:monokeros //此文件格式为“用户名:密码” [root@10-60-77-159-static1 ~]# chmod 600/etc/rsyncd.pas
注意:密码认证文件权限必须为600。
4、使用守护进程的方式启动rsync服务
[root@10-60-77-159-static1 ~]#/usr/local/rsync/bin/rsync --daemon [root@10-60-77-159-static1 ~]# netstat-tnlup | grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 13186/rsync tcp 0 0 :::873 :::* LISTEN 13186/rsync
rsync服务默认监听873端口。
配置主机10.60.77.210:
1、安装rsync服务
步骤同前
2、安装inotify-tools
[root@10-60-77-210-static2~]# wget http://nchc.dl.sourceforge.net/project/inotify-tools/ inotify-tools/3.13/inotify-tools-3.13.tar.gz [root@10-60-77-210-static2~]# tar -zxf inotify-tools-3.13.tar.gz -C /usr/src/ [[email protected]]# cd ../inotify-tools-3.13/ [[email protected]]# ./configure --prefix=/usr/local/inotify-tools/ [[email protected]]# make && make install
3、准备rsync密码认证文件并设置权限为600
[root@10-60-77-210-static2 ~]# cat/etc/rsyncd.pas monokeros [root@10-60-77-210-static2 ~]# chmod 600/etc/rsyncd.pas
注意:此文件权限也要设置为600,而且文件中不需要写用户名,只需要写认证密码即可。rsync客户端不需要准备rsyncd.conf配置文件,只要安装了rsync服务即可。
4、准备inotify监控脚本
[root@10-60-77-210-static2 ~]# catinotify.sh #!/bin/bash host=10.60.77.159 src=/tiup/ dst1=tiup user1=rsync /usr/local/inotify-tools/bin/inotifywait-mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files do /usr/local/rsync/bin/rsync -az --delete--password-file\=/etc/rsyncd.pas $src $user1@$host::$dst1 echo "${files} was rsynced">>/tmp/rsync.log 2>&1 done
5、运行脚本,该脚本运行后会保持监听状态,可以将其置入后台运行。
可以将该脚本设置开机自动启动,将运行脚本的命令写入/etc/rc.d/rc.local文件中
[root@10-60-77-210-storage2 ~]# cat /etc/rc.d/rc.local #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local sh /root/inotify.sh &
6、测试
在主机10.60.77.210上,进入/tiup目录,创建文件,可以看到,在主机10.60.77.159上的/tiup目录下回同时创建相同的文件,此时说明服务正常运行。