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相当于scpcprm,并且优于他们每一个命令。

在同步备份数据时,默认情况下,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 来实现

  实时备份

可以通过inotifysersync+ 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.5inotify3种工作模式

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)? yes
Warning: Permanently added '172.16.1.31' (RSA) tothe list of known hosts.
root@172.16.1.31's password:
sending incremental file list
hosts
 
sent 124 bytes received 31 bytes  34.44 bytes/sec
total 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)? yes
Warning: Permanently added 'server,172.16.1.41'(RSA) to the list of known hosts.
root@server's password:
receiving incremental file list
hosts
 
sent 30 bytes received 199 bytes  50.89bytes/sec
total 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/sec
total 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 in
10+0 records out
10485760 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 list
test
 
sent 10275 bytes received 31 bytes  2944.57 bytes/sec
total 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/s
root@172.16.1.31's password:
sending incremental file list
test
 
sent 10275 bytes received 31 bytes  2944.57 bytes/sec
total 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)? yes
Warning: Permanently added '172.16.1.31' (RSA) tothe list of known hosts.
root@172.16.1.31's password:
receiving incremental file list
drwxr-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/sec
total 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                         # rsync
rsync           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-release
CentOS release 6.5 (Final)
[root@server ~]# uname -r
2.6.32-431.el6.x86_64
[root@server ~]# uname -m
x86_64

2.3.2rsync软件版本

[root@server ~]# rsync -version
rsync version 3.0.6  protocol version 30
Copyright (C) 1996-2009 by Andrew Tridgell, WayneDavison, and others.
Web site: http://rsync.samba.org/
[root@server ~]# rpm -qa rsync
rsync-3.0.6-9.el6_4.1.x86_64


2.4软件安装

安装完操作系统之后,系统默认会自动安装Rsync服务,可以使用以下命令查看Rsync服务是否安装。如果有返回值,则说明已经安装好。

[root@server tmp]# rpm -qa rsync
rsync-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.conf
uid = 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 errors
read only = false
list = false
hosts allow = 172.16.1.0/24,172.25.1.0/24  #<==配置登录权限,可以多个IP网段用逗号隔开
#hosts deny = 0.0.0.0/32
auth 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/passwd
rsync: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.password
rsync_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.local
tail: 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.password
123456

同理,该配置文件也需要修改权限为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 rsync
root      1263      1  0 09:15 ?        00:00:00 rsync --daemon
root      1265   1212  0 09:15 pts/0    00:00:00 grep rsync

  查看端口

[root@server ~]# lsof -i:873
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync  1263 root    4u  IPv4 11220      0t0  TCP *:rsync (LISTEN)
rsync  1263 root    5u  IPv6 11221      0t0  TCP *:rsync (LISTEN)
[root@server ~]# netstat-anp |grep 873
tcp       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 rsync
root      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 873
tcp       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]# ls
test0 test1  test2  test3 test4  test5

服务器端创建:

[root@server backup]# cd /backup/ &&touch server{1..3}

3.2.3下载数据测试

格式1rsync [OPTION...][USER@]HOST::SRC... [DEST]

[root@client backup]# rsync -avzrsync_backup@server::backup  /backup/
Password:
receiving incremental file list
./
server1
server2
server3
 
sent 124 bytes received 252 bytes  107.43bytes/sec
total size is 0 speedup is 0.00
[root@client backup]# ls
server1 server2  server3  test0 test1  test2  test3 test4  test5

格式2rsync [OPTION...]rsync://[USER@]HOST[:PORT]/SRC... [DEST]

[root@client backup]# rsync -avzrsync://rsync_backup@server:873/backup /backup/
Password:
receiving incremental file list
./
server1
server2
server3
 
sent 124 bytes received 252 bytes  68.36bytes/sec
total size is 0 speedup is 0.00

3.2.4上传数据测试

格式1rsync [OPTION...]SRC... [USER@]HOST::DEST

[root@client backup]# rsync -avz /backup/rsync_backup@server::backup
Password:
sending incremental file list
./
test0
test1
test2
test3
test4
test5
 
sent 313 bytes received 125 bytes  125.14bytes/sec
total size is 0 speedup is 0.00

格式2rsync [OPTION...]SRC... rsync://[USER@]HOST[:PORT]/DEST

[root@client backup]# rsync -avz /backup/rsync://rsync_backup@server:873/backup
Password:
sending incremental file list
./
test0
test1
test2
test3
test4
test5
 
sent 313 bytes received 125 bytes  125.14bytes/sec
total 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
./
test0
test1
test2
test3
test4
test5
 
sent 313 bytes received 125 bytes  876.00bytes/sec
total 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.password
sending incremental file list
./
test0
test1
test3
test4
test5
 
sent 270 bytes received 106 bytes  752.00bytes/sec
total 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.password
sending incremental file list
./
test0
test2
test4
 
sent 184 bytes received 68 bytes  504.00bytes/sec
total size is 0 speedup is 0.00

3.5完全同步备份目录

  参数:--delete

以上的所有文件同步,都只是上传文件到服务器端,服务器端原有的文件不会有变动。实际应用中,可能有完全同步服务器的需求,这可以通过--delete参数来实现,具体过程如下:

#<==服务器端原有文件:

[root@server backup]# ls
server1 server2  server3
#<==使用delete同步:
[root@client backup]# rsync -avz--exclude={test1,test3,test5}  --delete/backup/ rsync_backup@server::backup --password-file=/etc/rsync.password
sending incremental file list
./
deleting server3
deleting server2
deleting server1
test0
test2
test4
 
sent 221 bytes received 68 bytes  578.00bytes/sec
total size is 0 speedup is 0.00

#<==服务器端现有的文件:

[root@server backup]# ls
test0 test2  test4      #<==原来的server1,2,3文件已经被删掉了

注意:--delete参数一定要慎用,有可能会导致数据的丢失!!

第4章 小结

 

ync的优点:

1、支持数据增量备份,支持socketdaemon),集中备份(支持推拉,都是以客户端为参照物);

2、远程SHELL通道模式可以加密(SSH)传输,socketdaemon)模式需要加密传输可以使用×××服务或者ipsec服务;

Rsync的缺点:

1、大量小文件同步的时候,时间比较长,有的时候,rsync进程可能会停止;

2、同步大文件,10G这样的大文件有时也会有问题,中途可能会中断。

3、未完整同步前,文件默认是隐藏的,可以通过续传等参数实现传输。

注意:

1、模式2和模式3不能结合使用

2、注意源目录后面加“/”与没有的区别(有“/”表示只同步该目录下的数据;没有表示连整个目录一起同步)