RSYNC+inotify实时同步文件

本文介绍如何利用Linux的Inotify特性和Rsync工具实现文件系统的实时监控和数据同步。通过安装配置inotify-tools和rsync,编写shell脚本来监听文件变化,并自动触发rsync命令进行数据同步,适用于服务器间的数据实时更新。

Inotify简介
Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。
Inotify,它是在内核 2.6.13 版本中引入的一个新功能,它为用户态监视文件系统的变化提供了强大的支持,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。
在inotify 的前身是 dnotify。由于 dnotify 的局限性太大,加之用户始终都希望用到更好的产品。因此,inotify 顺理成章的取代了 dnotify。
Rsync安装完毕后,需要安装inotify文件检查软件。同时为了同步的时候不需要输入密码,这样可以使用ssh免密钥方式进行同步。

Rsync认证方式
两种方式
rsync-daemon
ssh
注意:在使用rsync时,同步端和被同步端都必须安装rsync程序。

1)rsync-daemon认证
在rsync-daemon认证方式下,默认监听tcp的873端口
在rsync-daemon认证下,rsync可以把密码写入到一个文件中。
注意:被同步端的rsync必须启动,配置文件。同步端可以不起动服务,但必须有这个应用。

2)ssh认证
通过ssh隧道进行传输,类似于scp工具,同步操作不在局限于rsync中定义的同步文件夹,并且双方只要安装rsync,也不要双方启动rsync。
Rsync安装配置参考我另一篇文章:https://blog.youkuaiyun.com/tangbin0505/article/details/101451856
这里采用Rsync基于SSH认证方式+inotify实时同步

服务端IP:192.168.42.8

客户端IP:192.168.42.9

inotify安装配置

1)下载配置环境,下载inotify-tools安装包

[root@rsync-servser ~]# yum install wget -y

[root@rsync-servser ~]# yum install gcc

[root@rsync-servser ~]# wget -c http://mirrors.yangxingzhen.com/inotify-tools/inotify-tools-3.14.tar.gz

2)解压,安装

[root@rsync-servser ~]# tar -zxf inotify-tools-3.14.tar.gz 
[root@rsync-servser ~]# cd inotify-tools-3.14

[root@rsync-servser inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify

[root@rsync-servser inotify-tools-3.14]# make && make install

3)配置免密钥认证,这里不再介绍,SSH免密钥认证可以参考我另一篇文章:SSH免密钥认证

4)编写脚本

[root@rsync-servser ~]# vim rsync_inotify.sh

#!/bin/sh
#add for chkconfig
#chkconfig: 2345 70 30
#description: the description of the shell   #关于脚本的简短描述
#processname: rsync_inotify_gitlab_backup    #第一个进程名,后边设置自启动的时候会用到
#2019-09-27
#本地需要同步的目录
SRC=/test/
##远程目录
DATA=/test/
##远程同步IP
IP=192.168.42.9
inotifywait -mrq --timefmt '%Y-%m-%d-%H:%M' --format '%T %w %f' -e modify,delete,create,attrib,move $SRC | while read file
do
rsync -aP --delete $SRC root@$IP:$DATA
#若ssh端口非默认22端口,用以下命令
# rsync -aP "-e ssh -p 23" --delete $SRC root@$IP:$DATA
done

:wq保存退出。

5)在服务端启动该脚本,创建测试文件

[root@rsync-servser ~]# ln -s /usr/local/inotify/bin/* /usr/sbin
[root@rsync-servser ~]# mkdir /test
[root@rsync-servser ~]# sh -x rsync_inotify.sh 

用Xshell 再打开一个服务器连接(本机为192.168.42.8)

[root@rsync-servser test]# touch test2.txt

观看


6)在客户端查看是否同步,如有数据代表同步


#实时同步成功~~~

PS:创建文件、删除文件、移动文件(重命名)、访问文件、修改文件都会被记录

7)后台运行此脚本

[root@localhost ~]# nohup sh rsync_inotify.sh &

注:日志会记录到nohup.out文件

8)开机自启动

cp rsync_inotify_gitlab_backup.sh /etc/rc.d/init.d

chmod +x rsync_inotify_gitlab_backup.sh

chkconfig --add rsync_inotify_gitlab_backup.sh

chkconfig rsync_inotify_gitlab_backup on

sh rsync_inotify_gitlab_backup.sh &

 

开始之前需要检测系统内核是否支持inotify:

使用uname -r命令检查Linux内核,如果低于2.6.13,就需要重新编译内核加入inotify的支持。
inotify相关参数

inotify定义了下列的接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求,实时的调节其大小:

1) /proc/sys/fs/inotify/max_queued_evnets表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。

2)/proc/sys/fs/inotify/max_user_instances表示每一个real user id可创建的inotify instatnces的数量上限。

3)/proc/sys/fs/inotify/max_user_watches表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。

inotifywait命令参数

-m是要持续监视变化。

-r使用递归形式监视目录。

-q减少冗余信息,只打印出需要的信息。

-e指定要监视的事件列表。

--timefmt是指定时间的输出格式。

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

可监听的事件
access    访问,读取文件。
modify    修改,文件内容被修改。
attirb    属性,文件元数据被修改。
move    移动,对文件进行移动操作。
create    创建,生成新文件
open    打开,对文件进行打开操作。
close    关闭,对文件进行关闭操作。
delete    删除,文件被删除。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值