「rsync」- 远程文件同步 | remote sync

该笔记将记录:与 rsync 有关的内容,以及相关问题的解决方法。将 rsync 放入该分类中,主要原因是 rsync 是用于文件同步的工具。

认识

官网:http://rsync.samba.org/
文档:https://rsync.samba.org/documentation.html
仓库:https://github.com/RsyncProject/rsync

rsync 是一个快速、灵活的文件复制工具。通过远程 Shell 或者 Rsync 守护进程,可以从另一台主机上拉取文件,或者向另一台主机发送文件,也可以在本地进行文件复制。Rsync 提供了大量的选项用于控制其行为的各个方面,并可以对要复制的文件进行非常灵活的控制。它以差异传输算法著称,该算法发送源文件与目的文件的差异,以此来减少在网络上发送的数据量。Rsync 广泛的用于备份、镜像及作为一种改进的日常使用 copy 命令。

Rsync 使用“快速检查”算法(默认情况下)查找需要传输的文件,该算法查找大小或上次修改时间发生变化的文件。当”快速检查“表明不需要更新文件的数据时,对其他保留属性(由选项请求)的任何更改,将直接在目的文件上进行。

Rsync 将文件复制到远程主机,或从远程主机复制文件;或在当前主机上本地复制文件(它不支持在两个远程主机之间复制文件)。

组成

架构组件

命令 rsync 即提供服务端功能(使用 –daemon 选项),也提供了客户端功能(不使用 –daemon 选项时)。

注意,当使用 rsync 进行同步时,针对远程与本地,其皆需安装 rsync 命令程序。

传输协议

与其他协议不同,虽然 rsync 也有自己的协议,但是它没有被 IETF 标准化,因此也没有 RFC 文档。

工作模式

在 Rsync 中,有两种不同的方式来访问远程系统:

  • 使用远程 Shell 程序作为传输(例如 ssh 或 rsh);只要 SRC 或 DEST 路径在主机规范之后包含单个冒号(:)分隔符,就会使用远程 Shell 传输。
  • 直接通过 TCP 连接 Rsync 守护进程。当 SRC 或 DEST 路径在主机规范之后包含双冒号(::)分隔符时,或者在指定 rsync://URL 时,直接访问 rsync 守护进程(另请参阅“通过远程 Shell 使用 Rsync 守护进程功能“部分,用于后一规则的例外)。

作为一种特殊情况,如果指定单个 SRC 参数,而没有 DEST,则文件将会以类似于“ls -l”的输出格式列出。

正如所料,如果 SRC 或 DEST 都未指定远程主机,则复制在本地进行(另请参阅–list-only 选项)。

Rsync 将本地端称为“客户端(Client)”,将远程端称为“服务端(Server)”。不要将“Server”与 rsync 守护进程混淆 – 守护进程始终是”Server“,但”Server“可以是守护进程或远程 Shell 生成进程。

处理 Rsync 客户端请求的服务端有三种:

  • Inetd。使用 inetd 生成 Rsync 守护进程。
  • 远程 Shell 运行。比如,可以通过 SSH 建立隧道对文件进行传输。这种情况下,不需要在远程创建 Rsync 守护进程。
  • rsync daemon | 在远程服务器上,搭建 rsync 守护进程,监听 873 端口,然后本地通过 Rsync 命令向远程的 Rsync 守护进程发送文件、或者拉取文件到本地。

作为 Rsync 传输的两端,可以有以下三种组合:

  • 本地到本地(复制)。
  • 本地到远程(推送)。
  • 远程到本地(拉取)。

注意事项:rsync 不支持远程和远程之间传输文件。

命令程序 and 配置文件

rsync | 其为 rcp 和 scp 的替代品,具有更多功能的。它使用“rsync 算法”,提供了一种非常快速的同步远程文件的方法,通过仅发送文件中的差异来同步文件,而且在链路一端的文件不需要必须存在。

性质

—— 该部分将介绍 rsync 提供的功能特性(基本功能),即 rsync 的一般功能,而非针对具体应用场景的解决方案。

  • rsync 使用“快速检查”算法(默认)来查找大小发生改变或者修改时间变化的文件。当“快速检查”表明文件数据不需要进行更新的时候,其他保留的属性(由命令选项要求的属性)的改变会在目标文件上直接进行。
  • 支持复制链接、设备、属主、属组、权限。
  • CVS 排除模式(忽略与 CVS 忽略的相同文件)。
  • 可以使用任何透明的远程 Shell,包括 ssh 或者 rsh。
  • 不要求超级用户权限。
  • 将文件传输流水线化以最小化延迟成本。
  • 支持匿名和认证式 Rsync 服务。

忽略文件 / 忽略目录

排除、从选项中排除,类似与 GNU 的 tar。

忽略特殊文件,例如 Socket 文件

rsync -a –no-specials –no-devices would tell rsync to skip these files. It will still print an information message, but it would return 0 if no other error occurs.

但是,该方法存在限制:虽然其不再同步 Socket 文件,但是其无法从 DST 中删除已同步的 Socket 文件。

find /your/source/dir -type s | tee /tmp/ignore-list

rsync –exclude-from=/tmp/ignore-list …

构造

—— 该部分将介绍构建 rsync 服务的方法。我们更加关注于“通过 rsync 服务来实现同步”,而非“从零开始实现 rsync 服务”。

—— 该笔记将记录:安装 rsync 的方法,本章节中介绍了 rsync 的安装,包括从源码安装、安装二进制包等等。接下来就要介绍 RSYNC 服务搭建,不然我们也没有办法演示 rsync 的文件推送和拉去;

安装 | 构建 | Windows | Linux | 源码安装 | 安装二进制包

有关安装说明,请参阅文件 README。

安装后,您可以将 rsync 用于可以通过远程 shell 访问的任何计算机(以及可以使用 rsync 守护进程模式协议访问的计算机)。对于远程传输,现代 rsync 使用 ssh 进行通信,但它可能已配置为默认使用不同的远程 Shell,例如 rsh 或 remsh。您还可以使用-e 命令行选项,或通过设置 Rsync_RSH 环境变量来指定您喜欢的任何远程 shell。

容器镜像

[I] SRC: docker.io/eeacms/rsync:latest
[I] DST: ccr.ccs.tencentyun.com/d3rm-3rd/docker.io_eeacms_rsync:latest

通过仓库安装

apt-get install rsync

通过源码安装

BFLS/rsync-3.1.2

或像 GNU/Linux 中一样,从源码中编译安装,没有太大的差别:

# 下载 rsync 源码并进入源码目录。
wget https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz
tar -xf rsync-3.1.2.tar.gz
cd rsync-3.1.2

# 准备、编译
./configure --prefix=/usr --without-included-zlib &&
make
make install

注意:与 GNU/Linux 下编译相比,唯一的差别可能在于安装到了 /usr/local 中。macOS 中,由于有 System Integrity Protection 的保护,所以你不能随随便便的向 /usr 下写东西。如果你想安装到 /usr 下,需要重启 macOS,开机时按住 command+R,然后进入恢复模式,在终端中执行 csrutil disable 命令来禁用 System Integrity Protection。在这种情况下安装结束后,重新进入恢复模式,在终端中执行 csrutil enable 命令来启用 System Integrity Protection。

on macOS with Homebrew

能够使用 brew 直接进行安装,执行如下命令:

brew install rsync

for Windows WSL

# 09/10/2021 这是我们正在使用的方案。

cwRsync for Windows

与于 Microsoft Windows 能够使用 cwRsync 软件(参考 cwRsync 项目)。

cwRsync 是对 Rsync 的打包,专门用于 Windows 的 Rsync(cwRsync,看名字也能猜出来与 Cygwin 有关)。

DeltaCopy for Windows

What is DeltaCopy

在 Windows 上进行备份的最佳方法(此过程在 Windows 10 x64,Windows 7 和 Windows XP(32)上进行了测试)使用名为 DeltaCopy 的 rsync 模拟器。

DeltaCopy,http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp

Deltacopy 是一个 rsync“整经机”,可以使用 rsync 作为服务器(在 Windows 计算机上)。

robocopy for Windwos

robocopy: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy

应用

  1. 支持匿名传输,可以对资源网站进行镜像
    1. 比如:rsync rsync://rsync.mirrors.ustc.edu.cn,该命令可以对科大镜像站进行镜像,但实际上该命令只是列出了所有的模块,后面的章节会讲解具体的语法。

  1. 对文件进行同步
    1. 站点同步。WEB 负载均衡时,将主机的代码同步到其他服务器。rsync -r website rsync://rsync.d3rm.org/website,该命令会将 website 推到远程 Rsync 守护进程的 example 模块下。

针对现有的数据进行备份或同步

或,配置 cron,可以对文件进行定时备份。

或,配置 inotify,可以对变更的文件进行实时同步。

复制数据到 Pod 中

问题:针对无公网 IP 地址的节点

      - name: rsync-client
        image: ccr.ccs.tencentyun.com/d3rm-3rd/docker.io_eeacms_rsync:latest # eeacms/rsync:latest
        command: ["sleep", "infinity"]
        volumeMounts:
        - name: zentao-data
          mountPath: /data

… No user exists for uid 200 … —— 检查 securityContext 配置,禁用其配置

场景 | 文件实时同步 | inotify + rsync

linux 下两台服务器文件实时同步方案设计和实现: http://blog.csdn.net/5iasp/article/details/13630927
真正的 inotify+rsync 实时同步彻底告别同步慢: http://www.ttlsa.com/web/let-infotify-rsync-fast/
rsync 远程同步文件的两种方式: http://blog.csdn.net/dabao1989/article/details/43731845

参考

Where is Rsync protocol documented?
rsync – Wikipedia