运维同步rsync

Rsync(remote  rynchronization)是一款开源的、快速的、多功能的、可实现全量以及增量的本地或者远程数据同步的备份的优秀工具,可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能同时它在同步文件的同时可以保持原来文件的权限、时间、软硬链接等附加信息。可以再本地不同分区以及目录之间全量以及增量的复制数据,不是加密的,可以实现删除文件和目录的功能。在同步备份数据时,通过其独特的quick check算法,仅同步大小或者最后的修改时间发生变化的文件或者目录,当然也可以根据权限、属主等属性的变化同步,但需指定相应的参数,甚至可以实现只同步一个文件里面变化的部分,实现数据的差异化备份,所以可以实现快速的同步备份数据

一、Rsync大致使用三种主要的传输数据方式。

本地传输(local)

当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式

rsync -a /data /backup

rsync -b --suffix=.bak2 --backup-dir=/tmp/ /etc/passwd /home/passwd.bak

--suffix=xxx 指定旧备份文件的后缀名 --backup-dir=xxxx 指定将旧备份文件移动到哪个位置下

远程通道

传输 remote shell

利用ssh实现数据的远程传输,类似于 scp

rsync默认也是基于ssh来实现的,如果目标主机的ssh端口不是22,那么在用rsync的必须用-e选项

rsync通常都需要首先做密钥分发

rsync在远程传输文件的时候,仅仅会传输新文件

在进行文件传输过程中,必须使用对方主机上的一个用户,还必须知道其密码,而且该用户还要有权限

拉取: rsync -v -e "ssh -p 22" root@192.168.31.201:/home/passwd /tmp/
推送: rsync -v /root/c.sh root@192.168.31.201:/home/

守护进程传输 rsync的配置文件: /etc/rsyncd.conf(默认不存在)

本地传输、远程通道传输的本质是通过管道通信,即使是远程shell。而守护进程传输则是让远程主机上运行rsync服务,使其监听在一个端口上,等待客户端的连接。

但是,通过远程shell也能临时启动一个rsync daemon,这不同于守护进程传输,它不要求远程主机上事先启动rsync服务,而是临时派生出rsync daemon,它是单用途的一次性daemon,仅用于临时读取daemon的配置文件,当此次rsync同步完成,远程shell启动的rsync daemon进程也会自动消逝。此通信方式的命令行语法格式同"Access via rsync daemon",但要求options部分必须明确指定"--rsh"选项或其短选项"-e"。

远程shell连接的两端是通过管道完成通信和数据传输的,即使连接的一端是远程主机,当连接到目标端时,将在目标端上根据远程shell进程fork出rsync进程使其成为rsync server。而rsync daemon是事先在server端上运行好的rsync后台进程(根据启动选项,也可以设置为非后台进程),它监听套接字等待client端的连接,连接建立后所有通信方式都是通过套接字完成的。

注意,rsync中的server的概念从来就不代表是rsync daemon,server在rsync中只是一种通用称呼,只要不是发起rsync请求的client端,就是server端,你可以认为rsync daemon是一种特殊的server,其实daemon更应该称之为service

二、选项说明:

-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。

-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度 

信息的)。

-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。

-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。

-r --recursive:递归到目录中去。

-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下 

次更新检查出mtime不同从而导致增量传输无效。

-o --owner:保持owner属性(属主)。

-g --group:保持group属性(属组)。

-p --perms:保持perms属性(权限,不包括特殊权限)。

-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。

-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。

-z :-compress  传输时进行压缩以提高传输效率 --compress-level=num可按级别压缩。

-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括 

它们的属性。用法见下文示例。

--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。

-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响 

删除行为。

-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使 

用该选项将拷贝dir1但不拷贝file1。

--max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-

size=1.5m")

--min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。

--exclude :指定排除规则来排除不需要传输的文件。

排除单个文件:–exclude=5.txt

排除多个文件:–exclude={5.txt, 7.txt}

基于通配符做排除:–exclude=*txt

--delete :接收端的rsync会先删除目标目录下已经存在,但源端目录不存在的文件。以SRC为主,对DEST进 

行同步。多则删 之,少则补之。注意"--delete"是在接收端执行的,所以它exclude/include 

规则生效之后才执行的。

-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。

--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。

-e :指定所要使用的远程shell程序,默认为ssh。

--port :连接daemon时使用的端口号,默认为873端口。

--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证 

的密码,而是rsync模块认证的密码。

-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传 

输更高效。

--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上 

层目录不存在也不会传输。

--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。

--remove-source-files:要求删除源端已经成功传输的文件

三、配置文件

port=888    # 指定rsync端口。默认873
uid = rsync # rsync服务的运行用户,默认是nobody,文件传输成功后属主将是这个uid
gid = rsync # rsync服务的运行组,默认是nobody,文件传输成功后属组将是这个gid
use chroot = no # rsync daemon在传输前是否切换到指定的path目录下,并将其监禁在内
max connections = 200 # 指定最大连接数量,0表示没有限制
timeout = 300         # 确保rsync服务器不会永远等待一个崩溃的客户端,0表示永远等待
motd file = /var/rsyncd/rsync.motd   # 客户端连接过来显示的消息
pid file = /var/run/rsyncd.pid       # 指定rsync daemon的pid文件
lock file = /var/run/rsync.lock      # 指定锁文件
log file = /var/log/rsyncd.log       # 指定rsync的日志文件,而不把日志发送给syslog
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2  # 指定哪些文件不用进行压缩传输
 
###########下面指定模块,并设定模块配置参数,可以创建多个模块###########
[longshuai]        # 模块ID
path = /longshuai/ # 指定该模块的路径,该参数必须指定。启动rsync服务前该目录必须存在。rsync请求访问模块本质就是访问该路径。
ignore errors      # 忽略某些IO错误信息
read only = false  # 指定该模块是否可读写,即能否上传文件,false表示可读写,true表示可读不可写。所有模块默认不可上传
write only = false # 指定该模式是否支持下载,设置为true表示客户端不能下载。所有模块默认可下载
list = false       # 客户端请求显示模块列表时,该模块是否显示出来,设置为false则该模块为隐藏模块。默认true
hosts allow = 10.0.0.0/24 # 指定允许连接到该模块的机器,多个ip用空格隔开或者设置区间
hosts deny = 0.0.0.0/32   # 指定不允许连接到该模块的机器
auth users = rsync_backup # 指定连接到该模块的用户列表,只有列表里的用户才能连接到模块,用户名和对应密码保存在secrts file中,
                          # 这里使用的不是系统用户,而是虚拟用户。不设置时,默认所有用户都能连接,但使用的是匿名连接
secrets file = /etc/rsyncd.passwd # 保存auth users用户列表的用户名和密码,每行包含一个username:passwd。由于"strict modes"
                                  # 默认为true,所以此文件要求非rsync daemon用户不可读写。只有启用了auth users该选项才有效。
[xiaofang]    # 以下定义的是第二个模块
path=/xiaofang/
read only = false
ignore errors
comment = anyone can access

#客户端推到服务端时,文件的属主和属组是配置文件中指定的uid和gid。但是客户端从服务端拉的时候,#文件的属主和属组是客户端正在操作rsync的用户身份,因为执行rsync程序的用户为当前用户。

#auth users和secrets file这两行不是一定需要的,省略它们时将默认使用匿名连接。但是如果使用了#它们,则secrets file的权限必须是600。客户端的密码文件也必须是600。

#关于secrets file的权限,实际上并非一定是600,只要满足除了运行rsync daemon的用户可读即可。##是否检查权限的设定是通过选项strict mode设置的,如果设置为false,则无需关注文件的权限。但默认是#yes,即需要设置权限。

#配置完后,再就是提供模块相关目录、身份验证文件等

四、Inotify介绍

Inotify可用于检测单个文件,也可以检测整个目录。当检测的对象是一个目录的时候,目录本身和目录里的内容都会成为检           测的对象。

参数:

-e: 事件      -d:后台运行       -m:始终保持事件监听状态       -q:打印很少的信息,仅仅打印监控事件的信息 安静状态

-r :递归查询目录                     -timefmt:指定时间输出的格式      -excluder:排除文件或者目录的时候不区分大小写

注解:

当发送端敲出rsync命令后,rsync将立即扫描命令行中给定的文件和目录(扫描过程中还会按照目录进行排序,将同一个目录的文件放在相邻的位置),这称为拷贝树(copy tree),扫描完成后将待传输的文件或目录记录到文件列表中,然后将文件列表传输给接收端。而筛选规则的作用时刻是在扫描拷贝树时,所以会根据规则来匹配并决定文件是否记录到文件列表中(严格地说是会记录到文件列表中的,只不过排除的文件会被标记为hide隐藏起来),只有记录到了文件列表中的文件或目录才是真正需要传输的内容。换句话说,筛选规则的生效时间在rsync整个同步过程中是非常靠前的,它会影响很多选项的操作对象,最典型的如"--delete",实际上,排除规则和包含规则都只是"--filter"筛选规则的两种特殊规则。"--filter"比较复杂,它有自己的规则语法和匹配模式

以下是rsync中的规则种类,不解之处请结合下文的"--delete"分析:

(1).exclude规则:即排除规则,只作用于发送端,被排除的文件不会进入文件列表(实际上是加上隐藏规则进行隐藏)。

(2).include规则:即包含规则,也称为传输规则,只作用于发送端,被包含的文件将明确记录到文件列表中。

(3).hide规则:即隐藏规则,只作用于发送端,隐藏后的文件对于接收端来说是看不见的,也就是说接收端会认为它不存在于源端。

(4).show规则:即显示规则,只作用于发送端,是隐藏规则的反向规则。

(5).protect规则:即保护规则,该规则只作用于接收端,被保护的文件不会被删除掉。

(6).risk规则:即取消保护规则。是protect的反向规则。

除此之外,还有一种规则是"clear规则",作用是删除include/exclude规则列表,如果将"--delete"选项和"--exlcude"选项一起使用,则被排除的文件不会被删除。

在发送端将文件列表发送给接收端后,接收端的generator(要是不知道,你认为是某个就好了)进程会扫描每个文件列表中的信息,然后对列表中的每个信息条目都计算数据块校验码,最后将数据库校验码发给发送端,发送端通过校验码来匹配哪些数据块是需要传输的,这样就实现了增量传输的功能——只传输改变的部分,不会传输整个文件。而delete删除的时间点是generator进程处理每个文件列表时、生成校验码之前进行的,先将目标上存在但源上不存在的多余文件删除,这样就无需为多余的文件生成校验码。

所以,delete动作是比"--exclude"规则更晚执行的,被"--exlcude"规则排除的文件不会进入文件列表中,在执行了delete时会认为该文件不存在于源端,从而导致目标端将这些文件删除。但这是想当然的,尽管理论上确实是这样的,但是rsync为了防止众多误删除情况,提供了两种规则:保护规则(protect)和取消保护规则(risk)。默认情况下,"--delete"和"--exclude"一起使用时,虽然发送端的exclude规则将文件标记为隐藏,使得接收端认为这些被排除文件在源端不存在,但rsync会将这些隐藏文件标记为保护文件,使得它们不受delete行为的影响,这样delete就删除不了这些被排除的文件。如果还是想要强行删除被exclude排除的文件,可以使用"--delete-excluded"选项强制取消保护,这样即使被排除的文件也会被删除。

那么现在,是否理解了网上的言论"exclude排除的文件不会被删除"?

除了"--delete",相关的选项还有"--delete-before"、"--delete-during"、"--delete-delay"等,它们都隐含了"--delete"选项,它们分别表示generator处理各个文件列表之前一次性全部删除待删除文件、处理文件列表时处理到哪个文件列表就删除该文件列表中的待删除文件,以及同步完所有数据后一次性删除所有待删除文件。

举个例子,假如源端要传输3个目录a、b、c,在目标端a目录中有a1、a2、a3共3个文件需要被删除,b目录中有b1、b2、b3需要删除,同理c目录也一样c1、c2、c3需要被删除。

如果是"--delete-before",则在目标端rsync刚启动时,就会把a1-a3、b1-b3、c1-c3一次性删除,然后才会处理文件列表中的a目录,处理完a后处理b,再是c。

如果是"--delete-during",则在目标端rsync刚启动时,先处理文件列表中的a目录,处理a目录时发现此目录中有待删除文件a1-a3,顺手就删除它们,然后完成a目录的相关操作,再处理文件列表中的b目录,发现也有待删除文件b1-b3,顺手删除它们,同理c1-c3也如此。

如果是"--delete-delay",则同步完文件列表中的a/b/c目录后,最后一次性删除a1-a3、b1-b3、c1-c3。

其实"--delete"选项大多数情况下默认采用的就是"--delete-during"

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章