rsync

0. 写在前面 从事技术工作已经有一些时间了,平时也有做些笔记、写些文档,但一直没有认真的写过一篇技术博文。平时遇到问题时,在网上搜索的解决方法大多都是在博客里,突然觉得自己也有必要将一些熟悉的技术撰写成文,为网友们贡献一点绵薄之力。由于自己的知识有限,文中难免存在一些纰漏或认知方面的错误,还请各位大神留言指正,非常感谢!

1. 概览 Rrsync(Remote synchronization)是一款开源的、快速的、多功能的、全量和增量的、远程或本地的、文件级别的数据同步工具。不仅适用于Linux平台,还可以在Unix和windows上进行部署和使用。它的远程复制功能类似于ssh的scp,但优于scp,因为scp每次拷贝都是全量的,而rsync则可以做到增量复制;它还可以用于本地不同目录间的文件复制,类似于cp命令,但同样优于cp,因为它实现的是增量复制;rsync 还可以使用—delete选项来实现类似rm命令的功能,能够对某个目录进行删除操作。rsync在进行数据同步时,使用其独有的quick check算法,实现仅同步变更的权限信息和文件内容,进而实现快速的数据同步备份功能。在CentOS5系列的系统中,默认使用的是rsync2.x,它的工作原理是先进行文件对比,然后再进行数据同步;而在CentOS6.x系列的系统中,默认使用的rsync3.x则是边进行文件对比,边做数据同步,因此其性能更好。
2. 特性

  • 支持拷贝特殊的文件,如链接文件和设备文件
  • 可以在同步时设定排除的文件或目录
  • 可以在同步的过程中保持源文件的权限、时间戳、属组等属性信息
  • 默认即可实现数据的增量同步
  • 可使用ssh进行加密的远程数据同步
  • 可以通过socket(daemon)进行文件和数据的传输
  • 支持匿名和认证(非系统用户)的数据传输方式
3. 应用场景
3.1 非用户数据

通过cron将多台服务器的数据定时同步到备份服务器。这些数据主要为非存储和数据库的集群节点配置数据和代码。
3.2 用户数据 通过sersync、inotify或lrsyncd将多台服务器的数据实时同步到备份服务器。这些数据主要为存储服务器的数据,由用户产生,因此非常重要。当然,更大的环境中实现服务器间数据同步可能需要功能更强大的drbd(块级别)或程序双写。
4. 工作模式和语法 4.1 三种模式

本地模式,使用语法如下: rsync [OPTION...] SRC... [DEST] 远程shell模式,使用语法如下: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DEST 在此模式下,我们可以使用-e选项指定使用ssh进行传输的加密,如下所示: rsync -avzP -e ‘ssh -p 22’ /etc root@10.0.0.41:/tmp socket(daemon)模式,使用语法如下: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST 在此模式下的加密方式只能再传输数据之前使用技术创建加密隧道。其实大部分情况下,rsync的传输处于内网,根本没有加密的必要性。


4.2 常用选项

-a –archive 归档模式。是rtopglD7个选项功能的集合。 -v --verbose显示复制过程信息 -z –compress 在数据传输时进行压缩,以提高效率。--compress-level=NUM可按级别进行压缩。 -r –recursive 递归传输 -t –times 保持文件时间信息 -o –owner 保持文件属主信息 -p –perms 保持文件权限信息 -g –group 保持文件属组信息 -D –devices 保持设备文件信息 -l –links 当是复制的文件为软链接时,复制软链接文件本身,而非源文件。 -P 同时可实现--partial 和—progress两个选项的功能,即使用断线续传并显示传输进度。 -e –rsh=COMMAND 使用信道协议,例如ssh,即实现加密传输。 --exclude=PATTERN 指定排除不需要传输的文件 --exclude-from=file 指定排除不需要传输的文件名所在的文件 -bwlimit=RATE 指定传输文件的最大速度,例如100,则表示最高每秒不能超过100k --delete 让目标文件和源文件完全一致



5. 本地复制和远程数据推拉 5.1 本地进行数据拷贝
使用rsync将/mnt目录下的所有文件删除 [root@backup /]# rsync -avz --delete /tmp/test/ /mnt/ 注意:源目录最后加上斜线,是将源目录下的所有文件复制到目标目录下; 源目录最后不加斜线,是将整个源目录和下面的所有文件复制到目标目录下。


5.2 使用远程shell的方式进行数据推拉
使用加密方式将本地目录下的文件和目录拷贝至远端服务器的/mnt目录 [root@backup mnt]# rsync -avz /mnt/ -e 'ssh -p 22' root@172.16.1.31:/mnt/ The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established. RSA key fingerprint is 83:70:a4:4b:53:2f:f8:0f:e5:1d:f2:16:3c:1b:fc:3f. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '172.16.1.31' (RSA) to the list of known hosts. root@172.16.1.31's password: sending incremental file list 使用加密的方式将远端服务器/mnt目录下的文件和目录拉取到本地目录下 [root@backup mnt]# rsync -avz root@172.16.1.31:/mnt/ /mnt/ root@172.16.1.31's password: receiving incremental file list


6. 以守护进程(socket)的方式传输数据 6.1 概览 这种工作模式是我们最常用的模式,也是相对而言最复杂的模式(其实很简单),我们必须熟练掌握。它是将rsync配置为一个处于监听状态的服务,然后在远端将数据推送到rsync服务器上,以实现数据备份。

6.2 检查部署环境 操作系统和内核版本

[root@backup ~]# cat /etc/redhat-release ; uname -r CentOS release 6.7 (Final) 2.6.32-573.el6.x86_64


6.3 确认软件是否安装
[root@backup ~]# rpm -qa rsync rsync-3.0.6-12.el6.x86_64


6.4 编写配置文件 rsync的主配置文件为/etc/rsyncd.conf,默认不存在,我们需要手动创建,配置内容如下:

[root@backup ~]# cat /etc/rsyncd.conf ##rsyncd.conf start## uid = rsync 客户端对服务端提供的目录操作时,调用此用户对目录的操作进行权限匹配 gid = rsync 客户端对服务器提供的目录操作时,调用此用户组对目录的操作进行权限匹配 use chroot = no 是否允许客户切换到其它目录 max connections = 200 服务端最大的连接数 timeout = 300客户端链接后的超时时间 pid file = /var/run/rsyncd.pid进程对应的进程号文件 lock file = /var/run/rsync.lock 进程对应的锁文件 log file = /var/log/rsyncd.log 记录日志的文件 ignore errors 忽略错误 read only = false可写 list = false不允许列表 hosts allow = 172.16.1.0/24 允许的客户端网段 #hosts deny = 0.0.0.0/32拒绝的客户端网段 auth users = rsync_backup客户端在进行连接时所使用的认证账号,此账号非系统用户 secrets file = /etc/rsync.password认证账号和密码存储的文件 [backup] 服务端提供可访问目录的模块名 path = /backup服务端提供的可访问目录 [oldboy]服务端提供可访问目录的模块名 path = /oldboy 服务端提供的可访问目录 #rsync_config_______________end


6.5 添加用户
[root@backup ~]# useradd rsync -s /sbin/nologin -M [root@backup ~]# id rsync uid=500(rsync) gid=500(rsync) groups=500(rsync) 注:无需设置家目录、可登陆shell和密码


6.6 创建目录
[root@backup ~]# mkdir -p /backup /oldboy [root@backup ~]# chown rsync.rsync /backup /oldboy [root@backup ~]# ll -d /backup /oldboy drwxr-xr-x. 2 rsync rsync 4096 Apr 19 20:01 /backup drwxr-xr-x. 2 rsync rsync 4096 Apr 19 20:01 /oldboy


6.7 启动服务
[root@backup ~]# rsync --daemon [root@backup ~]# ps -ef|grep rsync|grep -v grep root2730010 20:04 ?00:00:00 rsync --daemon [root@backup ~]# lsof -i :873 COMMANDPID USERFDTYPE DEVICE SIZE/OFF NODE NAME rsync27300 root3uIPv4363810t0TCP *:rsync (LISTEN) rsync27300 root5uIPv6363820t0TCP *:rsync (LISTEN) [root@backup ~]# netstat -ntupl|grep 873 tcp00 0.0.0.0:8730.0.0.0:*LISTEN27300/rsync tcp00 :::873:::*LISTEN27300/rsync


6.8 将服务启动命令添加至/etc/rc.local脚本中
[root@backup ~]# sed -i '$ a/usr/bin/rsync --daemon' /etc/rc.local [root@backup ~]# tail -1 /etc/rc.local /usr/bin/rsync –daemon

6.9 创建rsync服务的虚拟用户和密码文件
[root@backup ~]# echo "rsync_backup:oldboy" > /etc/rsync.password [root@backup ~]# cat /etc/rsync.password rsync_backup:oldboy [root@backup ~]# chmod 600 /etc/rsync.password [root@backup ~]# ll /etc/rsync.password -rw-------. 1 root root 20 Apr 19 20:06 /etc/rsync.password


6.10 关闭防火墙和selinux
[root@backup ~]# /etc/init.d/iptables stop iptables: Setting chains to policy ACCEPT: filter[OK] iptables: Flushing firewall rules:[OK] iptables: Unloading modules:[OK] [root@backup ~]# /etc/init.d/iptables status iptables: Firewall is not running. [root@backup ~]# getenforce Enforcing [root@backup ~]# setenforce 0 [root@backup ~]# getenforce Permissive [root@backup ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config [root@backup ~]# grep SELINUX= /etc/selinux/config # SELINUX= can take one of these three values: SELINUX=disabled [root@backup ~]# chkconfig iptables off [root@backup ~]# chkconfig |grep iptables iptables0:off1:off2:off3:off4:off5:off6:off


6.11 客户端配置
[root@nfs01 ~]# echo "oldboy" > /etc/rsync.password [root@nfs01 ~]# chmod 600 /etc/rsync.password [root@nfs01 ~]# ll /etc/rsync.password -rw-------. 1 root root 7 Apr 19 20:12 /etc/rsync.password [root@nfs01 ~]# cat /etc/rsync.password oldboy


6.12 在客户端手动执行文件推拉
将本地/mnt目录下的所有文件推送到服务端的/backup目录下 rsync -avzP /mnt/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password 将服务端/backup目录下的所有文件拉取到本地的/tmp目录下 rsync -avzP rsync_backup@172.16.1.41::backup /tmp/ --password-file=/etc/rsync.password 在客户端,将服务端/backup目录下的所有文件删除 rsync -avzP --delete /data/ rsync://rsync_backup@172.16.1.41:873/backup --password-file=/etc/rsync.password 在服务端的/backup目录下创建一个test目录,并将其属主和属组修改为rsync,然后在客户端将本地的/mnt目录下的所有文件推送到服务端的/backup/test目录中 [root@backup ~]# mkdir -p /backup/test [root@backup ~]# chown rsync.rsync /backup/test [root@backup ~]# ll /backup/test -d drwxr-xr-x. 2 rsync rsync 4096 Apr 19 20:42 /backup/test [root@nfs01 ~]# rsync -avzP /mnt/ rsync://rsync_backup@172.16.1.41/backup/test --password-file=/etc/rsync.password 注:以上推拉命令中的backup均为模块名,而非目录名。在客户端的/mnt目录中创建26个文件,文件名为26个字母。将/mnt目录下的所有文件推送到服务端的/oldboy目录下,但排除掉a、b、c三个文件 方法一: [root@nfs01 ~]# rsync -avzP --exclude=a --exclude=b --exclude=c /mnt/ rsync://rsync_backup@172.16.1.41/backup --password-file=/etc/rsync.password 方法二: [root@nfs01 mnt]# rsync -avz --exclude={a..c} /mnt/ rsync://rsync_backup@172.16.1.41:873/backup --password-file=/etc/rsync.password 方法三: [root@nfs01 mnt]# rsync -avz --exclude={a,b,c} /mnt/ rsync://rsync_backup@172.16.1.41/backup --password-file=/etc/rsync.password 方法四: [root@nfs01 mnt]# echo -e "a\nb\nc" > /tmp/paichu.txt [root@nfs01 mnt]# cat /tmp/paichu.txt a b c [root@nfs01 mnt]# rsync -avz --exclude-from=/tmp/paichu.txt /mnt/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password


6.13 服务重启 一般情况下,Linux上的服务在更改配置文件后需要重载或重启服务才能使配置文件中新增的内容生效,因为服务器在启动时会将配置文件中的内容加载到内存中,以提高配置文件内容的读取速度。我们来看一下rsync的服务如何重启。

[root@backup backup]# pkill rsync [root@backup backup]# ps -ef|grep rsync|grep -v grep [root@backup backup]# rsync --daemon [root@backup backup]# lsof -i :873 COMMANDPID USERFDTYPE DEVICE SIZE/OFF NODE NAME rsync27524 root3uIPv4381000t0TCP *:rsync (LISTEN) rsync27524 root5uIPv6381010t0TCP *:rsync (LISTEN) [root@backup backup]# ps -ef|grep rsync|grep -v grep root2752410 21:12 ?00:00:00 rsync --daemon


7. 企业案例 7.1 案例1 某DBA在做数据同步时,导致用户无法访问网站。
导致此问题出现有两点原因:
1、不是在业务低估进行数据备份,给服务器造成压力;
2、没有对数据同步的速度进行控制,给服务器的网络造成拥塞。
总结:
1、服务器的周期性维护、更新或变更工作应当尽量放在业务低估进行;
2、通过网络进行数据传输时,我们应当考虑是否对其最大传输服务器进行限制。

7.2 案例2 某视频网站的视频发布是通过rsync的推送进行的,本地推送目录只会放置当前发布的视频内容,服务器端拥有以前所有的视频内容,在这种情况下执行了如下命令:
rsync -avz –delete /backup rsync_backup@172.16.1.41::backup –password-file=/etc/rsync.password
结果当然是服务器以前的所有视频文件都被删除了,仅上下当前推送上去的视频内容。
这是一个惨痛的教训,我们平时在生产环境中应尽量不使用带有删除功能的命令或选项。

8. rsync 优缺点
作为Linux运维工程师,我们平时在使用各种服务软件的过程中,了解其优缺点,是一件非常重要的事情。就像你娶老婆一样,如果你连她的优缺点都不清楚就和她结婚,这是非常不负责任的
优点:
1、增量备份,支持socket(daemon)模式,可集中备份(以客户端为参照物进行数据的推拉)
2、远程shell通道模式,可使用ssh进行传输加密;如果是daemon模式,可理由技术进行加密
缺点:
1、大量小文件同步时,对比的时间会较长,在这个过程中出现进程停止的可能性非常大
2、同步大文件(10G+)有时也会出现中断的情况;未同步完成的文件,在目的端是影藏文件,可以在同步时使用断线续传的参数缓解此问题。
总结:
rsync具有增量、集中备份和加密传输的优秀特性,但其对大量文件和大文件环境的支持欠佳,因此我们在使用之前应进行严密的压测和需求与功能评估。
9. 排错思想

想成为一名高级运维工程师,快速解决故障的能力是最基本的要求。任何事情都是有章可循的,故障排错也不例外,下面我将介绍一下排错的基本思想。
首先,我们队产生故障的服务或软件应当具有熟练部署的能力;其次,我们应当理解故障相关的服务和软件的工作原理;最后,我们应当具备分析命令错误提示和日志信息的能力。具备了这些能力,排错起来不会再手忙脚乱,而是有一个标准的流程。













【rsync】


    推荐阅读