rsync(remote synchronize)是Liunx/Unix下的一个远程数据同步工具。那能够快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。rsync算法并不是每一次都整份传输,而是只传输两个文件的不同部分,因此其传输速度相当快。除此之外,rsync可拷贝、显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。

安装

rsync属于操作系统自带,可以直接yum安装。

数据同步--rsync_rsync数据同步

常见参数

-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
-suffix=SUFFIX 定义备份文件前缀
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links 保留软链结
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-t, --times 保持文件时间信息
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--force 强制删除目录,即使不为空
--timeout=TIME IP超时时间,单位为秒
--progress 显示备份过程
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件

开始传输

#使用ssh服务开始传输
#同步参数 -av
rsync -av  本地目录 用户@目标主机地址:/目标绝对路径/

数据同步--rsync_rsync数据同步_02

ssh端口不是22时,增加 -e 'ssh -p 端口号'

数据同步--rsync_rsync数据同步_03

默认情况下只接受单向传输或同步,不接受逆向。例如同步完本地到目标主机后,如果本机上删除一个文件,是不同步给目标端的。如果本地修改了文件,是会继续同步到目标端的。

断点续传或增量同步

首次同步时rsync复制全部内容,后续只传输邢增的或修改过的内容。

#同步参数 -avp
rsync -avp  本地目录 用户@目标主机地址:/目标绝对路径/

数据同步--rsync_rsync数据同步_04

也可以做成计划任务不定期去执行

#脚本内容
#!/bin/sh
pnum=$( ps -ef | grep rsync | grep -v grep | wc -l)
if [ $pnum -eq 0 ]; then
   rsync -avP -e 'ssh -p 端口号'  /原目录路径 用户名@目标主机地址:/目标绝对路径/ 
fi

#计划任务:crontab 每五分钟执行一次
*/5 * * * * /bin/bash /root/脚本名称.sh

校验

对于文件校验,rsync本身就不断通过校验来上传的

#校验参数 -rvn
rsync -rvn  本地目录 用户@目标主机地址:/目标绝对路径/

数据同步--rsync_rsync数据同步_05

数据同步--rsync_rsync数据同步_06

亦可继续使用md5值进行校验。此处省略


并发传输

rsync 原生不能支持多线程传输。

    如果源端和目标端都是同一台服务器,使用 rsync 进行传输时,单线程并不是问题。此时的瓶颈在于 磁盘IO 和CPU。注释:原和目标目录都在同一个主机的意思是,通过mount挂载方式把目标端或远端挂载到本地目录下。

    但若源端和目标通过公网传输时,单线程传输可能无法充分发挥网络IO,就需要考虑多线程,此时的瓶颈在于网络IO。

有两种方式,可以在此种情况下加快传输速率,充分利用带宽。

----通过 xargs 一条命令同时创建多个rsync进程同步传输

可以事先定义原和目标:

#事先定义原和目标
 threads=2;                                                                                                 
 src=./T2020/;                                                                                              
 dest=root@10.195.1.7:/root/T17/;

数据同步--rsync_rsync数据同步_07

源端和目的端均为Linux----xargs方式

当复制的源端和对端位于同一台 server:

cd $src_dir ; find . -print0 | xargs -I%  -P10 rsync -avuPR % $dest_dir/

从远端复制到本地,且不位于同一台 server :

ssh root@$ip "cd $src_dir ; find . -print0" | xargs -0 -I% -P5 rsync -avuP root@$A_ip:$src_dir/% $dest_dir/

从本地复制到远端,且不位于同一台 server:

cd $src_dir ; find . -print0 | xargs -0 -I% -P5 rsync % -avuPR root@$ip:/$dest_dir

解释如下:

管道符前无论使用 ls 或 find,都是为了获取到文件列表。
    find的-print0 是指定文件列表中文件的分隔符
    xargs的-0 用于指定分隔符
    xargs的-P5 用于指定并发运行的进程数
    rsync的-R 参数 用于保持相对路径结构

数据同步--rsync_rsync数据同步_08




使用rsync传输文件基础功能验证完,后续解锁新功能~~~