inotifywait+rsync做实时服务器文件同步(程序流写入可以用,例如java创建文件等)

inotifywait 异步文件系统监控机制
Inotify 一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。
inotify-tools 是一个C库和一组命令行的工作提供Linux下inotify的简单接口。inotify-tools安装后会得到inotifywait和inotifywatch这两条命令:
inotifywait命令 可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools,这个命令还需要将inotify支持编译入Linux内核,好在大多数Linux发行版都在内核中启用了inotify。
inotifywatch命令 用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
开始之前需要检测系统内核是否支持inotify:
使用uname -r命令检查Linux内核,如果低于2.6.13,就需要重新编译内核加入inotify的支持。

uname -r
3.10.0-693.el7.x86_64

使用ll /proc/sys/fs/inotify命令,是否有以下三条信息输出,如果没有表示不支持。

ll /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Jan  4 15:41 max_queued_events
-rw-r--r-- 1 root root 0 Jan  4 15:41 max_user_instances
-rw-r--r-- 1 root root 0 Jan  4 15:41 max_user_watches

安装
master机需要装inotifywait和rsync,从机只需要安装rsync。也建议都安装,可以随时切换主从
安装 inotify-tools,以下提供两种方法
一、

yum install -y inotify-tools

二、
noitify下载
下载好之后,放到对应的服务器中,解压

tar -zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make
make install

安装rsync
rsync下载

tar zxvf rsync-3.1.3.tar.gz
cd rsync-3.1.3
./configure --prefix=/usr/local/rsync/
make && make install

完成安装

同步配置

host ip status kernel bit file
A 192.168.0.1 master x86_64 64 /data
B 192.168.0.2 slave x86_64 64 /data

主服务器A:
建立密码认证文件

[root@A rsync-3.0.9]# cd /usr/local/rsync/
[root@A rsync]# echo "rsync-pwd" >/usr/local/rsync/rsync.pwd 

其中rsync-pwd可以自己设置密码,rsync.pwd 名字也可以自己设置
[root@nginx rsync]# chmod 600 rsync.pwd

无论是为了安全,还是为了避免出现以下错误,密码文件都需要给600权限

创建rsync复制脚本 此项功能主要是将master端的目录/data里的内容,如果修改了(无论是添加、修改、删除、移动、写入关闭等操作)能够通过inotify监控到,并通过rsync实时的同步给client的对应的文件夹里,下面是通过shell脚本实现的。

#!/bin/bash
host=192.168.0.2
# 被监控的目录以及递归的目录和文件,但是不可以直接写某个具体的文件
srcFiles=/data 
# 目的 
desFiles=datafile 
# 下面配置的作用是监控目录的任何变化,然后同步到目的地 webuser是用户名
user=webuser  
#inotifywait参数 modify 修改,delete 删除,create 创建,attrib 修改元数据,move 移动(移入目录不算),close_write(关闭写,如果用流写入文件,比如用程序创建的文件等,需要加上这个。之前试过不加这个监听不到流写入动作)
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib,move,close_write $srcFiles \
| while read files
do
sleep 5
# --password-file 指定密码文件
rsync -va --delete --progress --password-file=/usr/local/rsync/rsync.pwd $srcFiles $user@$host::$desFiles
echo "${files} was rsynced" >> /logs/rsynclogs/rsyncJobs.log 2>&1 
 # 把同步文件的简要信息放在这里,大部分信息存在/data/rsynclogs/rc.local.log里
done

read的用法
注意如果把rsync.log的放到/data(备份的目录)就会发送一直复制的问题,所以建议各位吧rsync的日志放到其他的目录下(非备份目录)。这里我是放到了 /logs/rsynclogs/ 下。
其中host是slave的ip,srcFiles是master端要实时监控的目录,desFiles是认证的模块名,需要与slave一致,user是建立密码文件里的认证用户。
把这个脚本命名为rsyncFiles.sh,放到了/usr/local/rsync/目录下,并给予764权限(注意:这里需要备份服务器client已经安装了rsync之后才能启动,否则出现以下错误。)

rsync: failed to connect to 192.168.0.2: Connection refused (111) 
rsync error: error in socket IO (code 10) at clientserver.c(107) [sender=2.6.8] 

以下是执行脚本

cd /usr/local/rsync/
chmod 764 rsyncFiles.sh
./rsyncFiles.sh

我们还可以把rsync.sh脚本加入到开机启动项里

echo "/usr/local/rsync/rsyncFiles.sh" >> /etc/rc.local

备机

同上安装rsync
进入

[root@B rsyn]# cd /usr/local/rsync/
[root@B rsync]# echo "webuser:rsync-pwd" > /usr/local/rsync/rsync.passwd

请记住,在master端建立的密码文件,只有密码,没有用户名;而在备份服务端slave里建立的密码文件,用户名与密码都有。 (这里的用户名就是master中脚本里的用户名webuser,两机密码保持一致)

[root@B rsyn]# chmod 600 rsync.passwd

需要给密码文件600权限
建立rsync配置文件

# 决定被同步的文件到服务器A上的用户
uid=root  
# 决定被同步的文件到服务器A上的用户组
gid=root  
use chroot=no
max connections=10
strict modes=yes
# 有的时候启动不了,是因为kill -9后,pid文件还存在。自动生成
pid file=/usr/local/rsync/rsyncd.pid 
# 有的时候新增加的目录或者修改的配置不生效,是因为这个配置文件没有更新,可以删除下,它会自动生成
lock file=/usr/local/rsync/rsyncd.lock  
# 服务器B的rsync服务日志;自动生成
log file=/usr/local/rsync/rsyncd.log  

# *********************slave机需要的配置 ****************
# 认证的模块名
[datafile]  
# 服务器A的同步目录对应的服务器B上的位置,不需要与服务器A一致。
# 比如我这里设置的是/data1 服务器A上是/data 此时A中的/data 就拷贝到了 B的/data1下
path=/data1
comment=web file
ignore errors
read only=no
write only=no
# 允许连接的host,服务器A的地址
hosts allow= 192.168.0.1
hosts deny=*
list=false
uid=root
gid=root
auth users=webuser
secrets file=/usr/local/rsync/rsync.pwd

其中datafile是master服务端里的认证模块名称,需要与主服务器里的一致
把配置文件命名为rsync.conf,放到/usr/local/rsync/目录里
(master机的rsync也按照从机安装,配置文件去掉slave机需要的配置即可)

启动rsync

[root@B rsyn]# /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf

我们可以把rsync脚本加入到开机启动项里

[root@B rsyn]# echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf" >> /etc/rc.local

现在rsync与inotify在master端安装完成,rsync在备份服务器slave端也安装完成

这时候从机的rsync已经打开了。去主机启动rsync,并执行之前的同步脚本rsyncFiles.sh,开启监听。
第一次不会主动复制,只要有文件变动即开始复制操作。可以查看对应的日志文件看监听和复制的过程

参考:https://www.cnblogs.com/shengulong/p/6760605.html

上一篇:php如何正确使用inotify实例进行dir监控


下一篇:linux – 使用inotifywait监控一系列事件