一、rsync+inotify 简介
1、rsync简介
rsync(remote synchronize)是 Liunx/Unix 下的一个远程数据同步工具,它可通过 LAN/WAN 快速同步多台主机间的文件和目录。
Linux 之间同步文件一般有两种方式,分别是 rsync 与 scp 。scp 相当于复制,粘贴,文件不存在则新建,若存在则覆盖,而 rsync 则是比较两边文件是否相同,不相同才进行更新。所以 rsync 和 scp 在文件夹存在的情况下差异很大,因为 scp 是复制和覆盖,从执行性能来说 rsync 更胜一筹。而且 rsync 能将文件夹、文件的权限等信息也保存下来。
但是 rsync 也有一定的缺点,在同步数据时,需要扫描所有文件后进行比对,如果文件数量相当大时,扫描文件就非常耗费时间和性能。其次,rsync 不能够实时监测、同步数据,这就可能导致一些时间段数据不一致。解决这个问题的方法就是实时同步,所以需要使用 rsync+inotify 组合。
2、inotify简介
inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux 内核从2.6.13版本起,加入了对 inotify 的支持。通过 inotify 可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,inotify-tools 便可以监控文件系统下文件的各种变化情况了。
首先检查系统内核是否支持 inotify,出现以下三个文件表示系统默认支持 inotify,如下所示。
uname -r #查询系统内核版本
ll /proc/sys/fs/inotify
-rw-r--r-- 1 root root 0 Mar 11 09:34 max_queued_events
-rw-r--r-- 1 root root 0 Mar 11 09:34 max_user_instances
-rw-r--r-- 1 root root 0 Mar 11 09:34 max_user_watches
二、整体架构
这里使用两个Linux服务器节点进行演示,实现两个节点间文件的实时同步,192.168.100.46为client节点,就是需要同步数据的节点,部署rsync+inotify,192.168.100.47为server节点,也就是接收同步数据的节点,只需要部署rsync。
三、server端部署(rsync)
1、安装rsync
dnf install rsync rsync-daemon -y
2、配置rsync
vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes
max connections = 10
strict mode=yes
pid file = /var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
[backup]
path = /backup129/
comment = backup file
ignore errrors
read only=no
write only=no
hosts allow=192.168.100.46
hosts deny=*
list=false
uid=root
gid=root
auth users=ai
secrets file=/etc/rsync.password
2.2.创建密码文件,也就是上面配置的 secrets file 的值 /etc/rsync.password,内容格式为:user:password,user 就是上面配置的 root,password 就是密码。
[root@localhost ~]# echo "ai:admin@123" > /etc/rsync.password
2.3.修改密码文件权限
[root@localhost ~]# chmod 600 /etc/rsync.password
2.4.启动rsync服务
[root@localhost ~]# systemctl restart rsyncd
[root@localhost ~]# systemctl enable rsyncd
Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service → /usr/lib/systemd/system/rsyncd.service.
2.5.防火墙开放873端口
[root@localhost ~]# firewall-cmd --add-port=873/tcp --permanent --zone=public
success
[root@localhost ~]# firewall-cmd --reload
success
2.6.创建同步文件夹
mkdir /backup129/ #和配置文件中的文件名一致
四、client端部署(rsync+inotify)
1、安装rsync
dnf install rsync rsync-daemon -y
2、配置rsync
2.1.client节点中只需要配置认证密码文件,首先在etc文件夹下创建rsync.password文件,只需要密码,不需要用户,密码需要和同步节点node2中一致。
[root@localhost ~]# vim /etc/rsync.password
[root@localhost ~]# cat /etc/rsync.password
password
2.2.修改密码文件权限
[root@localhost /]# chmod 600 /etc/rsync.password
2.3.启动rsync服务
[root@localhost /]# systemctl restart rsyncd
[root@localhost /]# systemctl enable rsyncd
Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service → /usr/lib/systemd/system/rsyncd.service.
2.4.防火墙开放873端口
[root@localhost /]# firewall-cmd --add-port=873/tcp --permanent --zone=public
success
[root@localhost /]# firewall-cmd --reload
success
3、手动同步测试
3.1.创建测试文件夹
mkdir -p /root/data/backuptest/test
3.2.使用如下命令进行同步测试,其中一些参数要和同步节点配置文件中相对应,如认证模块名 backup、用户名 ai 等
rsync -avH --port 873 --delete /root/data/backuptest/ ai@192.168.100.47::backup --password-file=/etc/rsync.password
文件同步成功,接下来部署inotify实现文件实时同步备份
4、部署inotify
4.1.安装阿里epel源
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
4.2.安装inotify-tools
[root@localhost ~]# dnf install inotify-tools -y
4.3.创建rsync同步shell脚本
[root@localhost backuptest]# cat inotifyrsync.sh
#!/bin/bash
hst1=192.168.100.47
src=/root/data/backuptest/
dst1=backup
user1=ai
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src \
| while read files
do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.password $src $user1@$host1::$dst1 > /dev/null 2>&1
echo "${files} was rsynced." >> /tmp/rsync.log 2>&1
done
host 是 server 的 ip,src 是 client 端要实时监控的目录,des 是认证的模块名,需要与 server 一致,user 是建立密码文件里的认证用户。
4.4.赋予脚本权限
chmod 755 /root/data/backuptest/inotifyrsync.sh
4.5.后台运行脚本文件
/root/data/backuptest/inotifyrsync.sh &
4.6.将脚本加入系统自启动文件中
echo "/root/data/backuptest/inotifyrsync.sh &" >> /etc/rc.local
五、实时同步备份验证
5.1.在client节点中添加、删除文件或文件夹,看server端是否会自动同步,经过验证自动同步备份功能实现。