入门到精通rsync和inotify
作用:
实现文件的备份
备份位置可以是当前主机,也可以是远程主机
备份过程可以是完全备份,也可以是增量备份
功能:
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)