ubuntu安装Rsync+inotify实时同步

1 inotify介绍

inotify 是一个从 2.6.13 内核开始,对 Linux 文件系统进行高效率、细粒度、异步地监控机制, 用于通知用户空间程序的文件系统变化。可利用它对用户空间进行安全、性能、以及其他方面的监控。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。如果内核版本不低于 2.6.13,系统就支持 inotify。 如果存在
/usr/include/sys/inotify.h 文件, 表明内核支持 inotify。

root@limingtest-1:~/pub# ls -l /proc/sys/fs/inotify/   #列出文件目录,出现下面的内容,说明服务器内核支持inotify
总用量 0
-rw-r--r-- 1 root root 0 1月  16 08:51 max_queued_events
-rw-r--r-- 1 root root 0 1月  12 04:05 max_user_instances
-rw-r--r-- 1 root root 0 1月  16 08:51 max_user_watches
# inotifywait:在被监控的文件或目录上等待特定文件系统事件(open、close、delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用; 重点掌握
# inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计

2 inotify出现的原因

Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差异同步。我们可以想象一下,如果服务器的文件数量达到了百万甚至千万量级,那么文件对比将是非常耗时的。而且发生变化的往往是其中很少的一部分,这是非常低效的方式。inotify的出现,可以缓解rsync不足之处,取长补短。

简介 Inotify是一种强大的,细粒度的,异步的文件系统事件监控机制(软件),linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加,删除,修改,移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施这样监控的软件。还有国人周洋在金山公司开发的sersync。 Inotify实际是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,而无须通过诸如cron等的轮询机制来获取事件。cron等机制不仅无法做到实时性,而且消耗大量系统资源。相比之下,inotify基于事件驱动,可以做到对事件处理的实时响应,也没有轮询造成的系统资源消耗,是非常自然的事件通知接口,也与自然世界的事件机制相符合。

inotify 功能的实现有几款软件

1)inotify-tools
2)sersync(金山周洋)
3)lsyncd

由于inotify软件是Linux系统2.6内核开始支持,以前版本不支持,所以,安装前需要检查当前系统是否支持安装inotify软件。

3.inotify实现数据实时同步原理

无论是手动执行 rsync 还是把 rsync 客户端发出的数据同步请求命令做成周期性任务计划, 每隔一段时间不管有没有数据变化都发出一次数据同步请求命令, 同步一次数据。 服务端和客户端都有时间差。所以, 使用内核提供的 inotify 机制,当数据发生改变时(删除、修改等)就触发 rsync 客户端发出数据 同步请求。 从而实现数据的实时传输。
rsync + inotify 机制实现的两台服务器数据同步如下图如示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cSTYFFa8-1611121641460)(assets/image-20210120120359274.png)]

3.inotify的作用

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

3 inotify部署安装

3.1安装inotify-tools

  • inotify-tools项目地址:https://github.com/rvoicilas/inotify-tools
  • 软件下载地址:https://github.com/inotify-tools/inotify-tools/archive/v3.14.tar.gz
tar zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make
make install

遇到的错误 https://stackoverflow.com/questions/19816275/no-acceptable-c-compiler-found-in-path-when-installing-python

gcc编译器不在 路 径 中 。 这 意 味 着 要 么 你 没 有 安 装 g c c , 要 么 它 不 在 你 的 路径中。这意味着要么你没有安装gcc,要么它不在你的 gccPATH变量中。

要安装gcc,使用以下命令:(以root用户运行)

Redhat base:

yum groupinstall "Development Tools"

Debian base:

apt-get install build-essential

3.2 Centos

yum -y install inotify*

3.3 Ubuntu

apt-get install inotify-tools

4.inotify限制文件及优化**

在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制: max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程); max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数; max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。

简单优化

echo "50000000" > /proc/sys/fs/inotify/max_user_watches
echo "50000000" >/proc/sys/fs/inotify/max_queued_events 

5.inotifywait重要参数

inotifywait --help

-r|--recursive  # 递归查询目录
-q|--quiet      # 打印很少的信息,仅打印监控事件的信息
-m|--monitor    # 始终保持事件监控状态
-d|--daemon		# daemon模式
--exclude <pattern>		# 排除文件或目录,大小写敏感
--excludei <pattern>	# 排除文件或目录时,不区分大小写
--fromfile <file>	#从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
-o|--outfile <file>	# 输出到文件
-s|--syslog			# 把错误放到日志中而不是标准输出
-q|--quiet			# 安静的
--format <fmt>		# 指定输出格式
             %w 表示发生事件的目录     重要
			 %f 表示发生事件的文件      重要
			 %e 表示发生的事件
			 %Xe 事件以“X”分隔
 			 %T 使用由–timefmt定义的时间格式
--timefmt <fmt>		# 指定时间输出格式
-t|--timeout <seconds>	# 设置超时时间
-e|--event <event1>		# 指定监视的事件,比如删除、增加和修改

inotifywait命令参数

  • -m是要持续监视变化。
  • -r使用递归形式监视目录。
  • -q减少冗余信息,只打印出需要的信息。
  • -e指定要监视的事件列表。
  • --timefmt是指定时间的输出格式。
  • --format指定文件变化的详细信息。

可监听的事件

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

4. rsync+inotify实时同步

编写同步脚本

cat >inotify.sh<<"EOF"
#!/bin/bash
path=/home/ubuntu/pub
rsync_server=192.168.197.29
/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete $path  | while read line
do
    if [ -f $line ];then
        rsync -az $line --delete rsync_backup@$rsync_server::backup --password-file=/etc/rsync.password
    else
        cd $path &&\
        rsync -az ./ --delete rsync_backup@$rsync_server::backup --password-file=/etc/rsync.password
    fi
done
EOF

#放到后台监控
root@limingtest-1:~# nohup sh inotify.sh  &>/dev/null &
[2] 15439
root@limingtest-1:~# ps -ef | grep inotify
root      1001     1  0 1月19 ?       00:00:00 sh inotify.sh
root      1002  1001  0 1月19 ?       00:00:00 inotifywait -mrq --timefmt %d%m%Y %H:%M --format %T %w%f -e create /home/ubuntu/pub

--exclude='.*' 排除.git目录

测试同步:

在这里插入图片描述

注意:rsync的–delete参数,会将客户端的目录无差异同步到服务端,所以一定要注意数据的安全,慎用

既然有了inotify-tools,为什么还要开发sersync?

1)sersync通过配置文件来实现,使用方便;

2)真正的守护进程socket;

3)可以对失败文件定时重传(内置定时任务);

4)第三方的http接口;

5)默认多线程同步。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云原生解决方案

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值