rsync+inotify 实现文件实时同步功能
- 在生产环境,有时会需要两台主机的特定目录实现实时同步。比如,将NFS共享目录的数据文件,自动实时同步到备份的服务器特定目录中。
- 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化发现目录中数据产生变化,就利用rsync服务推送到备份服务器上
- 异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件
一、rsync介绍
rsync 常用于做为 linux系统下的数据镜像备份工具,实现实现远程同步,支持本地复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时数据同步。
- 优点
使用安全的shell连接做为传输方式
只发送变了的文件,如果时间戳使用touch刷新,也会复制,复制的是变化的一部分
比scp更快,只复制不同的文件 - 常用选项:
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
–delete 如果本地文件夹少一个文件,也把对端的删除了 - 范例
注意两端电脑都需要安装rsync
rzync --delete -av /etc 192.168.19.11:/tmp 如果本地文件夹少一个文件,也把对端的删除了
注意目录/etc 与 /etc/ 的区别,带个斜线的区别
rsync -av /etc 192.168.19.11:/tmp 复制目录和目录下文件(-a 所有参数)
rsync -av /etc/ 192.168.19.11:/tmp 只复制目录下文件
二、rsync服务端介绍
让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接,这里需要记住,源主机代表客户端,备份主机是服务端。
- 在centos7中,rsync包集成了服务文件
[root@localhost ~]#rpm -ql rsync | grep service /usr/lib/systemd/system/rsyncd.service /usr/lib/systemd/system/rsyncd@.service [root@localhost ~]# # 查看帮助 [root@localhost ~]#man rsyncd.conf
- 在centos8中,需要额外安装rsync-daemon包
- 范例
让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接,这里需要记住,源主机代表客户端,备份主机是服务端。# 服务端配置 [root@localhost ~]#echo "xiapi:xiapi" > /etc/rsync.pass [root@localhost ~]#chmod 600 /etc/rsync.pass [root@localhost ~]#cat /etc/rsyncd.conf uid = root gid = root use chroot = no max connections = 0 ignore errors exclude = lost+found/ pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log reverse lookup = no [data] path = /data comment = bcakup read only = no auth users = xiapi secrets file =/etc/rsync.pass [root@localhost ~]# [root@localhost ~]#systemctl start rsyncd # 客户端配置 [root@localhost ~]#echo xiapi > /etc/rsync.pass [root@localhost ~]#chmod 600 /etc/rsync.pass #此为必要项,否则会报如下错误 [root@localhost ~]#rsync -av --delete --password-file=/etc/rsync.pass /data xiapi@192.168.19.11::ftp ERROR: password file must not be other-accessible rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2] [root@localhost ~]#chmod 600 /etc/rsync.pass [root@localhost ~]#rsync -av --delete --password-file=/etc/rsync.pass /data xiapi@192.168.19.11::data
三、inotify 文件监控介绍
-
查看内核是否支持
[root@localhost ~]#ll -l /proc/sys/fs/inotify/ total 0 -rw-r--r--. 1 root root 0 Dec 20 19:20 max_queued_events -rw-r--r--. 1 root root 0 Dec 20 19:20 max_user_instances -rw-r--r--. 1 root root 0 Dec 20 19:20 max_user_watches [root@localhost ~]#
-
查看内核参数
max_queued_events:inotify事件队列最大长度,如值太小会出现 Event Queue Overflow 错
误,默认值:16384
max_user_instances:每个用户创建inotify实例最大值,默认值:128
max_user_watches:可以监视的文件数量(单进程),默认值:8192
修改参数[root@centos8 ~]#vim /etc/sysctl.conf fs.inotify.max_queued_events=66666 fs.inotify.max_user_watches=100000 [root@centos8 ~]#sysctl -p fs.inotify.max_queued_events = 66666 fs.inotify.max_user_watches = 100000 [root@centos8 ~]#cat /proc/sys/fs/inotify/* 66666 128 100000
-
inotifywait 工具安装
[root@localhost ~]#yum install inotify-tools
-
inotifywait 命令参数
-m, --monitor 始终保持事件监听
-d, --daemon 以守护进程方式执行,和-m相似,配合-o使用
-r, --recursive 递归监控目录数据信息变化
-q, --quiet 输出少量事件信息
–exclude 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
–excludei 和exclude相似,不区分大小写
-o, --outfile 打印事件到文件中,相当于标准正确输出,注意:使用绝对路径
-s, --syslogOutput 发送错误到syslog相当于标准错误输出
–timefmt 指定时间输出格式
–format 指定的输出格式;即实际监控输出内容
-e指定监听指定的事件,如果省略,表示所有事件都进行监听 -
inotifywait 时间格式
参考 man 3 strftime
%Y 年份信息,包含世纪信息
%y 年份信息,不包括世纪信息
%m 显示月份,范围 01-12
%d 每月的第几天,范围是 01-31
%H 小时信息,使用 24小时制,范围 00-23
%M 分钟,范围 00-59 -
inotifywait --format格式定义
%T 输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
%w 事件出现时,监控文件或目录的名称信息
%f 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空
%e 显示发生的事件信息,不同的事件默认用逗号分隔
%Xe显示发生的事件信息,不同的事件指定用X进行分隔 -
inotifywait -e 选项的事件类型
create 文件或目录创建
delete 文件或目录被删除
modify 文件或目录内容被写入
attrib 文件或目录属性改变
close_write 文件或目录关闭,在写入模式打开之后关闭的
close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
close 文件或目录关闭,不管读或是写模式
open 文件或目录被打开
moved_to 文件或目录被移动到监控的目录中
moved_from 文件或目录从监控的目录中被移动
move 文件或目录不管移动到或是移出监控目录都触发事件
access 文件或目录内容被读取
delete_self 文件或目录被删除,目录本身被删除
unmount 取消挂载 -
范例
需要开启两个端口,一个端口用来运行inotifywait,一个端口用来操作文件# 窗口1 [root@localhost ~]#ls /data a.txt b.txt c.txt youyou.txt [root@localhost ~]# # 窗口2 [root@localhost ~]#inotifywait /data Setting up watches. Watches established. /data/ OPEN,ISDIR
四、rsync配合inotify 实现文件实时同步功能
主机A代表源数据机器–安装inotify-tools,rsync,然后运行下面脚本
主机B代表备份机器–配置rsync服务端
#!/bin/bash
#
#********************************************************************
#Author: liuhao
#QQ: 1921160095
#Date: 2019-12-20
#FileName: tongbu.sh
#Description: The test script
#Copyright (C): 2019 All rights reserved
#********************************************************************
SRC='/data/'
# 本地文件夹
DEST='xiapi@192.168.19.11::data'
# 目标主机
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
# 循环检测 inotify 是否输出信息
FILEPATH=${DIR}${FILE}
rsync -az --delete --password-file=/etc/rsync.pass $SRC $DEST && echo "At ${TIME} on ${DATE},file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
# 循环体便是执行rsync 同步文件
done
五、小工具优化
- screen 运行脚本,防止终端退出,导致脚本停止
#打开screen,后面可以跟名称 [root@localhost ~]#yum install screen [root@localhost ~]#screen #运行同步的脚本 [root@localhost ~]#sh tongbu.sh #剥离这个screen ctrl a + d [detached from 7943.pts-0.localhost] [root@localhost ~]# #查看进程发现 scree 是独立运行的,没有基于ssh,所以ssh断开也不受影响 [root@localhost ~]#ps auxf root 7943 0.0 0.0 127772 1424 ? Ss 19:41 0:00 SCREEN root 7944 0.0 0.1 115980 2660 pts/2 Ss 19:41 0:00 \_ /bin/bash root 7959 0.0 0.0 113184 1356 pts/2 S+ 19:41 0:00 \_ sh tongbu.sh root 7960 0.0 0.0 6524 744 pts/2 S+ 19:41 0:00 \_ inotifywait -mrq --timefmt %Y-% root 7961 0.0 0.0 113184 388 pts/2 S+ 19:41 0:00 \_ sh tongbu.sh #查看当前运行的screen [root@localhost ~]#screen -ls There is a screen on: 6897.pts-1.localhost (Detached) 1 Socket in /var/run/screen/S-root. #恢复screen 后面可以跟名称 [root@localhost ~]#screen -r
- watch 查看命令
每一秒执行一次ls 在备份机上,查看同步是否正常[root@localhost ~]#watch -n1 ls /data