1、前言

  基于LAN或WAN的网络应用之间进行数据传输或者同步非常普遍,比如远程数据镜像、备份、复制、同步,数据下载、上传、共享等等。对此,最简单、直接的做法是对数据进行完全复制。然而,数据在网络上来回被复制多次后就会存在大量副本,很多情形下这些文件副本之间仅有很小的差异,很可能是从同一个文件版本演化而来。另一方面,如果对文件进行完全复制,在文件较大的情况下,会占用大量网络带宽,同步时间也会较长。目前,广域网WAN的带宽与访问延迟仍然是急需解决的问题,完全复制使得很多网络应用无法提供良好的服务质量。Rsync是类Unix下常见的一种数据同步算法,它仅传输差异数据,从而节省网络带宽并提高效率。

2、算法介绍

2.1 分块Checksum算法

  首先,rsync会把目标端fileDst的文件平均切分成若干个小块,每块的默认大小为700个字节(最后一块会小于这个数),然后对每块计算两个checksum:一个是32位的rolling checksum,是弱checksum,其使用的算法是Mark Adler发明的adler-32算法。另一个是强checksum,128位的md5 hash算法。(adler-32算法不属于本文讨论的主要内容,有兴趣可参考http://rsync.samba.org/tech_report/node3.html)

  adler-32作为快算法是用来鉴别文件块的不同,但是弱的adler32算法碰撞概率太高了,所以还要引入强的md5 checksum算法以保证两文件块是相同的。也就是说,弱的rolling checksum是用来区别不同,而强的md5 checksum是用来确认相同。

2.2 checksum查找算法

  目标端会把fileDst的一个checksum列表传给源端,这个列表中的每一项包含三个属性:rolling checksum(32bits)、md5 checksume(128bits)、文件块编号。源端rsync接收到这个列表后,会对源端fileSrc做同样的checksum,然后和目标端fileDst的checksum做对比,通过比对就可以感知哪些文件做了变动。为获得O(1)时间复杂度的查找性能,同步源端fileSrc拿到目标端fileDst的checksum数组后,会把这个数据存到一个hash table中。

2.3 比对算法

  (1)取fileSrc的第一个文件块(假设是512个长度),也就是从fileSrc的第1个字节到第512个字节,取出来后做rolling checksum计算。计算好的值到hash表中查。

  (2)如果查到了,说明fileDst中有潜在相同的文件块,就再比较md5的checksum。因为rolling checksume只有32位,发生碰撞的概率非常大,于是还要算md5的128bits的checksum,这样一来发生碰撞的概率就可以忽略了。如果rolling checksum和md5 checksum都相同,这说明在fileDst中有相同的块,我们需要记下这一块在fileDst下的文件编号。

  (3)如果fileSrc的rolling checksum 没有在hash table中找到,那就表明这一文件块不存在于目标端。总之,只要rolling checksum 或 md5 checksum 其中有一个在目标端的checksum hash表中找不到匹配项,那么就会触发算法对fileSrc的滚动计算动作。即算法会住后滑动 1个字节,取fileSrc中字节2-513的文件块要做checksum,重新执行第一步的流程。

  (4)当源端的fileSrc完全做完一遍rolling checksum后,就可以找出源端fileSrc与目标端fileDst不相同的文件块了,也就是要同步到目标端的文件块。之后进行传输。

  (5)算法的简要流程如下图所示:

3、安装配置

3.1 安装

  下载rsync-3.0.4.tar.gz ,地址:http://rsync.samba.org/ftp/rsync/src/rsync-3.0.4.tar.gz

解压安装包,命令:tar –xvzf rsync-3.0..tar.gz
进入到rsync文件夹执行:
cd rsync-3.0.
./configure --prefix=/usr/local/rsync
make
make install

3.2 配置

  Rsync安装完成之后默认没有配置文件,需要自己创建。

3.2.1 创建一系列文件夹

mkdir /usr/local/rsync/logs
mkdir /usr/local/rsync/etc
mkdir /usr/local/rsync/run

3.2.2 添加配置文件

  vim  /usr/local/rsync/etc/rsyncd.conf   内容如下:

uid = root
gid = root
port =
use chroot = no
hosts allow = 192.168.31.22
#hosts deny = 192.168.10.0/
pid file = /usr/local/rsync/run/rsyncd.pid
lock file = /usr/local/rsync/run/rsync.lock
log file = /usr/local/rsync/logs/rsyncd.log
ignore errors [rsynctest]
path = /home/laizy/rsync/rsynctest
auth users = root
secrets file = /usr/local/rsync/rsyncd.pass
read only = no

3.2.3 添加密码文件

  vim /usr/local/rsync/rsyncd.pass   格式为——用户名:密码。示例:

root:

3.2.4 为密码文件赋予权限

chmod  /usr/local/rsync/rsyncd.pass

3.2.5 安全配置

  只允许IP为192.168.31.21的主机连入rsync server:

iptables -A INPUT -p tcp -s ! 192.168.31.22 --dport  -j DROP

3.2.6 启动服务

rsync  --daemon --config=/usr/local/rsync/etc/rsyncd.conf &

4、命令详细说明

–v、–verbose详细模式输出

–q、–quiet精简输出模式

–c、–checksum打开校验开关,强制对文件传输进行校验

–a、–archive归档模式,表示以递归方式传输文件,并保持所有文件属性

–r、–recursive对子目录以递归模式处理

–R、–relative使用相对路径信息

–b、–backup创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename

–u、–update仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件

–l、–links保留软链接

–L、–copy-links想对待常规文件一样处理软链结

–copy-unsafe-links仅仅拷贝指向SRC路径目录树以外的链结

–safe-links忽略指向SRC路径目录树以外的链结

–H、–hard-links保留硬链结

–p、–perms保持文件权限

–o、–owner保持文件属主信息

–g、–group保持文件属组信息

–D、–devices保持设备文件信息

–t、–times保持文件时间信息

–W、–whole-file拷贝文件,不进行增量检测

–x、–one-file-system不要跨越文件系统边界

–B、–block-size=SIZE检验算法使用的块尺寸,默认是700字节

–e、–rsh=COMMAND指定替代rsh的shell程序

–rsync-path=PATH指定远程服务器上的rsync命令所在路径信息

–C、–cvs-exclude使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件

–existing仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件

–delete删除那些DST中有,而SRC没有的文件,但不会删除任何源数据

–delete-excluded同样删除接收端那些被该选项指定排除的文件

–delete-after传输结束以后再删除

–ignore-errors即使出现IO错误也进行删除

–max-delete=NUM最多删除NUM个文件

–partial保留那些因故没有完全传输的文件,以加快随后的再次传输

–force强制删除目录,即使不为空

–numeric-ids不将数字的用户和组ID匹配为用户名和组名

–timeout=TIMEIP超时时间,单位为秒

–I、–ignore-times不跳过那些有同样的时间和长度的文件

–size-only当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间

–modify-window=NUM决定文件是否时间相同时使用的时间戳窗口,默认为0

–T–temp-dir=DIR在DIR中创建临时文件

–compare-dest=DIR同样比较DIR中的文件来决定是否需要备份

–P等同于–partial–progress显示备份过程

–z、–compress对备份的文件在传输时进行压缩处理

–exclude=PATTERN指定排除不需要传输的文件模式

–include=PATTERN指定不排除而需要传输的文件模式

–exclude-from=FILE排除一个指定文件名中指定模式匹配的文件

–include-from=FILE不排除一个指定文件名中指定模式匹配的文件

–version打印版本信息

–address绑定到特定的地址

–config=FILE指定其他的配置文件,不使用默认的rsyncd.conf文件

–port=PORT指定其他的rsync服务端口

–blocking-io对远程shell使用阻塞IO

–stats给出某些文件的传输状态

–log-format=FORMAT指定日志文件格式

–password-file=FILE从FILE中得到密码

–bwlimit=KBPS限制I/O带宽,KBytespersecond

–h、–help显示帮助信息

5、常见使用实例

5.1 将本地的文件,同步到远程机器

rsync -avz --password-file=/root/rsyncd.pass /root/temp/ root@192.168.31.22:/home/laizy/tmp/

调换source和destination的位置,亦可完成远程机器到本地的数据同步。

5.2 使用ssh通道进行数据同步

rsync -avz --password-file=/root/rsyncd.pass -e ssh /root/temp/ root@192.168.31.22:/home/laizy/tmp/

5.3 删除不存在于源目录的目的地文件

rsync -avz --password-file=/root/rsyncd.pass --delete /var/opt/laizy/ /root/temp/

5.4 同步时不在目的地创建新文件

rsync -avz --password-file=/root/rsyncd.pass  --existing /var/opt/lx/ /root/temp/

只对目的地已经有的文件进行同步,而不理会源目录新增的文件。

5.5 限制传输文件的大小

rsync -avz --password-file=/root/rsyncd.pass --max-size='100K' /var/opt/lx/ /root/temp/

以上命令限制传输的文件大小只能小于或等于100K,另可以使用M和G作为大小单位。

5.6全拷贝

rsync -avzW --password-file=/root/rsyncd.pass /var/opt/lx/ /root/temp/

默认情况下 rsync 采用增量拷贝,这样能节省带宽,在所同步文件不大的情况下,我们可以通过 -W 选项实现全拷贝。

Rsync原理介绍及配置应用的更多相关文章

  1. Rsync服务介绍与配置

    Rsync 简要介绍 rsync 是一个用于增量文件传输的开源工具,不得不说,rsync简直是不同服务器间传输文件.同步文件的利器.与FTP相比,它具有非常简单的安装和配置方法.而且,rsync可以只 ...

  2. LVS负载均衡IP隧道模式原理介绍以及配置实战

    LVS 基本工作原理 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数 ...

  3. LVS负载均衡NAT模式原理介绍以及配置实战

    LVS基本原理 流程解释: 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP ...

  4. rsync的介绍及参数详解,配置步骤,工作模式介绍

    rsync的介绍及参数详解,配置步骤,工作模式介绍 rsync是类unix系统下的数据镜像备份工具.它是快速增量备份.全量备份工具. Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主 ...

  5. Redis之哨兵机制(sentinel)——配置详解及原理介绍

    说到Redis不得不提哨兵模式,那么究竟哨兵是什么意思?为什么要使用哨兵呢? 接下来一一为您讲解: 1.为什么要用到哨兵 哨兵(Sentinel)主要是为了解决在主从(master-slave)复制架 ...

  6. 03 Yarn 原理介绍

    Yarn 原理介绍 大纲: Hadoop 架构介绍 YARN 产生的背景 YARN 基础架构及原理   Hadoop的1.X架构的介绍   在1.x中的NameNodes只可能有一个,虽然可以通过Se ...

  7. 04 MapReduce原理介绍

    大数据实战(上) # MapReduce原理介绍 大纲: * Mapreduce介绍 * MapReduce2运行原理 * shuffle及排序    定义 * Mapreduce 最早是由googl ...

  8. [转]MySQL主从复制原理介绍

    MySQL主从复制原理介绍 一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以 ...

  9. 液晶常用接口“LVDS、TTL、RSDS、TMDS”技术原理介绍

    液晶常用接口“LVDS.TTL.RSDS.TMDS”技术原理介绍 1:Lvds Low-Voltage Differential Signaling 低压差分信号 1994年由美国国家半导体公司提出之 ...

随机推荐

  1. 由一个Servlet 看java入门常犯的几个错误

    安装完java环境后,cmd-javac 报错           ------------->环境变量配错了,最后全配成系统变量,ok了 能浪费一天的时间 写一个最简单的Servlet ,to ...

  2. js访sleep方法

    function sleep(n) { var start = new Date().getTime(); while (true) if (new Date().getTime() - start ...

  3. 第二篇 SQL Server代理作业步骤和子系统

    本篇文章是SQL Server代理系列的第二篇,详细内容请参考原文. SQL Server代理作业由一系列的一个或多个作业步骤组成.一个作业步骤分配给一个特定的作业子系统(确定作业步骤去完成的工作). ...

  4. css实现元素居中

     参见详细教程,该教程涵盖了所有居中的情况: https://css-tricks.com/centering-css-complete-guide/ css元素居中 1.水平居中 1)文本,图片等行 ...

  5. 针对某个数据库error做systemstate dump

    如果想对某个具体error做systemstate dump收集,可以借助event来实现. 例如想在数据库遇到ora-00054时,收集数据systemstate dump信息: 开启: sqlpl ...

  6. PostgreSQL中美元符号引用的字符串常量

    虽然用于指定字符串常量的标准语法通常都很方便,但是当字符串中包含了很多单引号或反斜线时很难理解它,因为每一个都需要被双写.要在这种情形下允许可读性更好的查询,PostgreSQL提供了另一种被称为“美 ...

  7. 数组 splice 方法

    splice 是万能的吗? 不知道,至少他有三种功能 splice的三种功能,减去,增加,替换 第一种减去 var s=[1,2,3,4,5,6]; s.splice(2,2); console.lo ...

  8. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

  9. C#:IO

    1. File和Directory类 这两个类属于静态类,经常用到的比如File.Exists(string path), Directory.Exists(string path), Directo ...

  10. C++之路起航——标准模板库(vector)

    vector(动态数组或向量):动态分配内存空间的线性储存结构. 需要包括头文件<vector> 定义: vector<数据类型> 变量名: Eg: vector<int ...