1.软件简介

Rsync 是一个本地或远程数据同步工具,基于RSync算法,这个算法是澳大利亚人Andrew Tridgell发明的;可通过 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。

2.Rsync 的基本特点

2.1 优点

#支持拷贝普通文件与特殊文件如链接文件,设备等。

#可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。

tar zcvf backup_1.tar.gz /opt/data  -exclude=dadong

说明:在打包/opt/data时就排除了dadong命令的目录和文件、

#可以做到保持源文件和目录的权限,时间,软硬链接,属主,组等所有属性均不变-p

# 可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高。(tar -N)

下面的命令将备份/home 目录昨天以来修改过的文件。
##tar -N $(date -d yesterday "+%F") -zcvf /backup/in-backup_$(date +%F).tar.gz /home
添加文件到已经压缩的文件
#tar -fr dadong.tar *.gif
说明:这个命令是将所有.gif的文件增加到dadong.tar的包里面去,-r是增加文件的意思。

#可以使用rcp,rsh,ssh等方式来配合进行隧道加密传输文件(rsync本身不对数据加密)

# 可以通过socket(进程方式)传输文件和数据

# 支持匿名的或认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。

2.2、缺点

#大量小文件同步的时候,比对时间较长,有的时候,同步过程中,rsync过程可能会停止,僵死。

#同步大文件,10G这样的大文件有时会出现问题,中断。未完整同步前,是隐藏文件,可以通过续传(--partial)等参数实现传输。

#一次性远程拷贝可以用scp,大量小文件要打成一个包再拷贝。

3.rsync原理说明

图示说明:

使用rsync进行数据同步时,涉及到增量备份和完全备份。
当服务器B上没有服务器A的要备份的文件内容,就进行完整备份;完整备份就是将源服务器上的信息完整的备份到目标服务器上。
当服务器B上存在服务器A上要备份的文件内容,只是有部分不一样时,就将进行增量备份;增量备份就是将源服务器上变动的内容备份到目标服务器上。

3.1 rsync原理解析

当Rsync通过一个远端SHELL和一个没有启动守护程序的服务器通讯的时候,Rsync所使用的启动方法是在远端系统上派生一个远端SHELL,然后使用这个远端SHELL启动一个Rsync进程。Rsync的客户机和服务器通过远端SHELL的管道进行通讯.在这种模式下, Rsync服务器选项被传送给命令行,用于启动远端SHELL。

当Rsync和一个守护程序通讯的时候, 它直接和网络插口通讯. 这是唯一一种可以被称为涉及网络的的Rsync通讯. 在这种模式下, Rsync的选项必须发送到网络插口上。 下面是具体的描述:

开始通信:

 客户机和服务器最开始通讯的时候, 他们各自发送自己所支持的最高的协议版本号给对方. 两边会使用其中的小的版本作为用来传输的协议版本.
如果是一个守护模式连接,Rsync的参数会被从客户机发送给服务器. 然后, 排出列表会被传送. 然后,客户机服务器的关系就只和错误和日志发送有关了.
本地的Rsync任务(原地址和目标地址都是本地挂载的文件系统)就像一个推送.客户机:作为发送端, 派生一个服务器进程去行使服务器的功能. 客户机/发送端和服务器/接收端通过管道相互通讯。

文件列表

   文件列表不仅包括路径名,也包括所有者,模式, 读写权限, 大小和修改时间. 如果设置了--checksum选项, 文件列表还要包括文件的校验值.

   Rsync启动完成后的第一件事, 发送端会建立文件列表. 在建立过程中, 每个条目都会通过一种优化的网络传送方式发送给接收方,传输结束后, 
两侧会以目录对基础目录的相关性来编排顺序. (具体的算法会和每次传输实用的协议版本有关). 一旦排序开始, 所有关于文件的指向都是使用他们
在文件列表中的目录顺序,如果必要, 发送者遵从文件列表中用户和组的id->name对应表, 接收者会使用它来为文件列表中的每个文件作id->name->id翻译,
接收端收到完全的文件列表, 会派生出一个生成器, 和接收端一起建立一个完整的管道。

管道 

     Rsync严重依赖於管道. 这意味着一组进程间的的单向通讯. 一旦文件列表被共享, 管道就表现为如下的形式: 生成器->发送端->接收端
生成器的输出是发送端的输入, 发送端的输出是接收端的输入. 每个进程独立的运行, 只有在管道延迟,或者等待硬盘读写或CPU资源的时候才会有延迟.

生成器

 生成器比较文件列表和本地目录树. 如果设置了--delete参数, 在开始它的主要工作前, 它首先会甄别在本地存在而在发送端上不存在的文件, 然后在接收端删除它们.

 接下来生成器会开始遍历文件列表. 每个文件都被检查, 以确定是否需要同步. 大多数情况下如果修改时间和大小不同, 文件需要同步.  
如果设置了--checksum, 文件校验会被计算并比较. 目录, 设备文件和链结不会被跳过. 缺失的目录会被创建。 如果一个文件需要同步, 在接收端的任何版本的该文件都会被作为一个传输的"基础文件"."基础文件"作为一个数据源,两侧比较下来一致的数据就不需要被传输了.
为了更有效的在远端匹配数据, 基础文件的块校验被计算, 并和文件的目录号一起送给发送端.如果设置了--whole-file, 空的块校验值用于新文件.块大小,
以及在后期的版本中块校验的大小, 是基于每个文件的大小计算的,发送端进程一次从生成器读一组文件号和相关联的块校验。 对每一个生成器发送的文件号, 发送端会存储块校验, 并建立一个哈希索引以快速检索,接着本地文件会被读取, 生成一个从文件的第一个字节开始的块作的校验,
这个校验会和生成器发过来的校验比较, 如果不相符, "不匹配"的字节会被加入到不匹配的数据中, 接着比较下一个字节的块. 这被称为"循环校验"。 如果一个块的校验匹配就会被认为是一个匹配的块, 已经积累的不匹配块会被发送给接收端, 一起发送的还有块的偏移量和在接受端文件中的匹配块的长度.
块校验生成器会提前去检查匹配字节后面的一个字节,即使块的顺序或者偏移量不同,以这种方法匹配的块也能够被确认.
这个程序是Rsync最核心的算法.通过这种方式, 发送者告诉接收端如何重组源文件成为一个目标文件. 这些指令包括所有的可以从基础文件拷贝的数据(如果存在的话),
和任何本地没有的新的数据, 的细节. 在处理末尾, 一个全文件的校验会被发送, 然后发送端去处理下一个文件,生成循环校验以及在校验中找到匹配的数据, 对CPU的能力有很大的需求.
在所有的Rsync进程中,发送端是最消耗CPU资源的.

接收端

接收端会从发送端的数据中读取由文件索引号确认的文件. 然后打开本地文件(被称为基础文件), 建立一个临时文件.

接收端会读取非匹配数据和匹配数据, 并按顺序重组他们成为最终文件. 当非匹配数据被读取, 它会被写入到临时文件. 
当收到一个块匹配记录, 接收端会寻找这个块在基础文件中的偏移量, 将这个块拷贝到临时文件. 通过这种方式, 临时文件被从头到尾建立起来,
建立临时文件的时候生成了文件的校验. 重建文件结束后, 这个校验和来自发送端的校验比较. 如果校验不符, 临时文件会被删除.
如果失败一次, 文件会再被处理一次. 如果失败第二次, 一个错误会被报告,临时文件建立后, 所有者, 权限和修改时间会被设置. 然后它会被重命名已替代基础文件, 从基础文件拷贝数据到临时文件,使接收端成为所有进程中对硬盘要求最高的一个. 小文件还有可能在缓存中, 可以减轻对硬盘的压力;
但是对于大文件,在生成器去处理下一个文件的时候,或者还有由发送端造成的时延, 缓存中已经无法容纳更多的数据,只能清除掉旧的.
另外,数据是随机的从一个文件中读取, 并被写入另外一个, 如果读写的数据超过了硬盘缓存空间, 一个所谓的"寻找风暴"有可能发生,会进一步的损害性能.

守护程序 

 守护程序, 向所有的其他守护进程一样, 为每一个连接派生子进程. 启动的时候, 它解释rsyncd.conf, 以确认存在的模块, 并设置一些全局变量.

 当接收到一个对已经定义的模块的连接时, 守护进程派生一个子进程去处理这个连接. 这个子进程然后去读取rsyncd.conf,

为被请求的模块设置变量, 这个工作有可能改变模块的root路径, 或者抛弃已设定的用户号和组号. 然后, 它就像其他的Rsync服务进程一样,或者作为发送端, 或者作为接收端.

4.rsync软件参数介绍

命令参数

参数说明

-v  ,--verbose

详细模式输出,传输时的进度等信息

-z , --compress

传输时进行压缩以提高传输效率,--compress-level=NUM按级别压缩

-a, --archive

归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl

-r, --recursive 归类于-a参数

子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r

t ,--times 归类于-a参数

保持文件时间信息

-o, --owner 归类于-a参数

保持文件属主信息

-p,--perms 归类于-a参数

保持文件权限

-g,--group 归类-a参数

保持文件属组信息

-P,--progress

显示同步的过程及传输时的进度等信息

-D,--devices 归类-a参数

保持设备文件信息

-l,--links 归类于-a参数

保留软链接

-e,--rsh=COMMAND

使用的信道协议(remote shell),指定替代rsh的shell程序。列如:ssh

--exclude=PATTERN

指定排除不需要传输的文件信息(和tar参数类似

--exclude-from=file

文件所在目录文件可以实现排除多个文件。

--bwlimit=RATE

限速功能。案例:某DBA做数据同步,带宽占满,导致用户无法访问网站

--delete

目录SRC和源目录数据DST一致,即无差异同步数据。

Rsync数据同步应用指南的更多相关文章

  1. Linux实战教学笔记21:Rsync数据同步工具

    第二十一节 Rsync数据同步工具 标签(空格分隔): Linux实战教学笔记-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载,转载 ...

  2. Rsync数据同步工具

                                        Rsync数据同步工具 什么是Rsync? Rsync是一款开源的.快速的.多功能的,可以实现全量及增量的本地或原程数据同步备份 ...

  3. Rsync数据同步服务

    Rsync数据同步服务 Rsync软件适用与unix/linux/windows等多种操作系统平台 Rsync是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具,可以实 ...

  4. rsync数据同步工具的配置

    rsync数据同步工具的配置 1. rsync介绍 1.1.什么是rsync rsync是一款开源的快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsync软件适用于 unix ...

  5. 【基础】:Rsync数据同步工具

    第二十一节 Rsync数据同步工具 1.1 Rsync介绍 1.1.1 什么是Rsync? 1.1.2 Rsync简介 1.3 Rsync的特性 1.1.4 Rsync的企业工作场景说明 1.2 Rs ...

  6. Rsync+inotify 数据同步应用指南

    Rsync+Inotify-tools (1):Inotify-tools 只能记录下被监听的目录发生了变化(包括增加.删除.修改),并没有 把具体是哪个文件或者哪个目录发生了变化记录下来: (2): ...

  7. rsync数据同步备份

    一.rsync简介 (1)rsync是什么? rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具. (2)rsync作用比较 远程拷贝:有点类似ssh的scp ...

  8. 搭建中小规模集群之rsync数据同步备份

    NFS重要问题 1.有关NFS客户端普通用户写NFS的问题. 1)为什么要普通用户写NFS. 2)exports加all_squash. Rsync介绍 什么是Rsync? Rsync是一款开源的.快 ...

  9. rsync 数据同步

    什么是Rsync? Rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地货远程数据同步备份的优秀工具.适用于unix/linux/windows等多种操作系统平台. Rsync具有可使本地 ...

随机推荐

  1. linux中如何对一个文件的内容进行处理,文件中每行有多个字段的值,中间用空格分隔开?

    需求描述: 今天在帮同事看个需求,将操作系统上的文件进行修改名字,改为特定的名字,所以呢,就先把这些原名字及对应的新名字关系放到了一个文本中,对于这个文本执行循环. 文件格式如下: .00000005 ...

  2. Javascript富文本编辑器

    分享几款Javascript富文本编辑器 ueditor jqframework xheditor htmlbox kindeditor wymeditor jhtmlarea markitup ck ...

  3. Oauth2.0(二):开放平台

    上一节说到Oauth2.0 的交互模型.模型涉及到三方:资源拥有者.客户端.服务提供方.其中,服务提供方包含两个角色:鉴权服务器和资源服务器.鉴权服务器负责对用户进行认证,并授权给客户端权限.认证这一 ...

  4. 5 -- Hibernate的基本用法 --2 1 Hibernate 下载和安装

    1. 下载Hibernate压缩包 2. 解压:文件结构 ⊙ documentation : 该路径下存放了Hibernate的相关文档,包括Hibernate的参考文档和API文档等. ⊙ lib ...

  5. ios开发之--所有设备的屏幕尺寸

    所有设备型号官网地址:https://www.theiphonewiki.com/wiki/Models iPhone: 机型 像素 比例 像素密度 屏幕尺寸 机型代码 发布日期 iPhone 2g ...

  6. java命令启动jar包

    本人对这些命令也是一知半解,记录备用. 1. 使用java命令行执行java文件 # 设置命令窗口标题 title test1 # 开启输出 @echo on # 设置环境变量JAVA_HOME se ...

  7. Redis存读取数据

    这一节演示下载.NET中怎样使用Redis存储数据.在.net中比较常用的客户端类库是ServiceStack,看下通过servicestack怎样存储数据. DLL下载:https://github ...

  8. C++ template —— template metaprogram(九)

    metaprogramming含有“对一个程序进行编程”的意思.换句话说,编程系统将会执行我们所写的代码,来生成新的代码,而这些新代码才真正实现了我们所期望的功能.通常而言,metaprogrammi ...

  9. CWnd与HWND的区别与转换

    CWnd与HWND的区别与转换 2011-10-20 10:29:30|  分类: VC学习库|字号 订阅     一.区别HWND是句柄,CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是 ...

  10. Java中遍历字符串toCharArray()和charAt()效率比较

    public static void test() { String s = "a"; for(int i = 0; i < 100000; i++) { s += &quo ...