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
生成数据 备份服务端的数据

image-20230814195011640

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上也会同步增加,反之亦然
posted @ 2023-08-25 08:58  浅~~  阅读(41)  评论(0)    收藏  举报