linux: rsync学习及踩坑

0.概述

什么是rsync?

rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。rsync是Linux系统下的文件同步和数据传输工具,它采用“rsync”算法,可以将一个客户机和远程文件服务器之间的文件同步,也可以在本地系统中将数据从一个分区备份到另一个分区上。如果rsync在备份过程中出现了数据传输中断,恢复后可以继续传输不一致的部分。rsync可以执行完整备份或增量备份。它的主要特点有:

可以镜像保存整个目录树和文件系统;可以很容易做到保持原来文件的权限、时间、软硬链接;无须特殊权限即可安装;可以增量同步数据,文件传输效率高,因而同步时间短;可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;支持匿名传输,以方便进行网站镜象等;加密传输数据,保证了数据的安全性;

rsync的优点与不足

与传统的cp、tar备份方式对比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如,定期地备份文件服务器数据到远端服务器,对本地磁盘定期进行数据镜像等。

但是随着系统规模的不断扩大,rsync的缺点逐渐被暴露了出来。首先,rsync做数据同步时,需要扫描所有文件后进行对比,然后进行差量传输。如果文件很大,扫面文件是非常耗时的,而且发生变化的文件往往是很少一部分,因此rsync是非常低效的方式。其次,rsync不能实时监测、同步数据,虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作一定会有时间差,可能导致服务器端和客户端数据出现不一致

1.rsync的安装与配置

测试环境为ubuntu 16.04 x64

安装的时候,使用apt-get install rsync

安装完,将/etc/default/rsync中的RSYNC_ENABLE设置为true,RSYNC_CONFIG_FILE更改为/etc/rsyncd.conf

使用service rsync start来启动rsync
创建/etc/rsyncd.conf。对于rsync的配置,分为主机和从机,即文件存在于主机上,向从机上推送进行同步。rsync主要是配置主机即服务器,从机只需要一个secrets.password文件。下面看看服务器rysnc服务器如何配置。(*号选项最好是必须有的)

motd file = /etc/rsyncd.motd  #服务器信息提示文件,在该文件中编写提示信息
transfer logging = yes    #*开启rsync数据传输日志功能
log file = /var/log/rsyncd.log  #*日志文件,可通过log format参数设置日志格式
pid file = /var/run/rsyncd.log    #*设置rsync进程号保存文件名称
lock file = /var/run/rsync.lock    #*设置锁文件名称
port = 873    #设置服务器监听的端口号,默认是873
address = 192.168.0.230    #设置本服务器所监听网卡接口的ip地址
uid = nobody    #*设置进行数据传输时所使用的帐户名或ID号,默认使用nobody
gid = nobody    #*设置进行数据传输时所使用的组名或GID号,默认使用nobody
#若为yes, rsync会首先进行chroot设置,将根映射在下面的path参数路径下,对客户端而言,系统的根就是path参数指定的路径。但这样做需要root权限,并且在同步符号连接资料时只会同步名称,不会同步内容。
use chroot = no
read only = yes    #是否允许客户端上传数据,yes表示不允许
max connections =10    #设置并发连接数,0表示无限
[common]    #*自定义模块名,rsync通过模块定义同步的目录,可定义多个
    comment = web content    #定义注释说明字串
    path = /common    #*同步目录的真是路径通过path指定
    ignore errors    #忽略一些IO错误
    #exclude = test/    #exclude指定path参数目录下某个目录可以不同步数据
    auth users = tom,jerry    #*设置允许连接服务器的账户,此账户是下面secrets file中设置的用户,可以是系统中不存在的用户
    secrets file = /etc/rysncd.secrets    #*密码验证文件名,该文件权限要求为只读,建议为600,仅在设置auth users后有效
    hosts allow = 192.168.0.0/255.255.255.0   #设置哪些主机可以同步数据,多ip和网段之间使用空格分隔
    hosts deny=*   #除了hosts allow定义的主机外,拒绝其他所有
    list = false   #客户端请求显示模块列表时,本模块名称是否显示,默认为true

secrets file的配置:
用户名:密码

tom:tom123
jerry:jerry456

记得设置权限为600,chmod 600 secrets.password

配置文件说明:

如果有多个目录需要同步,可以定义多个类似common的模块。

通过合理使用include和exclude选项,可以灵活同步指定目录下的某些数据。

从机上secrets.password只需要填写一个密码,跟主机的secrets file呼应。例如文件里写tom123

2.rsync常用的参数和工作模式

2.1常用参数

-v, –verbose 详细模式输出
-q, –quiet 精简输出模式
-c, –checksum 打开校验开关,强制对文件传输进行校验
-a, –archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, –recursive 对子目录以递归模式处理
-R, –relative 使用相对路径信息
-u, –update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, –links 保留软链结
-L, –copy-links 想对待常规文件一样处理软链结
–copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
–safe-links 忽略指向SRC路径目录树以外的链结
-H, –hard-links 保留硬链结
-p, –perms 保持文件权限
-o, –owner 保持文件属主信息
-g, –group 保持文件属组信息
-D, –devices 保持设备文件信息
-t, –times 保持文件时间信息
-S, –sparse 对稀疏文件进行特殊处理以节省DST的空间
-W, –whole-file 拷贝文件,不进行增量检测
-e, –rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
–rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, –cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
–existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
–delete 删除那些DST中SRC没有的文件
–delete-excluded 同样删除接收端那些被该选项指定排除的文件
–delete-after 传输结束以后再删除
–ignore-errors 及时出现IO错误也进行删除
–max-delete=NUM 最多删除NUM个文件
–partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
–force 强制删除目录,即使不为空
–numeric-ids 不将数字的用户和组ID匹配为用户名和组名
–timeout=TIME IP超时时间,单位为秒
-I, –ignore-times 不跳过那些有同样的时间和长度的文件
–size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
–modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T –temp-dir=DIR 在DIR中创建临时文件
–compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 –partial
–progress 显示备份过程
-z, –compress 对备份的文件在传输时进行压缩处理
–exclude=PATTERN 指定排除不需要传输的文件模式
–include=PATTERN 指定不排除而需要传输的文件模式
–exclude-from=FILE 排除FILE中指定模式的文件
–include-from=FILE 不排除FILE指定模式匹配的文件
–version 打印版本信息
–address 绑定到特定的地址
–config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
–port=PORT 指定其他的rsync服务端口
–blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
–progress 在传输时现实传输过程
–log-format=formAT 指定日志文件格式
–password-file=FILE 从FILE中得到密码
–bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, –help 显示帮助信息

常用的命令为avz, 可以结合下面的工作模式选择。

2.2常用的工作模式

假设主机为192.168.2.2  从机为192.168.2.3

1) rsync [OPTION]  SRC DEST       拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。如:rsync -a /var/www /backup

2) rsync [OPTION]  SRC [USER@]HOST:DEST      使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器,user和host使用的是从机的ssh账户密码和ip。当DST路径地址包含单个冒号”:”分隔符时启动该模式。如:rsync -avz /var/www zkeeer@192.168.2.3:/backup

3)  rsync [OPTION]   [USER@]HOST:SRC DEST    使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器,user和host使用的是从机的ssh账户密码和ip。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。如:rsync -avz zkeeer@192.168.2.3:/backup  /var/www

4)  rsync [OPTION]   [USER@]HOST::MODULE_NAME DEST     从远程rsync服务器中拷贝文件到本地机,这里user和host等使用的主机上的rsync配置。当SRC路径信息包含”::”分隔符时启动该模式。如:rsync -avz –password-file=/etc/secrets.password zkeeer@192.168.2.2::common  /backup

5)  rsync [OPTION]    SRC [USER@]HOST::DEST    从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式,其中DEST为远程服务器配置中的模块名,例如上面配置文件的common。如:rsync -avz  –password-file=/etc/secrets.password  /databack zkeeer@192.168.2.2::common

6)  rsync [OPTION]    rsync://[USER@]HOST[:PORT]/SRC [DEST]         列远程机的模块列表,上面配置中common。如:rsync  rsync://192.168.2.2

 

小结:1)上面命令中的SRC对于路径的‘/’特别敏感,当你使用/var/www时,会将www整个文件夹及其子目录同步到目标目录下。当时你用/var/www/时,会将www文件夹下的子目录同步到目标目录下

2)当你分不清那台机器应该写配置文件的时候,可以这么记:执行rsync命令的机子为从机,即执行rsync命令的机子只需要写password文件;不执行rsync命令的机子属于被动,需要写配置和secrets文件进行验证。

2.3 如何定期同步,可以使用crontab进行轮询执行rsync命令,如何使用crontab可以看我另一篇日志。

3.踩坑

3.1 使用rysnc –password-file参数时,注意password文件不要给执行权限,只能是600或者660,否则会出现

3.2 当使用crontab进行定期轮巡的时候,加入我定时为5分钟执行一次rsync命令,同步一次。当我遇到一个特别大的文件,不能在5分钟内同步完成,下一次轮巡启动rsync命令,检测到该大文件不在目标中,便会启动另一个rsync线程进行同步,循环往复,会启动多个进程来同步同于一个大文件,每个进程会写入不同的目标,当其中一个进程同步完成,另外的进程便会在同步完后检测到已存在该文件,将自己进程同步的文件丢弃,如此会消耗大量的带宽、cpu、内存资源。可以写个脚本,启动rsync命令前进行检测,是否已经有rsync进程在running了。

我只写到了我遇到过的,其他坑参考文章中有更多记录

参考文章:

1. rsync 远程同步记录–解决password-file权限问题。

2. Linux下rsync的用法

3. rsync文件同步详解

4. rsync你不知道的那些常见错误

发表评论

电子邮件地址不会被公开。 必填项已用*标注