文章目录
前言
rsync是一种强大的命令行工具,用于在本地或远程计算机之间进行文件同步,确保文件的准确性,它可以将文件从一个位置同步到另外一个指定文职,同时在同步过程中节约带宽和存储空间。
一、安装rsync
yum -y install rsync
systemctl start rsyncd
systemctl enable rsyncd
ss -lntp |grep 873
Rsync特性和原理
1、保持原文件的权限、时间、软硬链接等等
2、快速: 第一次同步时rsync复制全部内容,下一次只传输修改过的文件
3、压缩传输: 在传输过程中可以实行压缩及解压缩操作,使用更少的带宽
4、安全: 可以使用scp、ssh等方式来传输文件
5、实现文件的增量同步
原理:
监听873端口,采用C/S模式,即点到点的传输,直接使用rsync命令即可完成
rsync常用的有两种应用模式:
client/server模式、client/client模式
二、参数详解
-v 显示rsync执行过程中的详细信息,可以使用"-vvv"获取更详细信息
-P 显示文件传输的进度信息(-P等价于"--partial --progress")
-n --dry-run 仅测试传输,不真正执行
-a --archive 归档模式,表示递归传闻并保持文件属性
-r --recursive 递归到目录中去
-t --times 保持time属性,强烈建议任何时候都加上"-t"。否则目标文件mtime会设置为系统时间,导致下次更新检查出mtime不通从而导致增量传输无效
-o --owner 保持owner属性
-g --group 保持group属性
-p --perms 保持权限属性
-D 是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件
-l --links 如果文件是软链接文件,则拷贝软连接本身而非软链接所指向的对象
-z 传输时进行压缩提高效率 --compress 传输时进行压缩以提高传输效率
-R --relative 使用相对路径
--size-only 检查文件大小和mtime不同的文件,该选项只检查文件大小
-u --update 仅在源mtime比目标已存在文件的mtime新时才拷贝。该选项是接收端判断的,不会影响删除行为
-d --dirs 以不递归的方式拷贝目录本身,默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但是不拷贝file1
--max-size 限制rsync传输的最大文件大小,可以使用单位后缀
--min-size 限制rsync传输的最小文件大小
--exclude 指定排除规则来排除不需要传输的文件
--delete 以SRC为主,对DEST进行同步,多则删之,少则补之,注意"--delete"是在接收端执行的,所以它是在exclude/include规则生效之后才执行的
-b --backup 对目标上已存在的文件做一个备份,备份的文件名默认使用"~"做后缀
--backup-dir 指定备份文件的保存路径,不指定是默认和待备份文件保存在同一目录下
-e 指定所要使用的远程shell程序,默认为ssh
--port 连接daemon时使用的端口号,默认为873端口号
--password-file daemon模式时的密码文件,可以从中读取密码实现非交互式。这个不是远程shell认证的密码,而是rsync模块认证的密码
-w --whole-file rsync不再使用增量传输,而是全量传输,在网络带宽高于磁盘时,该选项比增量传输更高效
--existing 只更新目标端已存在的文件,目标端不存在的文件不传输
--ignore-existing 只更新目标端不存的文件
--remove-source-files 要求删除源端已成功传输的文件
--bwlimit=100 限速100k,单位是KBPS
-P:是综合了--partial --progress两个参数 断点续传 本地或者远程拷贝大文件时
--partial
如果在拷贝文件的过程中,传输被中断,rsync的默认操作是撤消前操作,即从目标机上删除已拷贝的部分文件。
如果想在下次拷贝时续传文件,不需要重新拷贝所有文件的话,可以使用-partial选项阻止rsync在传输中断时删除已拷贝的部分
大白话:保留那些因故没有完全传输的文件,以是加快随后的再次传输(即断点续传)
--progress 在传输中显示进度条
三、server端配置文件参数
########全局配置参数########
port=888 #指定rsync端口,默认是873
uid=rsync #rsync服务的运行用户,默认是nobody,文件传输成功后属主将是这个uid
gid=rsync #rsync服务的运行组,默认是nobody,文件传输成功后数组将是这个gid
use chroot=no #rsync daemon在传输前是否切换到指定的path目录下,并将其监禁在内
max connections=200 #指定最大连接数量 0表示没有限制
timeout=30 #确保rsync服务器不会永远等待一个崩溃的客户端 0表示永远等待
motd file=/var/rsyncd/rsync.motd #客户端连接过来显示消息
pid file=/var/run/rsyncd.pid #指定rsync daemon的pid文件
lock file=/var/run/rsyncd.lock #指定锁文件
log file=/var/log/rsyncd.log #指定rsync的日志文件,而不把日志发送给syslog
dont compress= *.gz *.tgz *.zip *.z *.Z *rpm *.deb *.bz2 #指定哪些文件不用进行压缩传输
#######指定模块配置参数 并设定模块配置参数 可以创建多个模块###########
[test] #模块id
path= /export/ #指定哎模块的路径,该参数必须指定,启动rsync服务前该目录必须存在。rsync请求访问模块本质就是访问该路径
ignore errors #忽略某些IO错误信息
read only=false #指定该模块是否可读写,即能否上传文件,false表示可读写,true表示可读不可写.所以模块默认不可上传
write only=false #指定该模式是否支持下载,设置为true表示客户端不能下载。
list=false #客户端请求显示模块列表时,该模块是否显示出来,设置为false则该模块为隐藏模块
hosts allow= 10.10.10.0/8 #指定允许连接该模块的机器
hosts deny=10.10.0.0/16 #指定不允许连接到该模块的机器
auth users=rsync_backup #指定连接到该模块的用户列表,只有列表里的用户才能连接到该模块,用户名和密码在对应的secrts file中
secrets file=/etc/rsyncd.passwd #保存auth users用户列表的用户和密码。每行包含一个username:passwd。由于"strict modes"默认为true,所有此文件要求非rsync daemon用户不可读写,只有启用了auth users该选项才有效
四、rsync的client/server模式
1、本地使用
1、rsync -avzp --delete 源文件位置 目标文件位置
补充案例:快速删除文件夹中近百万个文件
背景:
centos系统中有一个文件夹中有近百万个文件,如何快速删除?
删除通用方法:
1、如果确认可直接删除且不用保留,当执行rm -rf 操作命令时,会报错 too long argument。表示rm命令传入的参数过长,执行删除操作失败
2、使用find / -type f -delete 或者find / -type -f -exec rm {} \ 命令都容易导致服务器夯死
3、使用rsync删除
使用rsync操作删除
步骤:
1、将所要删除的文件明存储到文件中
ls -f -l > /tp/filelist.txt
2、创建一个空目录
mkdir /tmp/empty
3、使用rsync将empty空文件夹同步到近百万文件夹中
rsync -av --delete /tmp/empty /var/log/spool/
2、远程使用
1、服务端配置
vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[test]
secrets file = /etc/rsyncd.password #(权限必须是600)
auth users = vendetta
hosts allow = 11.137.18.0/8
path = /export/backup/
list = yes
read_only = only
ignore errors
##配置secrets file
vim /etc/rsyncd.password
vendetta:123456 用户名:密码
2、客户端配置
##配置secrets file
vim /etc/rsyncd.password #(权限必须是600)
123456 #只需要配置密码即可
1、查看有哪些模块
rsync 11.137.18.62::
2、在客户端查看模块下有哪些文件
rsync --password-file=/etc/rsyncd.password vendetta@11.137.18.62::test
3、在客户端拉取服务端的数据做同步 #在客户端拉取服务端的数据同步到backup目录下,如果客户端的这个目录下存在与服务端目录下不一样的文件或目录,则会被删除(--delete),不加--delete参数则会保留不一样的文件或目录
rsync -avz vendetta@11.137.18.62::test backup/ --password-file=/etc/rsyncd.password
4、客户端推数据直至服务端
rsync -avz /tmp/ rsync_backup@10.0.0.8::oldbody(模块名称) --password-file=/etc/rsyncd.password
五、rsync的client/client模式
client/clien模式主要用于两台或多台服务器之间大量的拷贝数据或者同步数据场景,普通的wget或者scp等工具在拷贝数据过程中可能存在着丢失数据,文件权限丢失、无法校验完整性等问题,这在数据同步或者拷贝数据要求严格的场景,就会出现很多问题,此时使用rsync可以很简单的解决这些问题。
rsync的client/clien模式主要走的是ssh通道,也就是依赖于ssh服务实现远程数据传输,所以ssh服务是必须要启动的,同时,要保证数据定时、完整的传输,一般是编写shell脚本,在shell中调用rsync来传输数据
1、rsync的client/client模式的两种应用形式
rsync -vzrtopg --delete --progress Python-3.6.5.tgz root@172.16.213.233:/mnt (推送模式)
rsync -vzrtopg --delete --progress root@172.16.213.233:/mnt/Python-3.6.5.tgz /app/(拉取模式)
默认情况下rsync走的是ssh协议,22端口,如果ssh是非默认的22端口,那么可以添加“-e“选项
rsync -vzrtopg --delete --progress -e 'ssh -p 9090' Python-3.6.5.tgz root@172.16.213.233:/mnt (推送模式)
rsync -vzrtopg --delete --progress -e 'ssh -p 9090' root@172.16.213.233:/mnt/Python-3.6.5.tgz /app/(拉取模式)
2、使用案例
需求: 将A主机上的数据定时拷贝到B主机上
(1)、在B机器上开启公钥私钥配对认证方式
首先,以root用户登录B,更改ssh配置文件/etc/ssh/sshd_config,去除以下配置的注释:
RSAAuthentication yes #启用rsa认证
PubkeyAuthentication yes #启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys #公钥文件路径
然后重启SSH服务
(2)、在A机器生成公钥私钥
在A机器上生成公钥私钥对,执行如下命令:
[root@A /]#ssh-keygen -t rsa
一路默认回车,系统在/root/.ssh下生成id_rsa、id_rsa.pub两个文件,其中id_rsa是私钥,id_rsa.pub是公钥。接着,把id_rsa.pub发送到B机器上
[root@A /]#ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.88.120 #主机B的IP地址
最后验证一下,
[root@A /]#ssh 192.168.88.120 #主机B的IP地址
(3)、在B机器上执行同步数据命令
/usr/bin/rsync -avzPL --timeout=600 root@192.168.56.45:/export/server/minio/data.log.gz /export/minio_data/
六、rsync+sersync实现数据实时同步
rsync+sersync与rsync+inotify同步的区别
sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或者某一个目录的名字,然后使用 rsync 同步的时候,只同步发生变化的文件或者目录。因此效率高.
inotify 只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来。rsync 在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync 要对整个目录遍历查找对比文件),因此效率很低。
同步过程:
(1) 在同步服务器上开启 sersync 服务,sersync 负责监控配置路径中的文件系统事件变化。
(2) 调用 rsync 命令把更新的文件同步到目标服务器。
(3) 需要在主服务器配置 sersync,在同步目标服务器配置 rsync server(注意:是 rsync 服务)。
同步原理:
(1) 用户实时的往 sersync 服务器上写入更新文件数据。
(2) 此时需要在同步主服务器上配置 sersync 服务。
(3) 在另一台服务器开启 rsync 守护进程服务,以同步拉取来自 sersync 服务器上的数据。
(4) 在另一台服务器开启 rsync 守护进程服务,使 sersync push 文件过来。
rsync+sersync实战
https://blog.csdn.net/m0_71163619/article/details/131679867
https://blog.csdn.net/zjz5740/article/details/115652291
七、rsync+inotify实现数据的实时备份
1、rsync的优点与不足
与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如:定期地备份文件服务器数据到远端服务器,对本地磁盘定期进行数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出了更高的要求,rsync在高端业务系统中也逐渐暴露出了很多不足。
首先,rsync同步数据时,需要扫描所有文件后进行比对,然后进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,而且发生变化的往往是其中很少的一部分,因此rsync是非常低效的方式。
其次,rsync不能实时监测、同步数据,虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作一定会有时间差,可能导致服务端和客户端数据出现不一致,无法在应用故障时完全恢复数据。基于以上原因,rsync+inotify组合出现了!
2、初识inotify
Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13版本起,加入了对Inotify的支持。通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,inotify-tools就是这样的一个第三方软件。
在上一节中讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,会触发rsync同步,这样刚好解决了同步数据的实时性问题。
3、安装inotify
#只在服务端安装即可,客户端安装rsync即可
yum install inotify-tools inotify-tools-devel
安装完inotify-tools后,会生成inotifywait和inotifywatch两个指令,其中:
inotifywait用于等待文件或文件集上的一个特定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树。
inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。
4、inotify相关参数
inotify定义了下列的接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求,实时调节其大小
“/proc/sys/fs/inotify/max_queued_evnets ”表示调用inotify_init时分配到inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
“/proc/sys/fs/inotify/max_user_instances”表示每一个real user ID可创建的inotify instatnces数量的上限。
“/proc/sys/fs/inotify/max_user_watches”表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小
5、inotifywait相关参数
-m, 即“—monitor”,表示始终保持事件监听状态
-r, 即“—recursive”,表示递归查询目录
-q, 即“—quiet”,表示打印出监控事件
-e, 即“—event”,通过此参数可以指定要监控的事件,常见的事件有modify、delete、create和attrib等
6、案例: 利用rsync+inotify搭建实时同步系统
要求:
这是一个CMS内容发布系统,后端采用负载均衡集群部署方案,由一个负载调度节点、3个服务节点及一个内容发布节点构成,内容发布节点负责将用户发布的数据生成静态页面,同时将静态网页传输给3台服务节点,而负载调度节点负责将用户请求根据负载算法调度到相应的服务节点上,实现用户访问。用户要求在前端访问到的网页数据始终是最新的、一致的
服务器分布:
节点名称 内核版本 用途 IP地址 网页数据路径
Web1 3.10.0-862 服务节点1 192.168.12.131 /web1/wwwroot
Web2 3.10.0-862 服务节点2 192.168.12.132 /web2/wwwroot
Web3 3.10.0-862 服务节点3 192.168.12.133 /web3/wwwroot
Server 3.10.0-862 内容发布节点 192.168.12.134 /web/wwwroot
在这个案例中,内容发布节点(即Server)充当了rsync客户端的角色,而3个服务节点充当了rsync服务器端的角色,整个数据同步的过程其实就是一个从客户端向服务端发送数据的过程
web节点配置
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[web3]
path = /web3/wwwroot/
comment = web3 file
ignore errors
read only = no
write only = no
hosts allow = 192.168.12.134
hosts deny = *
list = false
uid = root
gid = root
auth users = web3user
secrets file = /etc/web3.pass
在配置完3台服务节点的rsyncd.conf文件后,依次启动rsync守护进程,接着将rsync服务加入到自启动文件中: echo “/usr/local/bin/rsync --daemon” >>/etc/rc.local
配置内容发布节点:
#!/bin/bash
host1=192.168.12.131
host2=192.168.12.132
host3=192.168.12.133
src=/web/wwwroot/
dst1=web1
dst2=web2
dst3=web3
user1=web1user
user2=web3user
user3=web3user
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files
do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$host1::$dst1
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user2@$host2::$dst2
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user3@$host3::$dst3
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
## --timefmt:指定时间的输出格式
## --format:指定变化文件的详细信息
## 这个脚本的作用就是通过inotify监控文件目录的变化,进而触发rsync进行同步操作。由于这个过程是一个主动触发操作的过程,是通过系统内核完成的,所以,比那些遍历整个目录的扫描方式效率高很多。
有时会遇到这样的情况:
向inotify监控的目录(这里是/web/wwwroot/)中写入一个很大文件时,当写入这个大文件需要一段时间时,
inotify会持续不停地输出该文件被更新的信息, 这样就会持续不停地触发rsync执行同步操作,占用大量系统资源。
针对这种情况,最理想的做法是等待文件写完后再触发rsync同步。
在这种情况下,可以修改inotify的监控事件,即 “-e close_write,delete,create,attrib”。
这个脚本的作用就是通过inotify监控文件目录的变化,进而触发rsync进行同步操作。
由于这个过程是一个主动触发操作的过程,是通过系统内核完成的,所以,比那些遍历整个目录的扫描方式效率高很多。