【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )

一、企业实战项目rsync+inotify实现实时同步

rsync与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。

随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了

何为 inotify

  • Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。

  • Inotify 监控文件系统操作,比如读取、写入和创建,基于事件驱动,可以做到对事件的实时响应,高效,而且没有轮询造成的系统资源消耗

  • 在前面有讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

inotify能监控非常多的文件系统事件,通过监控这些事件来监控文件是否发生变更,然后通过rsync来更新发生变更的文件

inotify安装及介绍

安装

①检查当前系统内核是否支持 inotify

方法一:

若内核版本大于 2.6.13 则支持;

uname -r

方法二:

若输出 CONFIG_INOTIFY_USER=y,则支持;

grep INOTIFY_USER /boot/config-$(uname -r)

②安装

yum install epel-release -y
yum install inotify-tools -y
【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第1张图片

命令

inotify-tools 包含了两个命令:inotifywait 与 inotifywatch。

  1. inotifywait:在被监控的文件或目录上等待特定文件系统事件发生,执行后处于阻塞状态,适合在shell脚本中使用。

阻塞状态 (Blocked):阻塞状态是线程因为某种原因放弃CPU的使用权,暂时停止运行。
  1. inotifywatch:用于收集文件系统的统计数据,例如发生了多少次 inotify 事件,某文件被访问了多少次等等。

内核参数

/proc/sys/fs/inotify/ 目录下包含三个文件,分别设置 inotify 相关的三个内核参数。

  1. max_queued_events:inotify 事件队列可容纳的事件数量,超出的事件被丢弃,但会触发队列溢出Q_OVERFLOW事件。

  1. max_user_instances:每个用户可运行的 inotifywait 或 inotifywatch 命令的进程数。

  1. max_user_watches:每个 inotifywait 或 inotifywatch 命令可以监控的文件数量。如果监控的文件数目巨大,需要根据情况适当增加此值。

默认设置:

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第2张图片

事件

inotify 监控的文件系统事件:

  1. access:文件被访问。

  1. modify:文件被修改。

  1. attrib:文件元数据被修改。

  1. open:文件被打开。

  1. create:在被监控的目录中创建了文件或目录。

  1. delete:删除了被监控目录中的某个文件或目录。

  1. ......(还有更多事件)

注意:对文件的某个操作往往会触发多个事件,用户应用程序需要自己防止做出重复响应。

实践

不指定监控事件,分别打开两个 shell 窗口,使用 inotifywait 和 inotifywatch 监控某个目录:

mkdir /var/inotify-test
inotifywait -m /var/inotify-test
#监控这个文件有没有发生变化

inotifywatch -v /var/inotify-test
#显示目录的详细信息

在此目录下创建两个文件:

touch /var/inotify-test/file1
touch /var/inotify-test/file2

看看 inotify 监控发生了什么:

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第3张图片
【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第4张图片

其中 inotifywait 的信息是在进程运行过程中输出的,而 inotifywatch 的信息是在进程结束时输出的。

 以上测试没有指定监听事件,所以监听的是所有的事件,可以通过 -e 选项来指定监听事件,如:

inotifywait -m -e create,modify,delete /var/inotify-test

rsync + inotify 实践

项目环境规划

客户端服务器(运行业务应用,rsync工具包需要安装,但不需要启动服务,需要使用inotify监控事件);

服务端服务器(备份服务器,rsync安装并启动后台进程服务,不需要运行inotify);

部署sync+inotify同步/runtime目录至目标服务器的/ysd/下;

目标服务器rsync配置,也可以使用之前的

【注意!配置所有文件时最好手敲一遍,不然会报莫名其妙的错误!!不要直接粘贴!!!亲测有效!!!!】

不使用之前的,现配:

#目标服务器rsync配置


vi /etc/rsyncd.conf

log file = /var/log/rsyncd.log # 日志文件位置,启动rsync后自动产生这
个文件,无需提前创建
pidfile = /var/run/rsyncd.pid # pid文件的存放位置
lock file = /var/run/rsync.lock # 支持max connections参数的锁文件
secrets file = /etc/rsync.pass # 用户认证配置文件,里面保存用户名称和密码,必须手动创建这个文件

[etc_from_client] # 自定义同步名称
path = /ysd/ # rsync服务端数据存放路径,客户端的数据将同步至此目录
comment = sync etc from client
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 # 执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
hosts allow = 172.16.12.128 # 允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = 192.168.1.1 # 禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
//创建用户认证文件
[root@131 ~]# echo 'admin:123456' > /etc/rsync.pass
[root@131 ~]# cat /etc/rsync.pass
admin:123456
[root@131 ~]# chmod 600 /etc/rsync*

在源服务器(客户端)

[root@60 ~]# echo '123456' > /etc/rsync.pass
[root@60 ~]# chmod 600 /etc/rsync.pass

inotify.sh

#!/bin/bash

host=192.168.42.195 # 目标服务器的ip(备份服务器)
src=/runtime # 在源服务器上所要监控的备份目录(此处可以自定义,但是要保证存在)
des=etc_from_client # 自定义的模块名,需要与目标服务器上定义的同步名称一致
password=/etc/rsync.pass # 执行数据同步的密码文件
user=admin # 执行数据同步的用户名
inotifywait=/usr/bin/inotifywait
$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files;do
rsync -avzP --delete --timeout=100 --passwordfile=${password} $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

//让其在后台运行,并开机自启
[root@60 ~]# chmod +x /etc/rc.d/rc.local
[root@60 ~]# ll /etc/rc.
rc.d/ rc.local
[root@60 ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 474 3月 24 2020 /etc/rc.d/rc.local
[root@60 ~]# vim /etc/rc.d/rc.local
# that this script will be executed during boot.
nohup /root/inotify.sh &
touch /var/lock/subsys/local
########################
用你的脚本绝对路径替换/root/inotify.sh
########################
[root@NAT1 ~]# chmod 755 /root/sh/inotify_rsync.sh
************************
一定要给脚本也加上执行权限
************************

[root@localhost ~]# ps -ef|grep inotify
root 1077 1 0 20:37 ? 00:00:00 /bin/sh
/scripts/inotify.sh
root 1085 1077 0 20:37 ? 00:00:00
/usr/bin/inotifywait -mrq --timefmt %Y%m%d %H:%M --format %T
%w%f%e -e modify,delete,create,attrib /runtime
root 1086 1077 0 20:37 ? 00:00:00 /bin/sh
/scripts/inotify.sh
root 6283 3995 0 20:37 pts/0 00:00:00 grep --
color=auto inotify

inotify的相关参数说明:
-m 监视器 永远监听事件。没有此选项,inotifywait 将在一个后退出事件已接收。
-r 递归监视目录递归。
-q 安静 少打印(仅打印事件)。

这里我使用之前的配置

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第5张图片

部署rsync+inotify同步/root/full目录至目标服务器的/backup/下;

#!/bin/bash

host=192.168.198.140
src=/root/full
dest=backup
password=/etc/rsync.password
user=rsync_backup
inotifywait=/usr/bin/inotifywait

$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e 'modify,delete,create,attrib' $src |while read files;do rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$dest;echo "${files} was rsynced!" >> /tmp/rsync.log 2>&1;done
【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第6张图片

【注意】下图所示高亮部分必须相同;

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第7张图片
【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第8张图片

举例:

①首先在客户端上运行上面运行的shell脚本,使它进入监控状态:

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第9张图片

②重开一个客户端创建一个文件(为什么要重开一个客户端?因为客户端在进入到监听状态时就不能在进行操作了)

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第10张图片

③执行脚本的客户端变成了蓝色,说明运行成功了,监听到了;我们点开查看一下;如图所示显示了有一个新文件1.txt

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第11张图片

④我们到实时同步目录/backup下查看;有一个full目录,列出目录看到下面有一个1.txt文件

我们当时对客户端下/root/full目录进行了实时同步,同步到了服务端192.168.198.140上的/backup 目录下

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第12张图片

⑤查案客户端下的日志

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第13张图片

⑥实现开机自启

1)给客户端/etc/rc.d/rc.local文件执行权限x

[root@60 ~]# chmod +x /etc/rc.d/rc.local

2)在客户端/etc/rc.d/rc.local文件添加脚本信息

[root@60 ~]# vim /etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

nohup /root/sh/inotify_rsync.sh &
touch /var/lock/subsys/local

########################

用你的脚本绝对路径替换 /root/sh/inotify_rsync.sh

########################

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第14张图片

3)给客户端上的脚本也加上执行权限x

[root@NAT1 ~]# chmod 755 /root/sh/inotify_rsync.sh

4)查看是否为可执行文件

5)重启客户端

6)如果你之前在服务端基于rsync-daemon认证认证了rsync就使用下面的命令开启守护模式;

(如果没有认证可以参考我的博客:【Linux】Rsync基于rsync-daemon认证的使用(rsync服务端与客户端发配置、排错思路、使用示例、优缺点及使用场景)_滨河四季的博客-CSDN博客)

[root@NAT-139 ~]# rsync --deamon

7)查看rsync是否开启守护模式,如下图所示则已经开启;

[root@NAT-139 ~]# ps -ef |grep rsync

8)关闭服务端上的防火墙;避免客户端连接不上;

[root@NAT-139 ~]# iptables -F
[root@NAT-139 ~]# systemctl stop firewalld
[root@NAT-139 ~]# setenforce 0

9)在客户端实时同步目录下创建新文件;

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第15张图片

10)查看服务端背负目录,可以看到它是有了一个文件1.txt

【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )_第16张图片

你可能感兴趣的:(Linux常用工具及服务,linux,服务器,运维)