简介
在日常运维中,我们可能会碰到需要部分需要文件同步。使用较多的就是rsync,这里不过多介绍,rsync提供了 使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,尤其是需要用到增量备份以及需要保留原文件权限的时候。使用较多的场景是搭配定时任务使用,定时备份增量文件。但是由于rsync每次同步都是轮询的机制,需要遍历同步目录的所有文件,故需要消耗大量的时间以及资源,所以这里我们介绍下可以搭配使用的工作-inotify。Inotify是一种细粒度的,异步的文件系统事件监控机制,linux内核从2.6.13起,加入了 Inotify支持,通过Inotify的配置,可以监控文件系统中添加、删除,修改、移动等各种事件,利用这个接口,就可以搭配rsync做到文件系统的实时同步。
正文
一、inotify的简单介绍
1、inotify的安装
yum install -y inotify-tools,使用epel源。或者使用源码安装
2、inotify主要安装的两个软件
inotifywait: (主要)
在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用
inotifywatch:
收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。
说明:在实时实时同步的时候,主要是利用inotifywait对目录进行监控
3、inotifywait命令参数说明,可以命令inotifywait --help查看
4、-e[参数] 可以指定的事件类型
二、实现inotify监控文件目录并实现开机自启,这里例如我们需要监控/Logdata目录下的时间,可以用以下脚本实现
创建/etc/init.d/inotify.sh
/usr/bin/inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e delete.create,close_write /Logdata --daemon -o /opt/log_inotify.log //后台执行,监控/Logdata 目录,输出结果到/opt/log_inotify.log文件,包括创建文件,删除文件,文件或目录关闭事件
chkconfig --add inotify.sh //加入到开机自启
chkconfig inotify.sh on //开启开机自启
这样在执行/etc/init.d/inotify.sh脚本后,所有的被监控时间都会被记录到/opt/log_inotify.log文件
实现效果:
三、配置rsync+inotify实现实时同步数据
1、配置rsync服务端配置文件
rsync服务端配置文件
log file = /var/log/rsyncd.log
pidfile = /var/run/rsyncd.pid # pid文件的存放位置
lock file = /var/run/rsync.lock # 支持max connections参数的锁文件
secrets file = /etc/rsync.password # 用户认证配置文件,里面保存用户名称和密码
[rsync_from_client] # 自定义同步名称
path = /attachment/ # rsync服务端数据存放路径,客户端的数据将同步至此目录
uid = root # 设置rsync运行权限为root
gid = root # 设置rsync运行权限为root
port = 873 # 默认端口
ignore errors # 表示出现错误忽略错误
use chroot = no # 默认为true,修改为no,增加对目录文件软连接的备份
read only = no # 设置rsync服务端为读写权限
list = no # 不显示rsync服务端资源列表
max connections = 200 # 最大连接数
timeout = 600 # 设置超时时间
auth users = admin # 执行数据同步的用户名,可以设置多个
/etc/rsync.password 密码文件,权限通常设置600
admin:123456
2、配置rsync客户端
/etc/rsync.password ,密码文件
123456
编写inotify+rsync同步脚本,让脚本自动检测我们同步的目录。这里重点说明下,使用inotify来进行同步很大部分原因是为了减少rsync每次同步都需要遍历整个需同步的目录所需要占用的时间以及服务器性能资源。如果只是让inotify检测到有需要同步的文件就进行一次整个目录的同步,消耗的资源是没有减少的,所以我们需要的是使用rsync只同步我们所修改的过的文件或者目录,这样来就会大幅度降低遍历带来的资源消耗。
3、编写同步脚本
cat /rsync_inotify.sh
#!/bin/bash
host=目标服务器的ip #备份服务器ip
src=/attachment/ #需要监控的目录
des=rsync_from_client #自定义模块名,需要与目标服务器定义的模块名保持一致
password=/etc/password
user=admin
inotify=/usr/bin/inotifywait
$inotifywait -mrq --format "%w%f" -e create,delete,close_write$src |while read files;do
if [ -f ${files} ];then
rsync -avP --delete --timeout=300 --password-file=${password} $files $user@$host::$des #while read语句,当监控目录有文件增删改的时候,inotify的输出是read的输入参数,并将变化的文件传递到files变量,rsync只同步这个$files
else
rsync -avP --delete --password-files=${password} $src $user@$host::$des
fi
done
后台执行脚本
hohup bash /rsync_inotify.sh >/tmp/rsync.log 2>&1 &
进行测试验证
执行for i in {1..10};do touch $i.txt;done
tail -f /tmp/rsync.log,可以实时看到具体的传输文件,表示同步已生效