入门到精通rsync和inotify

rsync

作用:

实现文件的备份

备份位置可以是当前主机,也可以是远程主机

备份过程可以是完全备份,也可以是增量备份

功能:

1)类似于cp的复制功能

将本地主机的一个文件复制到另一个位置下

2)将本地主机的文件推送到远程主机: 也可以是从远程主机拉取文件到本地

使用模式:

shell模式:

就是本地复制

远程shell模式:

可以利用ssh来实现数据的加密传输到远程主机

服务器模式:

rsync工作在守护进程模式下

列表模式:

类似ls

确保各主机时间一致

ntp

补充:

实现文件实时同步

rsync+inotify

rsync+ sersync

rsync: 只负责传递文件到远程主机

inotify/sersync: 将发生了改变的文件找出来

rsync:

**模式1:**local(本地模式)

格式:rsync [选项] 源位置... [目的位置]
 选项:
    -p: 复制文件过程中,保持文件属性不变
    -v: 显示复制过程信息
    -a:使用归档模式 (如果复制目录必须使用此选项)
    -z:在传输过程中,以压缩方式进行传输
​

模式2: 远程shell模式

格式:
   Pull: rsync [选项...] [USER@]HOST:源地址... [目的地址]
   Push: rsync [选项...] 源地址... [USER@]HOST:目的地址 
 
 push:  
# rsync -avz -e "ssh" 1.txt root@192.168.1.102:/var/robot/video
sending incremental file list
1.txt
​
sent 91 bytes  received 34 bytes  14.71 bytes/sec
total size is 20  speedup is 0.16
​
pull
# rsync -avz -e "ssh" root@192.168.1.102:/var/robot/video/1.txt /var/robot
receiving incremental file list
1.txt
​
sent 30 bytes  received 84 bytes  32.57 bytes/sec
total size is 20  speedup is 0.18
​

补充:

**说明:**rsync: 在传递文件的时候,会首先对比源和目的下的文件的特征码,只有在特征码不同的时候,才会进行传递。

重点说明:

工作中通常都是用rsync+ssh密钥认证方式,目的是为了用免密登录。

# rsync -avz -e ssh root@192.168.1.102:/var/robot/video/ /var/robot/
receiving incremental file list
./
2.txt
​
sent 33 bytes  received 102 bytes  90.00 bytes/sec
total size is 20  speedup is 0.15

# echo "123123" >> 1.txt
# rsync -avz -e ssh root@192.168.1.102:/var/robot/video/ /var/robot/
receiving incremental file list
1.txt
​
sent 36 bytes  received 112 bytes  98.67 bytes/sec
total size is 20  speedup is 0.14

模式3:守护进程模式 daemon

**案例:**将web1,web2上的数据备份到backup上

准备:

关闭:

selinux

关闭防火墙

配置时间同步

关闭:selinux
#临时关闭
setenforce 0 
#永久关闭
sudo sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
#关闭防火墙
systemctl disable --now firewalld.service
#配置时间同步
ntpdate ntp1.aliyun.com 
//也可以修改配置文件
vim /etc/ntp.conf

**第一步:**配置backup上的rsync,让其工作在守护进程模式(配置服务器端)

1)修改配置文件 (若不存在创建)

   #touch /etc/rsyncd.conf

内容如下:

uid = rsync
gid = rsync
use chroot = yes
max connections = 4
timeout = 100
pid file = /var/lock/rsync.pid
lock file = /var/lock/rsync.lock
log file = /var/log/rsync.log
​
[mod]
path = /var/robot/video
read only = false
hosts allow = 192.168.1.0/24
auth users = vuser
secrets file = /var/robot/video/rsync.passwd
list = false

2)创建相关目录

mkdir -p /var/robot/video

3)创建运行rsync的系统用户

groupadd -r rsync
useradd -r -s /sbin/nologin -g rsync rsync

4)启动rsync

~# rsync --daemon

补充:

rsync默认配置文件/etc/rsyncd.conf

如果想使用其他位置配置文件,可以--config=/path/to/confiFile

rsync --daemon --config=/home/agc.conf

5)检查rsync的端口 (默认873)

~# lsof -i :873
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   26152 root    5u  IPv4 110834      0t0  TCP *:rsync (LISTEN)
rsync   26152 root    6u  IPv6 110835      0t0  TCP *:rsync (LISTEN)

6)创建虚拟用户文件,以及相关的虚拟用户

~# mkdir -p /var/robot/video
~# touch rsync.passwd
~# chmod 600 rsync.passwd (该文件的权限必须是600)
~# chown rsync.rsync rsync.passwd
~#chown -R rsync:rsync /var/robot/video
~#chmod 750 /var/robot/video
~# vim rsync.passwd
   vuser:123123

补充:

虚拟用户就是这个我文件中的记录

一个用户占一行,冒号前是用户名,冒号后是用户密码

**第二部:**配置客户端

  1. 创建密码文件(权限要求为600)

    echo "123123" > /etc/rsync.password
    chmod 600 /etc/rsync.password

2)用rsync来传递数据到服务器的端模块mod中

使用格式:

     rsync [options] [user@]host::modulename /path
​
     rsync [options] /path/ [user@]host::modulename 
​
rsync -avz /var/robot/video vuser@host::mod --password-file=/etc/rsync.password
复制代码
 

说明:

--password-file= 系统可以自动从该位置下指定的文件中读取密码

总结:

服务器端的配置

1,创建配置文件

2,创建密码文件,修改权限为600

3,创建系统用户

4,创建模块对应的目录,修改目录的属主,属组为系统用户

5,启动damon模式

客户端的配置

1,创建虚拟用户的密码文件,权限为600

2,向模块传递文件或者从目录拉取文件

如果出现错误

第一步; 检查日志

第二部: 检查selinux,iptables是否启动

第三步:检查虚拟用户的文件名称是否正确,权限是否正确

补充:

--delete:让客户端和服务器端的文件完全一致

--exclude:在进行文件传送的时候,排除指定的文件

排除实现方式(客户端)

**方式一:**排除一个文件

--exclude=file

**方式二:**排除多个文件

--exclude={file1,file2}

**方式3:**通配符的方式

排除实现方式(服务端)

在配置文件中添加一个关键字 exclude:这里指定要排除的文件列表,列表中的内容以空格为分隔符

例子:

exclude = a.txt b.txt c.txt

完全同步原理

在文件的传输过程中

发送方有的,会直接传输到接收方

发送方没有的,但是接收方有的文件,则会删除

rsyncd.conf的基本构成

全局参数

......

[模块1]

模块参数

. . . . . .

[模块2]

模块参数

. . . . . .

全局参数

pid file: 指定rsync进程的pid文件的路径和名称

lock file: 指定rsync进程的所文件的路径和名称

log file: rsync的日志文件路径和名称

uid:指定rsync进程以什么身份在后台运行,(必须是系统用户)

gid:指定用户组

模块参数 (可以写在全局部分,如果写在全局部分,则对所有的模块都生效)

path:指定备份目录的路径

use chroot: 是否将用户锁定在家目录中

max connections:指定可以进行同时连接的用户的最大数量

read only:true|false

write only:true|false

list=true|false:设置是否可以显示全部的模块列表

auth users:指定访问模块需要使用的用户名,这里的是虚拟用户(不是存在/etc/password)

secrets file: 指定保存虚拟用户名和密码的数据库文件

hosts allow:指定可以访问模块或者rsync服务器端的ip地址

hosts deny:黑名单

timeout:指定空闲超时时间

补充:

两个参数都没有的时候,那么所有用户都可以任意访问

只有allow,那么仅仅允许白名单的用户可以访问模块

只有deny,那么仅仅是黑名单的用户禁止访问模块

两个参数都存在,优先检查白名单

如果匹配成功,则允许访问

如果匹配失败,就去检查黑名单,如果匹配成功则禁止访问

如果都没匹配成功,则允许访问呢

文件实时同步

rsync+inotify

rsync+sersync

inotify

软件

功能:

可以监控指定目录下的文件

当文件发生了改变,则会触发事件,这样就可以输出触发事件的文件的信息

监控事件

创建

删除

修改

移动

epel

安装位置

客户端

应用程序:

/usr/bin/inotifywait: 真真实现我呢见监控程序

/usr/bin/inotifywatch: 数据统计

inotify+rsync

inotifywait

选项

-r: 递归,对目录中的子目录中的文件做监控

-q: 仅仅打印少量信息(仅仅打印监控的事件)

-m:一直处于监控状态(默认是在前台进行监控)

-d:守护进程的方式来运行(运行在后台)

-o file:将监控到的时间输出到文件中(默认是输出到标准输出)

-s:将错误信息输出到系统日志(默认是将错误·信息输出到标准输出)

--excludei:忽略文件的大小写

-e <event>: 指定要监控的事件

access: 访问事件

modify:编辑事件

attrib:修改文件属性事件(修改文件的源数据)

close_write: 当前文件从写模式关闭的时候,会触发该事件

close_nowrote: 当文件从只读模式下关闭的时候,会触发该事件

close:无论以什么方式打开文件,再关闭文件的时候,都会触发该事件

open:当文件被打开的时候,会触发该事件

moved------to:当一个文件被移动到该目录,就会触发该事件

moved_from:当一个文件,从监控目录下移走的时候,触发该事件

moved_self: 在监控目录下执行移动操作,就会触发该事件

move:只要发生了文件的移动,就会触发该事件

create:创建文件的事件

delete:删除文件的事件

-- timefmt <fmt>: 指定输出发生这个事件的时间点的显示格式

--format <ftm>: 指定的当发生事件以后所输出的信息,以及输出的个数

%f:记录发生事件的文件名

%w:记录发生事件的文件所在的目录的绝对路径

%e:记录发生事件的名称(如果有多个事件多个事件用空格分隔)

%xe:记录发生事件的名称(如果有多个事件,多个事件用X分隔)

%T:输出发生事件的时间(时间的格式由 --timefmt <fmt>)

实例:

@web1 ~]#inotifywait -mrq --timefmt "%F%T" --format "%T %w%f %e" -e create,delete,modify /var/robot/video/
@web1 video]# touch 1.txt
web1 ~]# inotifywait -mrq --timefmt "%F%T" --format "%T %w%f %e" -e create,delete,modify /var/robot/video/
2024-07-1915:11:58 /var/robot/video/1.txt CREATE

实时监控脚本如下:

#!/bin/bash
prog="inotifywait"
events="create,delete,modify,attrib"
iopt="-mrq"
​
lpath="/var/robot/video"
​
rhost="192.168.1.10"
user="vuser"
secfile="/etc/rsync.passwd"
ropt="-az"
modName="mod"
​
​
$prog $iopt --format "%w%f" -e $events $lpath | while read line
do
  rsync $ropt $line $user@$rhost::$modName --password-file=$secfile
done

主要:

在实际使用的时候,需要首先进行一次完全备份(rsync)

然后在执行脚本进行实时监控