rsync+inotify
rsync与inotify
https://www.cnblogs.com/wang-xd/p/6551402.html
rsync
功能:实现数据的同步传输,在目录文件发生变化后,可以通过该命令将源文件和需要同步的文件一样状态
inotify
功能:rsync可以实现同步的文件传输,但是在实际的运用中,存在数据需要实时同步的情况,这个时候虽然可以使用crontab的方式执行定时任务,但是难免存在时间的误差,这个时候就需要一个实时监控源文件的变化情况,以便于随时保持文件的同步。
总结:
rsyncs是对文件进行传输的,inotify是对文件进行监控的,二者结合可以实现文件实时传输的功能,以达到两个或者多个备份机器对一个源文件的同步场景,在实际的运用场景中,如构建网站的时候,需要将服务器的数据同步到备份的服务器就需要类似的功能。
rsync
工作模式:
三种模式:
- 本地模式(类似于cp命令)
- 远程模式(类似于scp命令)
- 守护进程(socket进程:是rsync的重要功能)
常用参数:
| 选项 | 含义 |
|---|---|
| -a | 包含-rtplgoD |
| -r | 同步目录时要加上,类似cp时的-r选项 |
| -v | 同步时显示一些信息,让我们知道同步的过程 |
| -l | 保留软连接 |
| -L | 加上该选项后,同步软链接时会把源文件给同步 |
| -p | 保持文件的权限属性 |
| -o | 保持文件的属主 |
| -g | 保持文件的属组 |
| -D | 保持设备文件信息 |
| -t | 保持文件的时间属性 |
| –delete | 删除DEST中SRC没有的文件 |
| –exclude | 过滤指定文件,如–exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步 |
| -P | 显示同步过程,比如速率,比-v更加详细 |
| -u | 加上该选项后,如果DEST中的文件比SRC新,则不同步 |
| -z | 传输时压缩 |
常用命令
1,查看远程服务端的文件目录
rsync --list-only 192.168.1.10::ftp/
指定服务端的用户,查看文件目录
rsync --list-only sgg@192.168.1.10::ftp/
2,拉取远程服务端的目录到本地指定的目录下
rsync -avz 192.168.1.20::backup /data/www
#将IP地址为192.168.1.10 的服务器下的对应ftp目录的文件同步到本地的 /home/ftp
保持与源文件的完全一致,添加--delete
rsync -avz --delete 192.168.1.20::backup /data/www
安装
yun -y install rsync
开机自启动
echo "/usr/bin/rsync --daemon" >>/etc/rc.local
启动关机
启动程序
rsync --daemon
关闭程序
1,
killall rsync
2,
[root@client www]#ps -ef |grep rsync
root 1914 1 0 16:34 ? 00:00:00 rsync --daemon
root 3727 1618 0 18:52 pts/0 00:00:00 grep --color=auto rsync
[root@client www]#kill -9 1914
配置文件解析
全局参数
uid #使用系统的用户名,需要通过系统用户来传输文件
gid
log file #rsync的日志文件路径和名称
lock fie #指定rsync进程 所有文件的路径和名称
port #rsync 的端口,默认是873,,如果需要可以添加参数修改成其他的
模块参数
auth users #访问该模块的虚拟用户名
secrets file #该模块的密码文件,包含用户名和密码
path #该模块的目录这个,这个路径下的目录需要被同步到其他的服务器中
hosts allow #访问白名单
hosts deny #访问黑名单
timeout #空闲超时时间,单位为秒
use chroot #是否将用户锁定在家目录中,默认为true,当有软连接时,需要改为fasle,如果为
#true就限定为模块默认目录,通常都在内网使用rsync所以不配也可以
max connection #最大同时连接数,
readonly
write only
list #远程用户列出目录的文件,无拉取的操作,默认为ture,修改为诶flase即成为拒绝
exclude #不被同步的文件,在这个参数下的文件不会被同步
inotify
命令
inotify-tools工具有两个命令,分别是:
- inotifywait 用于持续监控,实时输出结果。 一般是配合rsync增量备份工具一起使用,因为是文件系统的监控,所以可以搭配脚本一起使用。
- inotifywatch - 用于短期监控,任务完成后输出结果。
常用参数
inotifywait 主要有以下选项:
-m --monitor表示持续监控
-d --daemon 以守护进程方式运行
-r --recursive 递归监控
-q --quiet 简化输出信息
-e 指定监控数据的事件类型,多个事件类型用英文状态的逗号隔开
-o --outfile <file> 打印事件到文件中,要使用绝对路径
-s --syslogOutput 发送错误到sys log 中,
--timefmt <fmt> 指定输出格式
--format <fmt> 指定输出格式,即实际监控输出内容
inotifywait
%y 年份信息,包含世纪信息
%y 不包含世纪信息
%m 月份 (0-12)
%d 每月的第几天 (01,31)
%H 小时 (0-23)
%M 分钟 (0,59)
%S 秒 (0-60)
#范例
--timefmt "%Y-%m-%d %H:%M:%S"
inotifywait ---format
%T 输出时间格式顶一顶格式信息
%w 事件出现时,监控文件或者目录信息,相当于dirname
%f 事件出现时,将显示监控目录下触发实践的文件或者目录信息,否则为空,相当于basename
%e 显示发生的事件信息,不同的事件用逗号分隔
%Xe 显示发生的事件信息,不同的事件用x隔离
#范例
--format "%w%f event: %;e"
--format "%T %w %f"
inotifywait -mr --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %e" /data/www
inotify -e 事件选项
create #文件的目录创建
delete #删除
modify #被写入
attrib #属性改变
close_write #文件或者目录关闭,在写入模式打开之后关闭
close_nowrite #文件或者目录关闭,在只读模式打开之后关闭
close #文件目录关闭
open #文件目录被打开
#范例
-e create,delete,moved_to,close_write,attrib
测试
#持续后台监控,并记录日志到 `/data/www/inotify.log`
inotify -o /data/www/inotify.log -drq /data/www --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %e"
#持续前台监控
inotifywait -mr --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %e" /data/www
inotifywait -mr --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %e" /data/www
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
2023-08-14 13:40:24 /data/www/1111 event: CREATE
2023-08-14 13:40:24 /data/www/1111 event: OPEN
#持续前台监控特定事件
inotifywait -mrq /data/www --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %e" -e create,delete,moved_to,close_write,attrib
安装
yum install inotify-tools
修改内核参数
- max_queued_events - 最多监控队列大小,默认16384
- max_user_instances - 最多监控实例数,默认128
- max_user_watches - 每个实例最多监控的文件数,默认8192
写入一些参数与值到 /etc/sysctl.conf 当中,示例如下。 然后使用sysctl -p让文件它们生效
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
监控目录变化
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w%f %e' -e close_write,modify,delete,create,attrib,move //home/web1
rsync +inotify 实时同步
实验介绍
| server | 客户端 client |
|---|---|
| centos7 | centos7 |
| 192.168.1.10 | 192.168.1.20 |
| 生成数据 | 备份服务端的数据 |

inotify会监控自己的某一个目录,如果有新的数据产生,就会自动将产生的数据推送到目的服务器上,因此这个服务器不需要做过多的配置,rsync是默认安装在系统的。只需要启动即可运行。
这个实验做了很长时间,配置过程要十分仔细,很容易就报错了。如果出现报错,可以去看看日志文件内容,看程序运行到哪一步有错误,进行排查
实验前准备
-
date
时间需要保持一致,如果不一致,可以使用ntpdate修改一样的
-
firewalld
防火墙需要关闭
systemctl stop firewalld systemctl status firewalld -
selinux
getenforce返回结果为disabled即可
-
NetwoK manger
systemctl stop NetworkManager -
配置阿里云的epel 源
[root@centos7 yum.repos.d]#ls CentOS-Base.repo epel.repo repo.bak
#客户端安装和基本配置
[root@client ~]#yum -y install rsync
[root@client ~]#rsync --daemon #以守护进程启动rsync
[root@client ~]#ss -ntlp |grep rsync #查看进程启动了rsync , 使用873端口。
'LISTEN 0 5 *:873 *:* users:(("rsync",pid=5982,fd=4))
LISTEN 0 5 :::873 :::* users:(("rsync",pid=5982,fd=5))
[root@client ~]# echo "/usr/bin/rsync --daemon" >> /etc/rc.local #设置开机自启动
#编辑配置文件,把原来的删除或者备份下。
[root@client ~]#cp /etc/rsyncd.conf /etc/rsyncd.conf.bak
[root@client ~]#rm -f /etc/rsyncd.conf
[root@client ~]#vim /etc/rsyncd.conf
[backup]
read only = no #默认是不允许有写权限的,配置这个就可以对目录执行写操作的了。
path=/data/www
[root@client data]# mkdir /data/www #创建backup模块指定的目录
[root@client data]# setfacl -m u:nobody:rwx /data/www/ #指定目录给nobody用户权限,只有nobody可以访问此目录,
#服务端初步测试
[root@server ~]#rsync rsync://192.168.1.20 #访问客户端
backup
[root@server ~]# rsync /etc/networks root@192.168.1.20::backup #测试把/etc/networks 传输到服务端的模块指定目录
# [root@client www]# ll #服务端可以看到传送过来的数据。用户属主属组变成了nobody,将root用户映射成nobody进行传输。
total 4
-rw-r--r-- 1 nobody nobody 58 Aug 14 15:00 networks
#进行安全加固
uid = root #指定以该用户来访问共享目录,将指定为共享目录的文件所有者,默认为nobody,可以修改
gid = root #用户组
port=874
max connections = 0 #最大连接数,设置为0 就是不限制
exclude=lost+found #跳过指定的目录进行操作
log file = /var/log/rsyncd.log #日志文件路径
pid file = /var/log/rsyncd.pid #进程pid文件路径
lock file = /var/log/rsyncd.lock #锁文件路径
#host allow =192.168.1.0/8 #允许访问的IP段(白名单性质)
use chroot = no #限制在访问目录下
timeout = 100 #超时时间
[backup]
auth users = vuser1 #虚拟用户名
secrets file = /etc/rsyncd.pwd #密码文件路径
path = /data/www #共享目录路径
[root@centos7 data]#echo "vuser1:123" >> /etc/rsyncd.pwd #给密码文件添加虚拟账户和密码信息
[root@centos7 data]#chmod 600 /etc/rsyncd.pwd #指定权限为600。必须修改600服务才能正常运行
[root@centos7 ~]#touch /var/log/rsyncd.lock #添加指定的lock 文件。
[root@centos7 ~]#killall rsync #重新启动服务
[root@centos7 ~]#rsync --daemon
#测试
[root@server ~]#rsync --list-only vuser1@192.168.1.20::backup 需要输入密码才可以访问目录
Password:
drwxr-xr-x 6 2023/08/14 16:31:22 .
[root@server ~]#rsync -avz /d1 vuser1@192.168.1.20::backup 传输文件也需要输入密码
Password:
sending incremental file list
d1/
d1/f1.txt
d1/f2.txt
d1/f3.txt
d1/f4.txt
d1/f5.txt
sent 331 bytes received 123 bytes 19.32 bytes/sec
total size is 0 speedup is 0.00
##实现免密访问
将密码卸载配置文件中,执行命令的时候引入这个文件
[root@server ~]#vim /etc/rsyncd.pwd
123
修改密码文件权限为600
[root@server ~]#chmod 600 /etc/rsyncd.pwd
###测试
[root@server d1]# rsync -avz --password-file=/etc/rsyncd.pwd /d1 vuser1@192.168.1.20::backup
sending incremental file list
d1/
d1/f11.txt
d1/f12.txt
d1/f13.txt
d1/f14.txt
d1/f15.txt
sent 425 bytes received 123 bytes 26.73 bytes/sec
total size is 0 speedup is 0.00
自动同步
1,服务端安装 inotify
[root@server /]#yum -y install inotify-tools
2,启动rsync
[root@server /]# rsync --daemon
2,编写一个脚本监控,
[root@server /]#vim backfile.sh
脚本
#!/bin/bash
#
prog="inotifywait"
events="create,delete,modify,attrib"
iopt="-mrq --delete"
lpath="/data/www/"
rhost="192.168.1.20"
vuser="vuser1"
secfile="/etc/rsyncd.pwd"
ropt="-az"
modName="backup"
$prog $iopt --format "%w%f" -e $events $lpath | while read line
do
echo $line
sleep 3
rsync $ropt $line $vuser@$rhost::$modName --password-file=$secfile
done
3,执行脚本
[root@client ~]#chmod +x backfile.sh #添加执行权限
[root@server /]#bash backfile.sh #执行脚本
4,运行测试
在10的/data/www/ 目录下创建文件,在20上也会同步增加,反之亦然

浙公网安备 33010602011771号