rsync的原理及使用
第1章 rsync原理及介绍
1.1什么是rsync
Rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。Rstync软件适用于unix/linux/windows等多种操作系统平台。
Rsync英文全称为Remotesynchronization,即远程同步。从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似ssh带的scp命令,但又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,Rsync还可以在本地主机的不通分区或目录之间全量及增量的复制数据,这又类似cp命令,但同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。此外,利用Rsync还可以实现删除文件和目录功能,这又相当于rm命令。
一个rsync相当于scp,cp,rm,并且优于他们每一个命令。
在同步备份数据时,默认情况下,Rsync通过其独特的”quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可以根据权限,属主等属性的变化同步,但需要制定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可以实现快速的同步备份数据。
小知识:
传统的cp,scp工具拷贝每次均为完全拷贝,而rsync除了可以完整拷贝外,还具有增量拷贝的功能,因此,从同步数据的性能及效率上,Rsync工具更胜一筹。
CentOS5,rsync2.x对比方法,把所有的文件对比一遍,然后进行同步。
CentOS6,rsync3.x对比方法,一边对比差异,一边对差异的部分进行同步。
1.2rsync的特性
支持拷贝特殊文件如链接文件,设备等。
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
可以做到保持源文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变-p。
可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高。
可以使用rcp,rsh,ssh等方式来配合传输文件(rsync本身对数据不加密)。
可以通过sockert(进程方式)传输文件和数据(服务端和客户端)。
支持匿名或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像。
注意:需要注意拷贝的时候源目录加“/”和不加“/”的区别(加“/”表示只拷贝该目录之下的文件;不加“/”表示连该目录一起拷贝)
1.3rsync的应用场景
定时备份
可以通过crond + rsync 来实现
实时备份
可以通过inotify(sersync)+ rsync来实现
1.4inotify命令参数
作为客户端命令,常用参数如下(可通过man rsync命令来查看相关文档):
-avz --多个参数的集合
-v, --verbose 详细模式输出,传输时的进度等信息
-z, --compress 传输时进行压缩以提高传输效率,--compress-level=NUM可按级别压缩。
-a,--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl
-r,--recursive 对子目录以递归模式,即目录下所有目录有同样传输
-t,--times,保持文件时间信息
-o,--owner 保持文件属主信息
-p,--perms 保持文件权限
-g,--group 保持文件属组信息
-P,--progress 显示同步的过程及传世时的进度等信息(大写的P)
-D,devices 保持设备文件信息
-l,--links 保持软链接
-e,--rsh=COMMAND 使用的信道协议,指替代rsh的shell程序。例如:ssh
-exclude=PATTERN指排斥不需要传输的文件模式
--bwlimit=RATE 限速,默认是以kbit/s为单位
--delete --删除(本地没有,远端也没有),让目标目录SRC和源目录数据DST一致,适用于两个目录完全一样
1.5inotify的3种工作模式
inotify的工作模式可分为如下三类:
q 本地模式
q 远程shell模式
q 守护进程模式
1.5.1本地模式
Rsync的本地模式,即将本地系统的文件或目录从一个目录移动到另外一个目录中,相当于一个系统命令来使用(不常用)。
命令格式如下:
rsync [OPTION...]SRC... [DEST]
举例:使用rsync拷贝文件或目录
[root@server ~]# rsync /etc/hosts /mnt/[root@server ~]# ls /mnt/hosts/mnt/hosts
1.5.2远程shell模式
Rsync的远程shell模式,即将本地系统文件或目录从一台服务器传输向另外一台服务器,类似于scp命令。既可以推送数据到其他服务器,也可以下拉文件到本地。(该模式也不常用)
远程模式命令格式如下:
Pull: rsync[OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync[OPTION...] SRC... [USER@]HOST:DEST
举例:将一个文件传输到另外一台服务器
[root@client tmp]# rsync -avz /etc/hostsroot@172.16.1.41:/mnt/ The authenticity of host '172.16.1.31(172.16.1.31)' can't be established.RSA key fingerprint is8a:17:83:e9:d5:61:74:08:cb:e0:94:ad:5f:13:f7:04.Are you sure you want to continue connecting(yes/no)? yesWarning: Permanently added '172.16.1.31' (RSA) tothe list of known hosts.root@172.16.1.31's password:sending incremental file listhosts sent 124 bytes received 31 bytes 34.44 bytes/sectotal size is 158 speedup is 1.02
举例:将另外一台主机的文件下载到本地
[root@client ~]# rsync -avzserver:/etc/hosts /tmp/The authenticity of host 'server (172.16.1.41)'can't be established.RSA key fingerprint is25:bf:97:ec:0a:aa:60:12:10:f2:04:19:9a:28:54:ce.Are you sure you want to continue connecting(yes/no)? yesWarning: Permanently added 'server,172.16.1.41'(RSA) to the list of known hosts.root@server's password:receiving incremental file listhosts sent 30 bytes received 199 bytes 50.89bytes/sectotal size is 312 speedup is 1.36[root@client ~]# ls /tmp/hosts
加密传输(隧道传输)
Rsync的传输协议默认是不加密的明文传输,如果有加密传输文件的需求,可以自定义加密管道管道协议。使用参数:-e来指定相应的管道协议。
举例:跨主机加密传输文件,指定ssh协议
[root@client tmp]# rsync -avz /etc/hosts -e 'ssh -p 22' root@172.16.1.41:/mnt/root@172.16.1.31's password:sending incremental file list sent 30 bytes received 12 bytes 4.42 bytes/sectotal size is 158 speedup is 3.76
提示:使用-e参数,指定加密的协议以及协议的端口号
限速传输
Rsync的传输默认是不限速的,传输时可能会占用很大的网络带宽,影响业务正常使用。可以使用参数:-bwlimit来限制传输时的网络带宽
例:传输时限速为1M/s
[root@server tmp]# ddif=/dev/zero of=test bs=1M count=10 #<创建一个10M的文件10+0 records in10+0 records out10485760 bytes (10 MB) copied, 0.0173987 s, 603MB/s[root@server tmp]# ls -lh test-rw-r--r-- 1 root root 10M Oct 24 17:06 test[root@backup tmp]# rsync-avz -e 'ssh -p 22' test root@172.16.1.31:/mnt/ #<普通传输root@172.16.1.31's password:sending incremental file listtest sent 10275 bytes received 31 bytes 2944.57 bytes/sectotal size is 10485760 speedup is 1017.44[root@backup tmp]# rsync -avz -e 'ssh -p 22' --bwlimit=1024 testroot@172.16.1.31:/mnt/ #<==好像没有起作用?其实不是,bwlimit的参数默认为1K bits/sroot@172.16.1.31's password:sending incremental file listtest sent 10275 bytes received 31 bytes 2944.57 bytes/sectotal size is 10485760 speedup is 1017.44[root@nfs01 tmp]# rsync -avz -e 'ssh -p 22' --bwlimit=1root@172.16.1.31:/mnt/The authenticity of host '172.16.1.31(172.16.1.31)' can't be established.RSA key fingerprint is8a:17:83:e9:d5:61:74:08:cb:e0:94:ad:5f:13:f7:04.Are you sure you want to continue connecting(yes/no)? yesWarning: Permanently added '172.16.1.31' (RSA) tothe list of known hosts.root@172.16.1.31's password:receiving incremental file listdrwxr-xr-x 4096 2017/10/24 17:10:45 .-rw-r--r-- 10485760 2017/10/24 17:06:48 test sent 11 bytes received 49 bytes 763.41 bytes/sectotal size is 10485760 speedup is 174762.67
文件备份时需注意的事项:
1、备份要考虑带宽限速(rsync,scp,ftp都有限速功能)
2、备份要选择业务低谷
1.5.3Daemon模式
Daemon,即守护进程。该模式是在一台rsync服务器上安装并运行一个rsync的服务进程,其他的客户端通过rsync命令上传文件到服务器中。该模式是rsync最常用的功能,用来做数据的定时或者实时备份,下面来具体安装和介绍daemon模式。
Rsync服务端口:[root@server tmp]# cat /etc/services |awk '$1~/^rsync$/{print $0}'rsync 873/tcp # rsyncrsync 873/udp # rsync
第2章 Daemon模式的安装与配置
2.1系统拓扑图
2.2服务规划
2.2.1服务器规划表
rsync服务器端 |
1台 |
运行rsync进程,提供远程同步服务 |
rsync客户端 |
1台 |
提供需要同步的文件或目录,向服务器端推送数据 |
说明:总共需要2台服务器完成本次项目 |
2.2.2主机IP规划表
服务器说明 |
IP地址 |
主机名称规则 |
rsync服务器端 |
172.16.1.41/24 |
server |
rsync客户端 |
172.16.1.8/24 |
client |
2.2.3主机名解析
172.16.1.41 server
172.16.1.8 client
2.3安装环境
2.3.1操作系统版本
[root@server ~]# cat /etc/redhat-releaseCentOS release 6.5 (Final)[root@server ~]# uname -r2.6.32-431.el6.x86_64[root@server ~]# uname -mx86_64
2.3.2rsync软件版本
[root@server ~]# rsync -versionrsync version 3.0.6 protocol version 30Copyright (C) 1996-2009 by Andrew Tridgell, WayneDavison, and others.Web site: http://rsync.samba.org/[root@server ~]# rpm -qa rsyncrsync-3.0.6-9.el6_4.1.x86_64
2.4软件安装
安装完操作系统之后,系统默认会自动安装Rsync服务,可以使用以下命令查看Rsync服务是否安装。如果有返回值,则说明已经安装好。
[root@server tmp]# rpm -qa rsyncrsync-3.0.6-9.el6_4.1.x86_64
如果默认没有安装,可以通过yum的命令进行安装:
[root@server tmp]# yum install rsync -y
2.5服务器端的配置
2.5.1创建并修改配置文件
/etc/rsyncd.conf
该配置文件时rsync服务器端默认的配置文件,该文件默认不存在,需要自己手动创建!填入内容如下:
[root@server etc]# touch/etc/rsyncd.conf && vim /etc/rsyncd.conf[root@server etc]# cat rsyncd.confuid = rsync #<==配置用户,远端命令要使用rsync用户访问共享目录(访问目录的权限)gid = rsync #<==配置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 #<==定义日志文件[backup] #<==配置一个数据存储的模块path = /backup #<==模块备份数据路径ignore errorsread only = falselist = falsehosts allow = 172.16.1.0/24,172.25.1.0/24 #<==配置登录权限,可以多个IP网段用逗号隔开#hosts deny = 0.0.0.0/32auth users = rsync_backup #<==配置匿名服务登录用户(访问服务的权限)secrets file = /etc/rsync.password#<==配置匿名用户和密码文件
注意:该配置文件内需添加的内容可以通过命令man rsyncd.conf来查看
2.5.2创建rsync用户
创建用户名为rsync的用户,只让其运行程序,不给其登录系统的权限以及家目录,创建用户命令如下:
[root@server etc]# useradd rsync -s /sbin/nologin -M[root@server etc]# tail -1 /etc/passwdrsync:x:500:500::/home/rsync:/sbin/nologin
提示:-s /sbin/nologin 表示不让用户有登录系统的权限;-M表示不给用户家目录
2.5.3创建数据存储路径
创建目录/data,并将其所属用户和用户组修改为rsync,因为程序需要用rsync用户来访问这个目录,如果rsync没有权限访问该目录,那么客户端也无法上传文件到备份目录。命令如下:
[root@server etc]# mkdir /backup #<==创建/backup目录[root@server etc]# chown rsync.rsync /backup/ #<==修改/backup目录的用户及用户组[root@server etc]# ls -ld /backup/drwxr-xr-x 2 rsync rsync 4096 Oct 2322:23 /backup/
2.5.4创建虚拟用户文件
/etc/rsync.password
rsync有一个重要的特性,就是可以使用一个虚拟的用户(不是实际存在的用户)来访问系统服务。为了使用这个功能,我们需要创建一个虚拟的用户文件,该文件已经在rsyncd.conf配置文件里面的secrets file定义好了,是/etc/rsync.password文件
该文件内容格式为:虚拟用户:用户密码,命令如下:
[root@server etc]# echo "rsync_backup:123456" > /etc/rsync.password[root@server etc]# cat/etc/rsync.passwordrsync_backup:123456
注意:文件创建完成之后,需要修改文件的权限属性为600,否则程序无法正常运行!!
[root@server etc]# chmod 600 /etc/rsync.password #<==修改文件的权限属性为600[root@server etc]# ls -l/etc/rsync.password-rw------- 1 root root 20 Oct 23 22:26/etc/rsync.password
2.5.5添加服务开机启动
将rsync服务的启动命令写入到开机启动文件/etc/rc.local里面,实现服务的开机自启动,命令如下:
[root@server ~]# echo '/usr/bin/rsync --daemon' >> /etc/rc.local [root@server ~]# tail -1 /etc/rc.localtail: inotify cannot be used, revertingto polling #<==软链接的问题,可以忽略。/usr/bin/rsync --daemon
2.6客户端的配置
2.6.1创建并修改配置文件
/etc/rsync.password
相对于服务器端来说,客户端的配置很简单,只需要创建一个密码文件就行了。这个密码文件也是默认不存在,需要手动创建。
[root@client mnt]# touch/etc/rsync.password[root@client mnt]# echo "123456" > /etc/rsync.password[root@client mnt]# cat/etc/rsync.password123456
同理,该配置文件也需要修改权限为600
[root@client mnt]# chmod 600 /etc/rsync.password[root@client mnt]# ls -l/etc/rsync.password-rw------- 1 root root 7 Oct 23 22:34/etc/rsync.password
第3章 rsync的使用
3.1rsync服务启停
3.1.1启动rsync服务
只需要在服务器端启动rsync服务,启动命令很简单,只需要输入命令rsync --daemon就行了,如下所示:
[root@server ~]# rsync --daemon
3.1.2验证服务是否启动成功
ps -ef查看进程
[root@server ~]# ps -ef|grep rsyncroot 1263 1 0 09:15 ? 00:00:00 rsync --daemonroot 1265 1212 0 09:15 pts/0 00:00:00 grep rsync
查看端口
[root@server ~]# lsof -i:873COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMErsync 1263 root 4u IPv4 11220 0t0 TCP *:rsync (LISTEN)rsync 1263 root 5u IPv6 11221 0t0 TCP *:rsync (LISTEN)[root@server ~]# netstat-anp |grep 873tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1263/rsync tcp 0 0 :::873 :::* LISTEN 1263/rsync
3.1.3停止rsync服务
直接使用pkill杀掉rsync的进程,如下所示:
[root@server ~]# pkillrsync[root@server ~]# ps -ef |grep rsyncroot 1271 1212 0 09:17 pts/0 00:00:00 grep rsync
3.1.4重启rsync服务
rsync没有重启的命令,所以需要先停止服务,然后在重新启动,如下所示:
[root@server ~]# pkill rsync[root@server ~]# rsync --daemon[root@server ~]# netstat -anp |grep 873tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1275/rsync tcp 0 0 :::873 :::* LISTEN 1275/rsync
3.2数据同步
3.2.1命令格式
Rsync Daemon模式下的数据传输命令格式如下:
下载: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...]rsync://[USER@]HOST[:PORT]/SRC... [DEST]
上传: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC...rsync://[USER@]HOST[:PORT]/DEST
3.2.2创建测试数据
客户端创建:
[root@client /]# mkdir /backup && touch /backup/test{0..5} && cd /backup/[root@client backup]# lstest0 test1 test2 test3 test4 test5
服务器端创建:
[root@server backup]# cd /backup/ &&touch server{1..3}
3.2.3下载数据测试
格式1:rsync [OPTION...][USER@]HOST::SRC... [DEST]
[root@client backup]# rsync -avzrsync_backup@server::backup /backup/Password:receiving incremental file list./server1server2server3 sent 124 bytes received 252 bytes 107.43bytes/sectotal size is 0 speedup is 0.00[root@client backup]# lsserver1 server2 server3 test0 test1 test2 test3 test4 test5
格式2:rsync [OPTION...]rsync://[USER@]HOST[:PORT]/SRC... [DEST]
[root@client backup]# rsync -avzrsync://rsync_backup@server:873/backup /backup/Password:receiving incremental file list./server1server2server3 sent 124 bytes received 252 bytes 68.36bytes/sectotal size is 0 speedup is 0.00
3.2.4上传数据测试
格式1:rsync [OPTION...]SRC... [USER@]HOST::DEST
[root@client backup]# rsync -avz /backup/rsync_backup@server::backupPassword:sending incremental file list./test0test1test2test3test4test5 sent 313 bytes received 125 bytes 125.14bytes/sectotal size is 0 speedup is 0.00
格式2:rsync [OPTION...]SRC... rsync://[USER@]HOST[:PORT]/DEST
[root@client backup]# rsync -avz /backup/rsync://rsync_backup@server:873/backupPassword:sending incremental file list./test0test1test2test3test4test5 sent 313 bytes received 125 bytes 125.14bytes/sectotal size is 0 speedup is 0.00
注意:
1、这里的USER是服务端文件/etc/rsync.password定义的虚拟用户;
2、主机后面的SRC是自定义的模块名称,具体路径是在配置文件/etc/rsyncd.conf对应模块里定义的
3、输入的密码是虚拟用户的密码
3.3免密同步数据
参数:--password-file
上述的数据同步过程中,都有一个输入虚拟用户密码的步骤,实际生产坏境中需要让服务器自动同步,所以输密码是不实际的。我们可以通过指定密码文件的方式来做免密同步。
[root@clientbackup]# rsync -avz /backup/ rsync_backup@server::backup--password-file=/etc/rsync.password #<==指定password-file来做免密传输sending incremental file list./test0test1test2test3test4test5 sent 313 bytes received 125 bytes 876.00bytes/sectotal size is 0 speedup is 0.00
3.4排除特定文件
参数:--exclude
实际应用中,可以会有排除某些特定文件,传输其他文件的需求。这个功能可以通过--exclude来实现,具体操作如下:
q 排除单个文件:--exclude=test2
[root@client backup]# rsync -avz --exclude=test2 /backup/ rsync_backup@server::backup--password-file=/etc/rsync.passwordsending incremental file list./test0test1test3test4test5 sent 270 bytes received 106 bytes 752.00bytes/sectotal size is 0 speedup is 0.00
q 排除指定的多个文件:--exclude={test1,test3,test5}
[root@client backup]# rsync -avz--exclude={test1,test3,test5} /backup/ rsync_backup@server::backup--password-file=/etc/rsync.passwordsending incremental file list./test0test2test4 sent 184 bytes received 68 bytes 504.00bytes/sectotal size is 0 speedup is 0.00
3.5完全同步备份目录
参数:--delete
以上的所有文件同步,都只是上传文件到服务器端,服务器端原有的文件不会有变动。实际应用中,可能有完全同步服务器的需求,这可以通过--delete参数来实现,具体过程如下:
#<==服务器端原有文件:
[root@server backup]# lsserver1 server2 server3#<==使用delete同步:[root@client backup]# rsync -avz--exclude={test1,test3,test5} --delete/backup/ rsync_backup@server::backup --password-file=/etc/rsync.passwordsending incremental file list./deleting server3deleting server2deleting server1test0test2test4 sent 221 bytes received 68 bytes 578.00bytes/sectotal size is 0 speedup is 0.00
#<==服务器端现有的文件:
[root@server backup]# lstest0 test2 test4 #<==原来的server1,2,3文件已经被删掉了
注意:--delete参数一定要慎用,有可能会导致数据的丢失!!
第4章 小结
ync的优点:
1、支持数据增量备份,支持socket(daemon),集中备份(支持推拉,都是以客户端为参照物);
2、远程SHELL通道模式可以加密(SSH)传输,socket(daemon)模式需要加密传输可以使用VPN服务或者ipsec服务;
Rsync的缺点:
1、大量小文件同步的时候,时间比较长,有的时候,rsync进程可能会停止;
2、同步大文件,10G这样的大文件有时也会有问题,中途可能会中断。
3、未完整同步前,文件默认是隐藏的,可以通过续传等参数实现传输。
注意:
1、模式2和模式3不能结合使用
2、注意源目录后面加“/”与没有的区别(有“/”表示只同步该目录下的数据;没有表示连整个目录一起同步)