一、rsync介绍:
rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来--remote sync。

特性:
可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。
安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。

二、inotify介绍:
inotify可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。

inotify可以监视的文件系统常见事件包括:
IN_ACCESS:文件被访问
IN_MODIFY:文件被修改
IN_ATTRIB,文件属性被修改
IN_CLOSE_WRITE,以可写方式打开的文件被关闭
IN_CLOSE_NOWRITE,以不可写方式打开的文件被关闭
IN_OPEN,文件被打开
IN_MOVED_FROM,文件被移出监控的目录
IN_MOVED_TO,文件被移入监控着的目录
IN_CREATE,在监控的目录中新建文件或子目录
IN_DELETE,文件或目录被删除
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己

三、inotify-tools
    inotify是一个API,需要通过开发应用程序进行调用,对于大多数用户来讲这有着许多不便,inotify-tools的出现弥补了这一不足。inotify-tools是一套组件,它包括一个C库和几个命令行工具,这些命令行工具可用于通过命令行或脚本对某文件系统的事件进行监控。

inotify-tools提供的两个命令行工具:
    inotifywait:通过inotify API等待被监控文件上的相应事件并返回监控结果,默认情况下,正常的结果返回至标准输出,诊断类的信息则返回至标准错误输出。它可以在监控到对应监控对象上指定的事件后退出,也可以进行持续性的监控。
    inotifywatch:通过inotify API收集被监控文件或目录的相关事件并输出统计信息。

inotifywait命令使用简介:
    inotifywait尤其适用于在脚本中等待某事件的发生,并可基于特定的事件执行相应操作。如将其用于脚本中监控某指定目录中的文件上的修改、新建、删除、属性信息的改变,而后使用rsync命令将某事件对应的文件同步至其它主机上。其常用选项如下
-m, --monitor:inotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而使用此选项则可实现持续性的监控;
-r, --recursive:递归监控指定目录下的所有文件,包括新建的文件或子目录;如果要监控的目录中文件数量巨大,则通常需要修改/proc/sys/fs/inotify/max_users_watchs内核参数,因为其默认值为8192。
-e <event>, --event<event>:指定要监控的特定事件,默认是监控所有的事件;此处<event>包括access, modify, attrib,close_write, close_nowirte, close, open, moved_to, moved_from, move, create,delete, delete_selt等;
--timefmt <fmt>:当在--format选项中使用%T时,--timefrt选项则可以用来指定自定义的符合strftime规范的时间格式,此时间格式可用的格式符可以通过strftime的手册页获取;--timefrt后常用的参数是'%d/%m/%y %H:%M';
--format <fmt>:自定义inotifywait的输出格式,如--format '%T %w %f';常用的格式符如下:
%w:显示被监控文件的文件名;
%f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;
%T:使用--timefmt选项中自定义的时间格式。

四,基本原理图

wKiom1P6gIaAK3KEAAC2G3HWuwQ234.png

rysnc服务器端的配置

我们需要手动创建 rsync 的配置文件 

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

uid = root

gid = root

use chroot = no

max connections = 20

timeout = 600

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

[web_log]

path = /data/web_log/

ignore errors

read only = false

list = false

hosts allow = 222.35.91.0/24

hosts deny = 0.0.0.0/32

auth users = backuser

secrets file = /etc/rsync.password

#_________________

3.    建立 rsync 用户名和密码文件

[root@Web1 ~]#  echo "backuser:123" >> /etc/rsync.password

/opt/tomcat_gw/webapps/

4.    为 /etc/rsync.password 授权为 600(这个文件的权限必须是 600)

[root@Web1 ~]# chmod -R 600 /etc/rsync.password

 到此,服务器端配置完成

客户端的配置如下:

1.    设置 rsync 客户端的密码文件,客户端只需要设置 rsync 同步的密码即可,不用设置用户名

[root@Web2 ~]#echo "123" > /etc/rsync.password

 2.  将密码文件的权限设置成 600(这个文件的权限必须是 600)

[root@Web2 ~]#chmod -R 600 /etc/rsync.password

 三、配置 Inotify(在 web2上配置)

1.       安装 inotify 软件包

 2.       为了保证 .mnt 目录被自动同步,配置好web2 的 inotify 后,写一个 inotify 的监控脚本,内容如下:

wKiom1P8KFyR4zS6AAA-_GuqJ_g560.png

 脚本相关解释如下:

--timefmt:

指定时间的输出格式。

--format:

指定变化文件的详细信息。

这个脚本的作用就是通过Inotify监控文件目录的变化,进而触发rsync进行同步操作。由于这个过程是一种主动触发操作,是通过系统内核完成的,所以,比起那些遍历整个目录的扫描方式来,效率要高很多。

然后我们将此脚本放入后台运行,输入如下命令即可:

Sh /root/rsync.sh&