rsync+inotify实现文件实时同步

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上安装rsyncinotify+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目录下回同时创建相同的文件,此时说明服务正常运行。

你可能感兴趣的:(linux,rsync,inotify,实时同步)