rsync+inotify实现文件实时同步
一、rsync简介
rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。
Rsync 使用一个特殊的算法来识别文件的差异,并仅传输发生变化的部分,以实现高效的文件同步和备份。它还支持多种模式和选项,使其非常适应各种不同的应用场景。
① rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。并且可以不进行改变原有数据的属性信息,实现数据的备份迁移特性。
② rsync软件支持跨平台,适用于unix/ linux/windows等多种操作系统平台
③ rsync是一个快速和非常方便的文件复制工具。它能本地复制,远程复制,或者远程守护进程方式复制,它提供了大量的参数来控制其行为的各个方面,并且允许非常灵活的方式来实现文件的传输复制
④ 以其delta-transfer算法闻名。
⑤ rsync监听端口:873
⑥ rsync运行模式:C/S
二、rsync同步方式和备份的方式
同步方式
1、完整备份:每次备份都是从备份源将所有的文件或目录备份到目的地。
2、差量备份:备份上次完全备份以后有变化的数据(他针对的上次的完全备份,他备份过程中不清除存档属性)。
3、增量备份:备份上次备份以后有变化的数据(他才不管是那种类型的备份,有变化的数据就备份,他会清除存档属性)
备份的方式
1、发起端:负责rsync 同步操作的客户机叫做发起端,通知服务器我要备份你的数据
2、备份源:负责响应来自客户机rsync 同步操作的服务器叫做备份源,需要备份的服务器
3、服务端:运行rsyncd服务,一般来说,需要备份的服务器
4、客户端:存放备份数据
三、rsync的ssh认证协议
rsync命令来同步系统文件之前要先登录remote主机认证,认证过程中用到的协议有2种:
● ssh协议
● rsync协议
rsync server端不用启动rsync的daemon进程,只要获取remote host的用户名和密码就可以直接rsync同步文件
rsync server端因为不用启动daemon进程,所以也不用配置文件/etc/rsyncd.conf
四、rsync命令的常用选项
//rsync常用选项:
- -a, --archive //归档模式,保留文件的权限、属性等信息,等同于组合选项”-rlptgoD“
- -l, --links //对于符号链接文件仍然复制为符号链接文件
- -v, --verbose //啰嗦模式 显示同步过程的详细信息
- -q, --quiet //静默模式
- -r, --recursive //递归
- -p, --perms //保持原有的权限属性
- -z, --compress //在传输时压缩,节省带宽,加快传输速度
- --delete //在源服务器上做的删除操作也会在目标服务器上同步
五、rsync+inotify
Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
环境
源服务器: - IP地址:192.168.142.48;
- 应用:rsync,inotify-tools,脚本;
- 操作系统:Redhat7
- 同步目录: /opt/inotify_data
目标服务器:
- IP地址:192.168.142.30;
- 应用:rsync;
- 操作系统:Redhat7
- 同步目录: /opt/inotify_data
优化系统配置
[root@localhost ~]# vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
[root@localhost ~]# sysctl -p
在目标服务器上进行以下操作:
systemctl stop firewalld
setenforce 0
getenforce
systemctl disable firewalld
yum -y install rsync
配置文件
vim /etc/rsyncd.conf
log file = /var/log/rsyncd.log
pidfile = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
uid = root
gid = root
use chroot = yes #开启,禁锢在源目录,表示允许在访问我备份的目录或文件的时候,使用的角色是root,同时你访问本地目录时拥有的也是root权限
[etc_from_client]
path = /opt/inotify_data/
comment = sync etc from client
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z #同步时不再压缩的文件类型,因为同步时,-avz已经进行压缩
port = 873
ignore errors
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
auth users = kaikai #授权用户,使用wwwroot模块的用户是哪个用户,多个账户以空格隔开
hosts allow = 192.168.142.48/24
secrets file=/etc/rsync.password #存放账号信息的数据文件,一行一个
vim /etc/rsync.password
kaikai:123456
chmod 600 /etc/rsync.password
systemctl start rsyncd
systemctl enable rsyncd
在源服务器上做以下操作
systemctl stop firewalld
setenforce 0
getenforce
systemctl disable firewalld
yum -y install rsync inotify-tools
vim /etc/rsync.password
123456
chmod 600 /etc/rsync.password
测试
rsync -avH --port 873 --delete /opt/inotify_data/ kaikai@192.168.142.30::etc_from_client --password-file=/etc/rsync.password
写同步脚本
//写同步脚本,这是最最重要的一步,请慎之又慎。让脚本自动去检测我们制定的目录下
//文件发生的变化,然后再执行rsync的命令把它同步到我们的服务器端去
//创建一个脚本,并修改权限为755
[root@xaii-client ~]# mkdir /scripts
[root@xaii-client ~]# touch /scripts/inotify.sh
[root@xaii-client ~]# chmod 755 /scripts/inotify.sh
[root@xaii-client ~]# ll /scripts/inotify.sh
-rwxr-xr-x 1 root root 0 2月 19 15:54 /scripts/inotify.sh
cat /scripts/inotify.sh
#!/bin/bash
# 定义变量
host=10.19.29.1 # 目标服务器的 IP 地址(备份服务器)
src=/data-ssd1/fastdfs # 源服务器上要监控的备份目录(需要确保该目录存在)
des=/data-ssd2/fastdfs # 目标服务器上同步的目录路径,需要与目标服务器上的目录一致
password=/etc/rsync.password # 数据同步的密码文件
user=kaikai # 用于执行数据同步的用户名
inotifywait=/usr/bin/inotifywait # 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::$des
echo "${files} was rsynced" >> /tmp/rsync.log 2>&1
done
启动
nohup bash /scripts/inotify.sh &
参考
https://blog.csdn.net/lyshark_csdn/article/details/128486098
https://blog.csdn.net/weixin_43695104/article/details/87717124