现在的存储系统,本身都具备很强的迁移以及备份策略,虽然还是基于网络传输,有相对延迟,但是方便了不少。另外,现在使用的存储系统,读写瓶颈的问题,也大都改为对象存储。

而我们那时候做文件存储,最头疼的就是数据迁移与异地备份。最好用<ku,bi>的同步工具就是rsync。


【基础介绍】

rsync:rsync - a fast, versatile, remote (and local) file-copying tool。快速、通用、远程(和本地)文件复制工具。

显著特点:

1,快速--基于独有的“rsync”算法。实现增量同步。

2,简单--基于开源协议,安装、配置简单。且特定场景下简单同步只需要配置服务端即可。客户端基于linux发行版自带。

3,方便--强大的参数支持,可以在同步过程中,自定义实现保留符号链接、硬链接、权限、时间、归属等信息。

4,安全--配置文件可完成密码访问、读写权限、IP控制等安全限制。

5,完整--仍是基于“rsync算法”,实现文件同步的数据完整性,以及支持目录同步、压缩同步及递归拷贝常见使用场景。

rsync默认开启873端口,以原生rsync传输协议或通过远程shell提供文件。


【安装及配置】

获取源码包:#wget --no-check-certificate https://download.samba.org/pub/rsync/src/rsync-3.1.3.tar.gz

安装与部署:

    # tar zxvf rsync-3.1.3.tar.gz && cd rsync-3.1.3

    # ./configure

    # make && make install

    # touch /etc/rsyncd.conf  #默认没有配置文件,需要自己创建。

    

相关文件说明:

二进制文件:/usr/local/bin/rsync

配置文件:/etc/rsyncd.conf


配置文件说明:官方文档==https://download.samba.org/pub/rsync/rsyncd.conf.html

官方文档大致介绍:

[描述]

rsync配置文件控制身份验证、访问、日志记录和可控模块。

[文件格式]

rsync配置文件由模块和参数组成,一个模块以方括号中的模块名称开始,一直持续到下一个模块开始。模块中的参数类型为name = value。

rsync配置文件是基于行的,也就是说,每个新行终止的行,代表一个注释、一个模块名或一个参数。

在参数中,只有第一个等号是重要的,在第一个等于号之前或之后的空格被丢弃。在模块和参数名称中,引号、拖尾和内部空格是不相关的。参数值内的内部空白被逐字保留。

任何以#开头的行都被当做空格忽略(如果一个#发生在除开头的空白之外的任何东西之后,它就被认为是该行内容的一部分)。

任何以\结尾的行都继续以常规的UNINX方式进行下一行。

参数中,等号后面的值要么是一个字符串(不需要引号),要么是一个布尔值。它可以是yes/no,0/1或true/false。


【参数说明】

[全局参数]

文件中的第一个参数(在[模块]头之前)是全局参数,rsync还允许使用[global]模块名称来表示一个或多个全局参数部分的开头(名称必须小写)。

rsync同样支持在配置文件的全局部分包含任何模块的参数,在这种情况下,所提供的值将覆盖该参数的默认值。、

rsync同样支持参数值引用环境变量。将文字%插入到一个值中的最安全方法是使用%%。


motd file:该参数允许指定一个“当日消息”,以便在每个连接上显示给客户机。默认没有mot文件,当启动守护进程时,可以被-dparam=motdfile=文件命令行选项覆盖。

pid file:该参数告诉rsync守护进程将进程ID写入该文件,如果文件已经存在,守护进程将终止而不是覆盖文件。当启动守护进程时,可以被-dparam=pidfile=文件命令行选项覆盖。

port:该参数告诉rsync对应的监听端口,默认是873。如果这个守护进程是由inetd运行的,并且被--prot命令行选项替代,那么就会忽略它。

address:该参数告诉rsync对应的监听IP地址,如果这个守护进程是由inetd运行的,并且被--address命令行选项替代,那么就会忽略它。

socket options:该参数可以将系统接口调到最大程度。可以设置各种各样的套接字选项,使传输更快(或更慢)读取setsockopt()系统的man页,以了解可能设置的一些选项的详细信息。默认情况下,不设置特殊的套接字选项。

listen backlog:当守护进程监听连接时,可以覆盖默认的backlog值。它默认为5。

[模块参数]

模块参数遵循全局参数的基础信息,如支持环境变量。

rsync中模块名称不能包含斜线或方括号,如果包含空格,则每个内部序列被改为单个空格。


comment:该参数指定客户端获取可用模块列表时显示在模块名称旁边的说明字符串。默认无。

path:该参数指定守护进程文件系统中的目录,使其在此模块中可用,必须为每个模块指定此参数。通过百分号包围变量名称,可以将路径的值从环境变量中出去,甚至可以引用用户连接时由rsync设置的变量。如果最终目录有一个尾随空格,请在路径后面追加一个斜杠避免丢失。

use chroot:如果为true,则在开始于客户端进行文件传输之前,rsync守护进程根据“路径”进行chroot。具有额外保护的优点,需要具有超级用户特权。默认无。

daemon chroot:同上,用于整个守护进程,且需要安装os/lib/etc文件才能发挥作用。默认无。

numeric ids:启用该参数将禁用当前守护进程模块的名称映射用户和组。默认无。

munge symlinks:该参数告诉rsync修改所有符号链接。默认无。

charset:指定模块文件名的字符集名称。如果客户端使用--iconv选项,守护进程将使用“charset”参数的值,而不管客户端实际传递的字符集是什么。默认无。

max connections:该参数允许指定允许的最大并发数。默认为0,表示没有限制。

log file:当该参数设置为非空字符串时,rsync守护进程会将消息记录到指定的文件而不是使用syslog。如果守护进程无法打开指定文件,它将回退到使用syslog并输出关于失败的错误。

syslog facility:该参数允许指定在从rsync守护进程记录消息时使用的系统日志工具名称。

syslog tag:该参数允许指定在从rsync守护进程记录消息时使用的syslog标记。默认值是rsyncd。

max vervbosity:该参数允许控制守护进程生成的详细细信息的最大数量。默认是1,也会影响用户请求更高级别的--info和--debug日志记录的能力。

lock file:该参数用于支持“最大连接数”参数的文件。rsynfc守护进程在此文件上使用记录锁定,以确保共享锁文件模块的最大连接数限制不会超出。默认是/var/run/rsyncd.lock

read only:该参数确定客户端是否能够上传文件,如果“只读”为真,则任何尝试上传都将失败。如果“只读”为假,则如果文件权限允许,可以上传。默认情况下,所有模块都是只读的。“auth users”可以基于每个用户覆盖该选项。

write only:该参数确定客户端是否能够下载文件,如果“只写”为真,则任何尝试下载都将失败。如果“只写”为假,则如果文件权限运维,可以下载。默认情况下,此参数被禁用。

list:该参数确定当客户要求提供可用模块列表时,是否列出此模块。默认情况下,模块可以列出。

uid:该参数指定在守护进程以root用户身份运行时,该文件传入和传出该模块的用户名或用户标识。超级用户运行时,默认值是切换到系统的“nobody”用户,非超级用户的默认设置是不尝试更改用户。RSYNC_USER_NAME环境变量可用于请求将rsync作为授权用户运行。

gid:该参数指定访问模块时将使用的一个或多个组名/ID,第一个是默认组,其他都被设置为不充足。也可以在列表中,指定一个*作为第一个gid.

daemon uid:该参数指定守护进程将在哪个uid下运行,通常以root身份运行,并在未设置时保持用户不变。

daemon gid:该参数指定守护进程将在哪个gid下运行,通常以组的根目录运行,当未设置时,组保持不变。

fake super:等同于守护进程--fake-super命令行选项,允许存储文件的完整属性,而不必让守护进程实际上以root身份运行。

filter:过滤器选项,决定了允许客户端访问的文件。该链不会发送给客户端。按照优先级顺序从过滤器、饱汉子、包含、排除和排除参数构建而成。

exclude:该参数采取空格分割的守护进程排除模式列表,作为客户端-排除选项。

include:使用“include”来覆盖“exclude”参数的效果。

exclude from/include from:该参数指定守护进程上包含守护进程排除/包含模式的文件的名称,每行一个。

inconming chmod:该参数允许指定一组逗号分隔的chmod字符串,将影响所有传入文件的权限。这些更贵发生在所有其他权限计算之后,并且甚至会在客户端未指定--perms时覆盖目标默认/现有权限。

outgoing chmod:该参数允许指定一组逗号分隔的chmod字符串,将影响所有传出文件的权限。这些更改首先发生,使得发送的权限看起来与存储在文件系统本身中的权限不同。

auth users:该参数指定授权规则的逗号和斜杠或空格分割列表,以最简单的形式列出将被允许链接到该模块的用户名。用户名不需要存在于本地系统上,规则可能包含shell通配符。支持@,:等,如果需要的话,详细参考帮助文档。

secrets file:该参数指定包含用于验证此模块的user:password的文件名称,只有在指定了‘auth users’参数时才会查阅此文件,此文件是基于行的,并且每行包含一个名称:密码对。密码可以包含是任何字符,但会被警告限制可以再客户端输入的密码长度。

strict modes:该参数决定是否检查密码文件的权限。如果为真,那么密码文件不能被除了运行rsync守护进程只为的任何用户表示读取。如果为假,则不执行检查。默认为真。

hosts allow:该参数允许指定与连接客户端的主机名和IP地址相匹配的以逗号或空格分割的模式列表。如果没有任何模式匹配,则连接被拒绝。

hosts deny:该参数允许指定与连接的客户端的主机名和IP地址相匹配的以逗号或空格分割的模式列表。如果模式匹配,则连接被拒绝。

reverse lookup:反向查找,默认启用。控制守护进程是否对客户端的IP地址执行反向查找以确定其主机名。

forward lookup:正向查找,默认启用。允许使用连接IP的反向DNS不会返回显式主机名。

ignore errors:当决定是否运行传输的delete阶段时,该参数指示rsync忽略守护进程上的I/O错误。正常情况下,发生任何I/O错误,rsync将跳过--delete步骤,以防止由于临时资源短缺或其他I/O错误导致的额灾难性删除。

ignore nonreadable:该参数高数守护进程完全忽略用户不可读的文件。

transfer logging:该参数使得每个文件的日志记录下载和上传的格式,总是在最后记录传输,如果传输被终止,则日志文件不再记录。

log format:该参数允许在启用传输日志记录时,指定用于记录文件传输的格式。格式是一个文本字符串,其中包含以%字符为前缀的嵌入式单字符穿衣序列。默认格式:“%o%h[%a]%m (%u) %f%l”

  • %a远程IP地址(仅适用于守护进程)

  • %b实际传输的字节数

  • %B文件的权限位(例如rwxrwxrwt)

  • %c为基础文件接收的块校验和的总大小(仅当发送时)

  • %C如果文件已知,则为全文件校验和。对于较旧的rsync协议/版本,校验和被腌制,因此不是有用的值(并且在这种情况下不显示)。对于文件输出的校验和,或者--checksum选项必须有效,或者文件必须已经被传输而没有使用盐腌校验和。请参阅--checksum-choice选项以选择算法。

  • %f文件名(发件人的长表单;没有结尾的“/”)

  • %G文件的gid(十进制)或“DEFAULT”

  • %h远程主机名(仅适用于守护进程)

  • %i我正在更新的项目列表

  • %l文件的长度(以字节为单位)

  • %L字符串“ - > SYMLINK”,“=> HARDLINK”或“”(其中SYMLINKHARDLINK是文件名)

  • %m模块名称

  • %M文件的上次修改时间

  • %n表示文件名(缩写形式;尾部“/”表示dir)

  • 操作的%,即“发送”,“接收”或“删除”。(后者包括后期)

  • %p此rsync会话的进程ID

  • %P模块路径

  • %t当前日期时间

  • %u认证用户名或空字符串

  • %U文件的uid(十进制)

timeout:该参数允许覆盖客户端选择此模块的I/O超市,该参数可以确保rsync不会永远等待客户端。超时时间以秒为单位,默认为0,表示没有超时时间。匿名rsync守护进程推荐600s。

refuse options:该参数允许指定将由rsync守护进程聚聚的rsync命令行选项的空格分割列表。

dont compress:该参数允许根据通配符模式来选择文件名,并且传输过程中,不压缩。


配置文件示例:

A simple rsyncd.conf file that allow anonymous rsync to a ftp area at /home/ftp would be:

[ftp]
        path = /home/ftp
        comment = ftp export area

A more sophisticated example would be:

uid = nobody
gid = nobody
use chroot = yes
syslog facility = local5
pid file = /var/run/rsyncd.pid

[ftp]
        path = /var/ftp/./pub
        comment = whole ftp area (approx 6.1 GB)

[sambaftp]
        path = /var/ftp/./pub/samba
        comment = Samba ftp area (approx 300 MB)

[rsyncftp]
        path = /var/ftp/./pub/rsync
        comment = rsync ftp area (approx 6 MB)

[sambawww]
        path = /public_html/samba
        comment = Samba WWW pages (approx 240 MB)

[cvs]
        path = /data/cvs
        comment = CVS repository (requires authentication)
        auth users = tridge, susan
        secrets file = /etc/rsyncd.secrets

The /etc/rsyncd.secrets file would look something like this:

tridge:mypass
susan:herpass


【rsync算法解析】

1,算法是由Andrew Tridgell发明的。他还是rzip/KnightCap的原作者。

2,整体算法,请参考酷壳陈皓前辈的详解<下边有链接>。

3,根据以上详解,整理如下:

    a,分块checksum算法:用于将目标文件平均切分成若干块,然后对每块计算两个checksum<一弱:用于区别不同。一强:用于确认相同>。

    b,传输算法:同步目标端,会把目标文件的checksum列表<强,弱,文件块编号>传给同步源。

    c,checksum查找算法:同步源拿到目标文件的checksum数组后,把数据存在hash table里,用弱做hash。

    d,对比算法:

        1,取源文件的第一个文件块,做弱计算,计算好的值去hash table中查找。

        2,如果查到了,说明发现在目标文件又潜在相同的文件块。再比较强计算。如果弱强都相同,标记这一块在目标文件的文件编号。

        3,如果没查到不用计算强,算法往后setp 1个字节,取源文件的第二个块做弱计算。

        4,根据以上,找出源文件相邻两次匹配中的文本字符,就是需要往目标同步的文件内容了。


【基本使用-客户端】

本地传输:
  Local:  rsync [OPTION...] SRC... [DEST]
  示例:rsync -avzP /home/jing/1.txt /home/jing/2.txt

远程命令:
  Pull-从远程目录拉文件: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
  示例:rsync -avzP jing@192.168.1.1:/home.jing/1.txt /home/jing/
 
  Push-从本地目录推文件: rsync [OPTION...] SRC... [USER@]HOST:DEST
  示例:rsync -avzP /home/jing/2.txt jing@192.168.1.1:/home/jing/

远程模块:
  Pull-从远程目录拉文件: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
  示例:rsync -avzP jing@192.168.1.1::test /home/jing/
  
  Push-从本地目录推文件: rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
  示例:rsync -avzP /home/jing/* jing@192.168.1.1::test

【参数说明】

 -v, --verbose               increase verbosity
     --info=FLAGS            fine-grained informational verbosity
     --debug=FLAGS           fine-grained debug verbosity
     --msgs2stderr           special output handling for debugging
 -q, --quiet                 suppress non-error messages
     --no-motd               suppress daemon-mode MOTD (see caveat)
 -c, --checksum              skip based on checksum, not mod-time & size
 -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
     --no-OPTION             turn off an implied OPTION (e.g. --no-D)
 -r, --recursive             recurse into directories
 -R, --relative              use relative path names
     --no-implied-dirs       don't send implied dirs with --relative
 -b, --backup                make backups (see --suffix & --backup-dir)
     --backup-dir=DIR        make backups into hierarchy based in DIR
     --suffix=SUFFIX         backup suffix (default ~ w/o --backup-dir)
 -u, --update                skip files that are newer on the receiver
     --inplace               update destination files in-place
     --append                append data onto shorter files
     --append-verify         --append w/old data in file checksum
 -d, --dirs                  transfer directories without recursing
 -l, --links                 copy symlinks as symlinks
 -L, --copy-links            transform symlink into referent file/dir
     --copy-unsafe-links     only "unsafe" symlinks are transformed
     --safe-links            ignore symlinks that point outside the tree
     --munge-links           munge symlinks to make them safer
 -k, --copy-dirlinks         transform symlink to dir into referent dir
 -K, --keep-dirlinks         treat symlinked dir on receiver as dir
 -H, --hard-links            preserve hard links
 -p, --perms                 preserve permissions
 -E, --executability         preserve executability
     --chmod=CHMOD           affect file and/or directory permissions
 -A, --acls                  preserve ACLs (implies -p)
 -X, --xattrs                preserve extended attributes
 -o, --owner                 preserve owner (super-user only)
 -g, --group                 preserve group
     --devices               preserve device files (super-user only)
     --specials              preserve special files
 -D                          same as --devices --specials
 -t, --times                 preserve modification times
 -O, --omit-dir-times        omit directories from --times
 -J, --omit-link-times       omit symlinks from --times
     --super                 receiver attempts super-user activities
     --fake-super            store/recover privileged attrs using xattrs
 -S, --sparse                turn sequences of nulls into sparse blocks
     --preallocate           allocate dest files before writing
 -n, --dry-run               perform a trial run with no changes made
 -W, --whole-file            copy files whole (w/o delta-xfer algorithm)
     --checksum-choice=STR   choose the checksum algorithms
 -x, --one-file-system       don't cross filesystem boundaries
 -B, --block-size=SIZE       force a fixed checksum block-size
 -e, --rsh=COMMAND           specify the remote shell to use
     --rsync-path=PROGRAM    specify the rsync to run on remote machine
     --existing              skip creating new files on receiver
     --ignore-existing       skip updating files that exist on receiver
     --remove-source-files   sender removes synchronized files (non-dir)
     --del                   an alias for --delete-during
     --delete                delete extraneous files from dest dirs
     --delete-before         receiver deletes before xfer, not during
     --delete-during         receiver deletes during the transfer
     --delete-delay          find deletions during, delete after
     --delete-after          receiver deletes after transfer, not during
     --delete-excluded       also delete excluded files from dest dirs
     --ignore-missing-args   ignore missing source args without error
     --delete-missing-args   delete missing source args from destination
     --ignore-errors         delete even if there are I/O errors
     --force                 force deletion of dirs even if not empty
     --max-delete=NUM        don't delete more than NUM files
     --max-size=SIZE         don't transfer any file larger than SIZE
     --min-size=SIZE         don't transfer any file smaller than SIZE
     --partial               keep partially transferred files
     --partial-dir=DIR       put a partially transferred file into DIR
     --delay-updates         put all updated files into place at end
 -m, --prune-empty-dirs      prune empty directory chains from file-list
     --numeric-ids           don't map uid/gid values by user/group name
     --usermap=STRING        custom username mapping
     --groupmap=STRING       custom groupname mapping
     --chown=USER:GROUP      simple username/groupname mapping
     --timeout=SECONDS       set I/O timeout in seconds
     --contimeout=SECONDS    set daemon connection timeout in seconds
 -I, --ignore-times          don't skip files that match size and time
     --size-only             skip files that match in size
 -@, --modify-window=NUM     set the accuracy for mod-time comparisons
 -T, --temp-dir=DIR          create temporary files in directory DIR
 -y, --fuzzy                 find similar file for basis if no dest file
     --compare-dest=DIR      also compare received files relative to DIR
     --copy-dest=DIR         ... and include copies of unchanged files
     --link-dest=DIR         hardlink to files in DIR when unchanged
 -z, --compress              compress file data during the transfer
     --compress-level=NUM    explicitly set compression level
     --skip-compress=LIST    skip compressing files with suffix in LIST
 -C, --cvs-exclude           auto-ignore files in the same way CVS does
 -f, --filter=RULE           add a file-filtering RULE
 -F                          same as --filter='dir-merge /.rsync-filter'
                             repeated: --filter='- .rsync-filter'
     --exclude=PATTERN       exclude files matching PATTERN
     --exclude-from=FILE     read exclude patterns from FILE
     --include=PATTERN       don't exclude files matching PATTERN
     --include-from=FILE     read include patterns from FILE
     --files-from=FILE       read list of source-file names from FILE
 -0, --from0                 all *from/filter files are delimited by 0s
 -s, --protect-args          no space-splitting; wildcard chars only
     --address=ADDRESS       bind address for outgoing socket to daemon
     --port=PORT             specify double-colon alternate port number
     --sockopts=OPTIONS      specify custom TCP options
     --blocking-io           use blocking I/O for the remote shell
     --outbuf=N|L|B          set out buffering to None, Line, or Block
     --stats                 give some file-transfer stats
 -8, --8-bit-output          leave high-bit chars unescaped in output
 -h, --human-readable        output numbers in a human-readable format
     --progress              show progress during transfer
 -P                          same as --partial --progress
 -i, --itemize-changes       output a change-summary for all updates
 -M, --remote-option=OPTION  send OPTION to the remote side only
     --out-format=FORMAT     output updates using the specified FORMAT
     --log-file=FILE         log what we're doing to the specified FILE
     --log-file-format=FMT   log updates using the specified FMT
     --password-file=FILE    read daemon-access password from FILE
     --list-only             list the files instead of copying them
     --bwlimit=RATE          limit socket I/O bandwidth
     --write-batch=FILE      write a batched update to FILE
     --only-write-batch=FILE like --write-batch but w/o updating dest
     --read-batch=FILE       read a batched update from FILE
     --protocol=NUM          force an older protocol version to be used
     --iconv=CONVERT_SPEC    request charset conversion of filenames
     --checksum-seed=NUM     set block/file checksum seed (advanced)
 -4, --ipv4                  prefer IPv4
 -6, --ipv6                  prefer IPv6
     --version               print version number
(-h) --help                  show this help (see below for -h comment)

【问题及记录】

1,报错信息:rsync: getaddrinfo: xxxxxx 873: Temporary failure in name resolution

    字面解释:解析失败。

    错误原因:无法正常解析域名地址。

    解决方案:修改/etc/resolv.conf文件,添加对应DNS解析IP。

    [root@XXXX bak]# cat /etc/resolv.conf
    nameserver 114.114.114.114
    nameserver 8.8.8.8


【参考文件】

维基百科:https://zh.wikipedia.org/wiki/Rsync

rsync官网:https://www.samba.org/ftp/rsync/rsync.html

rsync配置文件文档:https://download.samba.org/pub/rsync/rsyncd.conf.html

酷壳的算法解析:https://coolshell.cn/articles/7425.html

Andrew Tridgell维基:https://en.wikipedia.org/wiki/Andrew_Tridgell