一、企业实战项目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
命令
inotify-tools 包含了两个命令:inotifywait 与 inotifywatch。
inotifywait:在被监控的文件或目录上等待特定文件系统事件发生,执行后处于阻塞状态,适合在shell脚本中使用。
阻塞状态 (Blocked):阻塞状态是线程因为某种原因放弃CPU的使用权,暂时停止运行。
inotifywatch:用于收集文件系统的统计数据,例如发生了多少次 inotify 事件,某文件被访问了多少次等等。
内核参数
/proc/sys/fs/inotify/ 目录下包含三个文件,分别设置 inotify 相关的三个内核参数。
max_queued_events:inotify 事件队列可容纳的事件数量,超出的事件被丢弃,但会触发队列溢出Q_OVERFLOW事件。
max_user_instances:每个用户可运行的 inotifywait 或 inotifywatch 命令的进程数。
max_user_watches:每个 inotifywait 或 inotifywatch 命令可以监控的文件数量。如果监控的文件数目巨大,需要根据情况适当增加此值。
默认设置:
事件
inotify 监控的文件系统事件:
access:文件被访问。
modify:文件被修改。
attrib:文件元数据被修改。
open:文件被打开。
create:在被监控的目录中创建了文件或目录。
delete:删除了被监控目录中的某个文件或目录。
......(还有更多事件)
注意:对文件的某个操作往往会触发多个事件,用户应用程序需要自己防止做出重复响应。
实践
不指定监控事件,分别打开两个 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 监控发生了什么:
其中 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 安静 少打印(仅打印事件)。
这里我使用之前的配置
部署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
【注意】下图所示高亮部分必须相同;
举例:
①首先在客户端上运行上面运行的shell脚本,使它进入监控状态:
②重开一个客户端创建一个文件(为什么要重开一个客户端?因为客户端在进入到监听状态时就不能在进行操作了)
③执行脚本的客户端变成了蓝色,说明运行成功了,监听到了;我们点开查看一下;如图所示显示了有一个新文件1.txt
④我们到实时同步目录/backup下查看;有一个full目录,列出目录看到下面有一个1.txt文件
我们当时对客户端下/root/full目录进行了实时同步,同步到了服务端192.168.198.140上的/backup 目录下
⑤查案客户端下的日志
⑥实现开机自启
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
########################
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)在客户端实时同步目录下创建新文件;文章来源:https://www.toymoban.com/news/detail-762868.html
10)查看服务端背负目录,可以看到它是有了一个文件1.txt文章来源地址https://www.toymoban.com/news/detail-762868.html
到了这里,关于【Linux】企业实战项目rsync+inotify实现实时同步(inotify安装及介绍、rsync + inotify 实现实时同步、rsync + inotify实现开机自启 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!