zoukankan      html  css  js  c++  java
  • Rsync工作原理

     

    一 Rsync

    1)软件简介

    Rsync 是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件。Rsync 本来是用以取代rcp 的一个工具,它当前由 Rsync.samba.org 维护。Rsync 使用所谓的“Rsync 演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。运行 Rsync server 的机器也叫 backup server,一个 Rsync server 可同时备份多个 client 的数据;也可以多个Rsync server 备份一个 client 的数据。

    Rsync 可以搭配 rsh 或 ssh 甚至使用 daemon 模式。Rsync server 会打开一个873的服务通道(port),等待对方 Rsync 连接。连接时,Rsync server 会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。

    Rsync 支持大多数的类 Unix 系统,无论是 Linux、Solaris 还是 BSD 上都经过了良好的测试。此外,它在windows 平台下也有相应的版本,比较知名的有 cwRsync 和 Sync2NAS。

    Rsync 的基本特点如下:

    可以镜像保存整个目录树和文件系统;
    可以很容易做到保持原来文件的权限、时间、软硬链接等;
    无须特殊权限即可安装;
    优化的流程,文件传输效率高;
    可以使用 rcp、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接;
    支持匿名传输。


    2)核心算法

    假定在名为 α 和 β 的两台计算机之间同步相似的文件 A 与 B,其中 α 对文件A拥有访问权,β 对文件 B 拥有访问权。并且假定主机 α 与 β 之间的网络带宽很小。那么 Rsync 算法将通过下面的五个步骤来完成:

    β 将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。
    β 对每一个分割好的数据块执行两种校验:一种是32位的滚动弱校验,另一种是128位的 MD4 强校验。
    β 将这些校验结果发给 α。
    α 通过搜索文件 A 的所有大小为 S 的数据块(偏移量可以任选,不一定非要是 S 的倍数),来寻找与文件B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。
    α 发给 β 一串指令来生成文件 A 在 β 上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。

    how rsync works

    从实际应用的角度看Rsync是如何工作的

    核心算法

    3) 文件级别的RSync(只传输变化的文件)工作过程:(我的理解)

    * 机器A构造FileList,FileList包含了需要与机器B sync的所有文件信息对name->id,(id用来唯一表示文件例如MD5);
    * 机器A将FileList发送到机器B;
    * 机器B上运行的后台程序处理FileList,构建NewFileList,其中根据MD5的比较来删除机器B上已经存在的文件的信息对,只保留机器B上不存在或变化的文件;
    * 机器A得到NewFileList,对NewFileList中的文件从新传输到机器B;

    4)进一步的优化存储和传输

    文件级别的Rsync + Rsync对单个文件分块比较和传输 : 实现了文件的高效传输。

    如果Server上存储有所有文件的MD5码索引的数据库 + hardlink技术 : 实现Server的重复文件删除,单个文件只存储一份的技术。

    如果server有单个文件只存储一份的技术,(有所有文件的MD5数据库),则在Rsync传输的过程中只传输Rsync Server没有的文件,如果Rsync Server由此文件直接使用。

    二 安装配置

    首先下载rsync安装文件
    我用的是rsync-3.0.7.tar.gz
    下载地址:http://rsync.samba.org/ftp/rsync/rsync-3.0.7.tar.gz

    第一步解压:
    tar -zvxf rsync-3.0.7.tar.gz
    cd rsync-3.0.7

    ./configure --prefix=/usr/local/rsync
    到这里出现了个小问题,就是G++/GCC都没有安装,那么我们作为系统架构师来讲,这个是小意思,依照

    错误进行修复即可。

    安装GCC/G++
    rpm -ihv kernel-headers-2.6.18-164.el5.i386.rpm
    rpm -ihv glibc-headers-2.5-42.i386.rpm
    rpm -ihv glibc-devel-2.5-42.i386.rpm
    rpm -ihv libgomp-4.4.0-6.el5.i386.rpm
    rpm -ihv gcc-4.1.2-46.el5.i386.rpm
    rpm -ivh gcc-c++-4.1.2-42.el5.i386.rpm

    继续配置
    ./configure --prefix=/usr/local/rsync
    make && make install

    ln -s bin/rsync /usr/bin #做个快捷到bin目录,这样以后直接输入rsync就能执行

    #加入xinetd.d,并设置权限为执行。

    ln -s bin/rsync /etc/xinetd.d
    chmod +x /etc/xinetd.d/rsync


    启动rsync服务端
    #rsync --daemon
    添加配置文件,注意这个配置文件需要自己手动添加。
    vim /etc/rsyncd.conf
    以下为配置文件的参考:
    uid = nobody
    gid = nobody
    use chroot = no                 #不使用chroot
    max connections = 4             # 最大连接数为4
    pid file = /var/run/rsyncd.pid  #pid文件的存放位置
    lock file = /var/run/rsync.lock #锁文件的存放位置
    log file = /var/log/rsyncd.log  #日志记录文件的存放位置
    模块参数
    [web_test]                 # 这里是认证的模块名,在client端需要指定
    path = /home/web_test/     # 需要做镜像的目录,不可缺少!
    comment = This is a test   #这个模块的注释信息
    ignore errors              # 可以忽略一些无关的IO错误
    read only = yes            # 只读
    list = no                  # 不允许列文件
    auth users = test          # 认证的用户名,如果没有这行,则表明是匿名,此用户与系统无关
    secrets file = /etc/backserver.pas # 认证文件名
    hosts allow = 1.1.1.1,2.2.2.2 #允许主机
    hosts deny = 0.0.0.0/0        #禁止主机
    transfer logging = yes
    log format = "%a %f %l"
    #log format = "%o %h [%a] %m (%u) %f %l"


    以下是我的rsyncd.conf配置:
    max connections = 2 #最大连接数
    log file = /var/log/rsync.log #日志文件路径
    timeout = 300 #超时时间

    [backup]
    comment = backup
    path = /usr/local/rsync/backup #本模块实际路径
    read only = no
    list = yes
    uid = root #文件夹的用户ID
    gid = root #文件夹的组
    auth users = test   #授权用户
    secrets file = /etc/rsyncd.secrets #密码文件



    服务器端特殊设置:
    echo "test:123456" > /etc/rsyncd.secrets
    chmod 600 /etc/rsyncd.conf /etc/rsyncd.secrets
    echo "all:192.168.203.113" > /etc/hosts.allow #让主机允许113服务器的所有请求服务。

    客户端特殊设置:
    echo "123456" > /etc/rsync.pas
    chmod 600  /etc/rsync.pas


    客户端传送测试:
    rsync -auv --password-file=/etc/rsync.pas test@192.168.203.112::backup  /data/test
    意思是传送客户端的/data/test里的内容到服务端backup文件夹里
    以下这个语句和上面的稍有差异,但是功能不同。
    rsync -auv --password-file=/etc/rsync.pas /data/test test@192.168.203.112::backup(这样会把

    整个test文件夹传送给服务端的backup里,注意不是test的内容,而是包含文件夹)

    注意:关闭iptables,不然容易错误误导整个配置过程。

    完!


    作者:iTech
    微信公众号: cicdops
    出处:http://itech.cnblogs.com/
    github:https://github.com/cicdops/cicdops

  • 相关阅读:
    CSS 文本
    javascript:void(0)的问题
    剑指offer
    牛课--C/C++
    Linux学习--第二波
    面经-csdn
    初学Linux
    二分查找法的实现和应用汇总
    vs2013下git的使用
    win10+vs2013+Qt5.4 安装方法
  • 原文地址:https://www.cnblogs.com/itech/p/1757952.html
Copyright © 2011-2022 走看看