Linux rsync&inotify的实用场景
  BI6bSVNIuckr 2023年11月02日 68 0

简介

在日常运维中,我们可能会碰到需要部分需要文件同步。使用较多的就是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查看 

Linux rsync&inotify的实用场景_服务端

4、-e[参数]  可以指定的事件类型

Linux rsync&inotify的实用场景_文件同步_02


二、实现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文件

实现效果:

Linux rsync&inotify的实用场景_文件系统_03

三、配置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,可以实时看到具体的传输文件,表示同步已生效

Linux rsync&inotify的实用场景_文件同步_04





【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jnZtF7Co41Wg   2023年12月11日   31   0   0 nginx客户端服务端
  jnZtF7Co41Wg   2023年12月09日   28   0   0 客户端服务端数据
  jnZtF7Co41Wg   2023年12月11日   37   0   0 文件系统xmlGNU
  jnZtF7Co41Wg   2023年12月10日   22   0   0 nginx客户端服务端NFS