Rsync镜像备份工作原理

建议结合阅读文章:Rsync核心算法讲解


1. 概念

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。

2. 特性

1)可以镜像保存整个目录树和文件系统。

2)可以很容易做到保持原来文件的权限、时间、软硬链接等等。

3)无须特殊权限即可安装。

4)快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。

5)安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。

6)支持匿名传输,以方便进行网站镜像。

3. 流程示意图

注:整个流程示意图分为2部分

下图为示意图 Part.1

下图为示意图 Part.2

注:本文中3.部分中流程示意图与4.部分中工作原理相对应,建议合理配合食用,风味更佳。

4. 工作原理

1) 进程和角色

进程 角色
Client 客户端初始化连接
Server 客户端连接的远端rsync进程或系统;一旦客户端和服务器端的连接被建立,客户端和服务器端就转换为sender和receiver的角色
Daemon 等待着客户端连接的rsync进程,作为守护进程的启动方法: # /usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
Remote shell 提供rsync client与远端rsync server间连接的一个或多个进程
Sender 访问将被同步的源文件的Rsync进程
Receiver 作为角色,receiver就是文件同步的目的系统;作用为进程,receiver就是更新并且将更新写入磁盘的进程
Generator Generator进程签别变更的文件并且管理文件级逻辑

2)进程开始

当rsync客户端启用后,rsync客户端首先与server进程建立一个连接,此连接可通过管道也可以通过网络socket建立。

当rsync与远端的非deamon server通讯时,远端shell启用的方法是fork the remote shell,它将在远端系统中start一个rsync服务器。Rsync client和server经由管道与远端的shell通讯。直到rsync进程意识到无网络。在此模式下,对于server进程的rsync选项通过命令行传递,这些命令行被用于启动remote shell。

当rsync与daemon进行通讯时,直接通过网络socket。在此种模式下,rsync选项必须通过socket送出,如下所述:

当通讯开始时,两端都先发送它们各自支持的最大协议版本号,尔后每一端都使用最小版本号协议传送。假如是daemon模式,rsync的选项从client发送给server,然后exclude list(排除列表)被传送,从这点开始,client-server关系是相对的,仅针对错误和日志消息传递

3)The Files list(文件列表)

文件列表不只包括路径名,也包括ownership, mode, permissions, size和modtime,假如checksum选项被指定,则文件列表也包括checksums。

  1. Startup结束后的第一件事就是sender将产生文件列表,每一个在文件列表中的条目被传送至接收端。
  2. 文件列表传送完成后,每一端分类(sorts)文件列表,依据传输的相对基目录(具体的排序算法依据传输协议的版本而不同)。
  3. 文件列表在端间分享成功后,所有对文件的引用都将通过文件列表中的索引来完成。
  4. 如果需要,sender将为users and groups根踪文件列表中的id-name 表,receiver将使用它为在文件列表中的每一个文件完成idnameid翻译

4)The Pipeline(管道)

Rsync是重pipelined的,这意味着它是进程间双向通讯的集合,一旦文件列表被共享,其pipeline的行为如下:

Generator–> sender–>receiver

Generator的输出是sender的输入,而sender的输出是receiver的输入,每一个进程独立运行。

5)The Generator

Generator进程将文件列表与本地目录树相比较,并开始遍历(walking) the files list,每一个文件都将被检查,以便查看是否可以skipped。

  • 在大多数文件操作方式下,假如文件的时间和大小被修改,这些文件都不会被skipped。假如checksum选项被指定,则文件级的checksum将被产生并被比较。目录、设备节点和链接将不会skipped。丢失的目录将被重建。

  • 假如一个文件不被skipped,在接收端任何现存该文件的版本将作为传输的“basis file”,此“basis file”被用作数据源,以减少由sender发送数据的数量(文件中匹配的部分将不被sender传送)。

  • 为了使远端匹配的数据更为有效和可靠,“basis file”的块checksum被产生,并跟随文件的index number发送给the sender。

6)The Sender

  1. The Sender进程每一次都读取一组来自于generator的文件的index number和与此相联系的块checksum集合。对于每一个generator发送来的文件id,都存储着块checksum和一个hash index,以便于快速查询。

  2. 然后,本地文件被读取,本地文件块的第一个字节的checksum被计算出来。并与由generator发送过来的此文件的第一个字节的checksum进行比较,

  3. 假如不匹配被发现,则不匹配的字节将被对应到不匹配的数据中,再开始此块中的下一个字节的比较,以此类推,这就是所谓的“rolling checksum”。

  4. 假如一个块的checksum匹配被发现,那么此匹配的块 和任何累计的不匹配数据跟随偏移量和接收端文件的匹配块的长度被发送给receiver。

【 不匹配的块就是以这种方式被鉴别出来,此进程就是rsync算法的核心 】

  • 采用这种方式,the sender将给the receiver作出提示 —— 如何在新的目的文件中重建源文件。

  • 这些提示详细地给出了:
    可被直接由“basis file”复制过来的匹配数据(假如此“base file”存在),并且这些提示也包含着在本地的“base file”尚不存在的raw data。

最后,每一个文件的whole-file checksum被处理完,并被发送给the receiver,the sender处理下一个文件。

以此种方式工作,发送者是CPU高度密集型的。

7)The Receiver

  1. The receiver读取由The sender发送过来由文件index number标识的每一个文件的数据,
  2. The receiver打开本地文件(被称为“basis file”),
  3. 并且The receiver也生成一个临时文件。

The receiver希望读到最终文件内容的按序排列的所有非匹配数据和或匹配记录。

  • 当非匹配数据被读到后:
    the receiver将其写入临时文件;

  • 当块的匹配记录被读到时:
    The receiver将从basis file中搜询到此块的偏移量,并将它们复制到临时文件中;

以此方式,临时文件被从头至尾重建。

  • 临时文件被重建后,此文件的checksum被计算出来,

  • 在此文件的最后,此文件的checksum与来自于the sender的checksum相比较,假如不匹配,则该临时文件将被删除,文件重建失败两次后,错误将被报告。

  • 在临时文件重建完成后,此文件的ownership、permissions及modification time将被设置,然后将此临时文件重命名,以替代原basis file。

  • 将数据由“basis file”拷贝至临时文件,在所有rsync进程中,接收器是磁盘高度密集型的。

8)The Daemon

The Daemon进程,类似于其它daemon,为每一个连接产生一个子进程,在进程启动时,它读取并解释/etc/rsyncd.conf文件,以确定何种模块存在 ,并设置全局选项。

  • daemon进程又称为守护 进程,是在系统启动就运行,系统关闭才停止的进程,独立于终端之外,不与客户端交互。一般进程在关闭终端后就停止了,而daemon进程不会停止。

当一个连接请求被接收,daemon fork一个子进程以处理此连接,该子进程读取rsyncd.conf文件以设置请求模块的选项,这些选项可能是chroot to the module,也可能是drop setuid或setgid for the process,此后,其行为类似于任何其它rsync服务器进程,要么扮演sender角色,要么扮演receiver角色。

转自:Rsync镜像备份工作原理(含流程示意图)_linux rsync原理_狱典司的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/fuhanghang/article/details/133173892