• Rsync原理介绍及配置应用


    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.4.tar.gz
    进入到rsync文件夹执行:
    cd rsync-3.0.4
    ./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 = 873
    use chroot = no
    hosts allow = 192.168.31.22
    #hosts deny =  192.168.10.0/24
    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:123456

    3.2.4 为密码文件赋予权限

    chmod 600 /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 873 -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 选项实现全拷贝。

  • 相关阅读:
    Linux内核空间-用户空间通信之debugfs
    Mysql 启动失败 报错 1067
    [置顶] hdu3018解题报告--也是白话几笔画学习总结
    【Todo】蒙特卡洛(蒙特卡罗)树 & 卷积网络
    基本分类方法——KNN(K近邻)算法
    SVM(支持向量机)与统计机器学习 & 也说一下KNN算法
    可重入锁 & 自旋锁 & Java里的AtomicReference和CAS操作 & Linux mutex不可重入
    【Todo】Nginx架构学习
    【转载】C++异常机制的学习
    关于协程的学习 & 线程栈默认10M
  • 原文地址:https://www.cnblogs.com/zhenyuyaodidiao/p/4755627.html
Copyright © 2020-2023  润新知