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

  • 相关阅读:
    LeetCode Subsets II
    LeetCode Rotate Image
    LeetCode Palidrome Number
    LeetCode Generate Parentheses
    LeetCode Maximum Subarray
    LeetCode Set Matrix Zeroes
    LeetCode Remove Nth Node From End of List
    Linux Loop设备 使用
    Linux 文件系统大小调整
    LeetCode N-Queens II
  • 原文地址:https://www.cnblogs.com/itech/p/1757952.html
Copyright © 2011-2022 走看看