一、RSYNC简介

Rsync (remote sync)是一款开源、快速,多功能、可实现增量的本地或远程数据镜像同步备份优秀工具。它可通过 LAN/WAN 快速同步多台主机间的文件。Rsync 使用所谓的“Rsync演算法”来使本地和远程主机之间的文件达到同步,该算法只传送两个文件中的不同部分,而不是每次都整份传送,因此速度相当快。

二、RSYNC的特性:

1、支持拷贝特殊文件如链接、设备等。

2、可以有排除制定文件或目录同步的功能,相当于打包命令tar。

3、可以做到保持原来文件或目录的权限、时间、软硬连接等所有属性均不改变。

4、可实现增量同步,既只同步发生变化的数据,因此数据传输效率很高。

5、可以使用rcp,rsh,ssh等方式配合传输文件,也可以通过直接的socket连接。

6、支持匿名的或认证的进程模式传输,方便进行数据备份及镜像

7、优化的流程,文件传输效率高

三、RSYNC的工作模式:

1、列表模式

      和ls -l相似,负责列出源的内容。不仅可以看本地还可以看远端。

2、shell模式,也称为本地模式

      和cp相似,本地拷贝文件

3、远程shell模式,可以通过通过rcp,ssh等通道传输

      和rcp相似,不过可以实现增量备份,并且能够通过安全的ssh方式进行数据传输。

4、服务器模式

     在这种模式下,rsync 守护进程在一台机器上永久运行,接收文件传输请求。可以把文件发送给守护进程,也可以向它请求文件。

四、RSYNC命令的选项:

  -n :同步测试,不执行真正的同步过程。     
  -v:详细输出模式。
  -q:静默模式,这个选项通常用于脚本文件中。
  -c:开启校验功能
  -r:递归复制      
  -a: 归档,保留文件的原有属性;
  -p: 保留文件的权限;
  -t: 保留文件的时间戳;
  -l: 保留符号链接
  -g: 保留属组
  -o: 保留属主
  -D:保留设备文件
  -e ssh: 使用ssh作为传输承载,借助ssh传输,更安全;
  -z: 压缩后传输;
  --progress: 显示进度条
  --stats: 显示如何执行压缩和传输

注意:rsync命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本身;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;

五、Rsync操作示例:

1、列表模式:显示本地目录中的文件信息,rsync显示目录内文件信息时,类似ls命令:

[root@rsync ~]# rsync /tmp/
drwxrwxrwt        4096 2014/08/23 15:07:37 .
-rw-r--r--         972 2014/08/23 15:07:37 fstab
srwxrwxrwx           0 2014/08/23 13:03:12 mysql.sock
drwxrwxrwt        4096 2014/08/23 13:03:03 .ICE-unix
drwxr-xr-x        4096 2014/08/23 03:44:32 sysroot

注意,如果要显示目录本身信息,目录的名称后不能有路径分隔符/:

[root@rsync ~]# rsync /tmp
drwxrwxrwt        4096 2014/08/23 15:07:37 tmp

2、本地模式,将本地目录中的文件复制到其他目录:

[root@rsync ~]# rsync -v /etc/fstab /tmp
fstab
sent 1041 bytes  received 31 bytes  2144.00 bytes/sec
total size is 972  speedup is 0.91
[root@rsync ~]# ls /tmp
fstab  mysql.sock  sysroot

3、远程shell模式,语法格式为:

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
[root@rsync tmp]# rsync -r --stats -e ssh /etc/pam.d root@192.168.2.2:/tmp   #向远程服务器端同步数据目录及目录下的文件至对方的/tmp目录下
root@192.168.2.2's password: 
skipping non-regular file "pam.d/fingerprint-auth"
skipping non-regular file "pam.d/password-auth"
skipping non-regular file "pam.d/smartcard-auth"
skipping non-regular file "pam.d/smtp"
skipping non-regular file "pam.d/system-auth"
Number of files: 56
Number of files transferred: 50
Total file size: 13978 bytes
Total transferred file size: 13887 bytes
Literal data: 13887 bytes
Matched data: 0 bytes
File list size: 1145
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 17199
Total bytes received: 966
sent 17199 bytes  received 966 bytes  7266.00 bytes/sec
total size is 13978  speedup is 0.77
[root@httpd1 tmp]# ll   #在远程服务器端查看推送数据结果
total 4
drwxr-xr-x 2 root root 4096 Aug 23 03:36 pam.d
[root@rsync tmp]# rsync -a --stats -z root@192.168.2.2:/etc /tmp   #从远程服务器端拉取数据至本地文件系统目录
root@192.168.2.2's password: 
Number of files: 2190
Number of files transferred: 1372
Total file size: 33312618 bytes
Total transferred file size: 33299868 bytes
Literal data: 33299868 bytes
Matched data: 0 bytes
File list size: 62076
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 28783
Total bytes received: 10185815
sent 28783 bytes  received 10185815 bytes  756636.89 bytes/sec
total size is 33312618  speedup is 3.26
[root@rsync tmp]# ls    #查看拉取到的数据文件
etc  fstab  mysql.sock  sysroot

需要注意:同步数据的命令重复执行时,rsync的工作机制是传输差异部分数据,所以如果数据完全相同,是不会发生真正的数据传送的,在传输结果的信息字段Number of files中显示的结果是0:

[root@rsync ~]# rsync -a --stats -z root@192.168.2.2:/etc /tmp
root@192.168.2.2's password: 
Number of files: 2195
Number of files transferred: 0
Total file size: 33313611 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 62199
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 261
Total bytes received: 63163
sent 261 bytes  received 63163 bytes  18121.14 bytes/sec
total size is 33313611  speedup is 525.25

4、服务器模式,RSYNC工作为守护进程,能够接收客户端的同步请求,服务器端要有一个存放数据的目录,客户端可以向服务器端推送数据,也可以从服务器端拉取数据,工作在服务器模式的RSYNC可以交由xinetd代为管理,需要安装xinetd,然后启动xinetd和RSYNC服务。

[root@rsync ~]# yum install -y xinetd         #
[root@rsync ~]# chkconfig rsync on            #启动rsync服务
[root@rsync ~]# chkconfig --list              # 查看服务启动结果
xinetd based services:
chargen-dgram: off
chargen-stream:off
daytime-dgram: off
daytime-stream:off
discard-dgram: off
discard-stream:off
echo-dgram:    off
echo-stream:   off
rsync:         on
tcpmux-server: off
time-dgram:    off
time-stream:   off

创建服务器端数据目录,并提供RSYNC的配置文件,这个配置文件需要手动编辑,配置示例:

[root@rsync ~]# mkdir /data
[root@rsync ~]# vim /etc/rsyncd.conf
# Global Settings
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
# Directory to be synced
[tools]
path = /data
ignore errors = yes
read only = no
write only = no
hosts allow = 172.16.0.0/16
hosts deny = *
list = true
uid = root
gid = root
[root@rsync ~]# service xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]

查看服务监听的结果:

[root@rsync ~]# ss -tnlp | grep xinetd
LISTEN     0      64                       :::873                     :::*      users:(("xinetd",3164,5))

注意:由于rsyncd.conf文件是手动编辑提供的,而程序启动的时候却需要读取该文件,该文件在编辑时提供的名称一定要写为rsyncd.conf,如果文件名称不正确在服务器端的日志中可以查看到错误提示:

[root@rsync data]# tail /var/log/messages                #服务器端操作
Aug 23 17:07:32 rsync xinetd[3251]: START: rsync pid=3262 from=::ffff:192.168.2.2
Aug 23 17:07:32 rsync rsyncd[3262]: rsync: unable to open configuration file "/etc/rsyncd.conf": No such file or directory (2)
[root@httpd1 tmp]# rsync /etc/fstab 192.168.2.1::tools   #客户端操作
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [sender=3.0.6]

推送示例一:

[root@httpd1 ~]# rsync /etc/fstab 192.168.2.1::tools    #客户端操作,推送数据
[root@rsync data]# ls                                   #服务器端操作,查看推送结果
fstab

推送示例二:

[root@httpd1 ~]# rsync /etc/fstab rsync://192.168.2.1/tools   #客户端操作,推送数据
[root@rsync data]# ls                                         #服务器端操作,查看推送结果
fstab

拉取示例一:

[root@httpd1 tmp]# ls                                #客户端用以存放数据的目录下的原文件
pam.d
root@httpd1 tmp]# rsync -a 192.168.2.1::tools /tmp   #客户端从服务器端拉取整个数据目录下的文件
[root@httpd1 tmp]# ls                                #查看客户端拉取操作后得到的数据
CentOS-Base.repo.bak   CentOS-Media.repo  fstab       pam.d
CentOS-Debuginfo.repo  CentOS-Vault.repo  local.repo
[root@httpd1 tmp]# rsync -a 192.168.2.1::tools/issue /tmp  #客户端拉取服务器端数据目录下的单个文件操作
[root@httpd1 tmp]# ls                                      #查看客户端拉取操作后得到的数据
CentOS-Base.repo.bak   CentOS-Media.repo  fstab  local.repo
CentOS-Debuginfo.repo  CentOS-Vault.repo  issue  pam.d

拉取示例二:

[root@httpd1 tmp]# rsync -a rsync://192.168.2.1/tools/fstab ./   #使用rsync://协议的方式拉取数据
[root@httpd1 tmp]# ls
fstab  pam.d

服务器模式下还可以以授权用户的方式让用户来获取或推送数据,而不仅仅是基于IP地址的方式来访问服务器端,首先,需要在服务器端的配置文件中添加用户的白名单列表和相应的密码文件,密码文件中保存了对应用户的密码信息。

配置文件示例:
# Global Settings
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
# Directory to be synced
[tools]
path = /data
ignore errors = yes
read only = no
write only = no
hosts allow = 192.168.2.0/24
hosts deny = *
list = true
uid = root
gid = root
auth users = user1,user2
secrets file = /etc/rsyncd.passwd

创建密码文件:

[root@rsync data]# echo -e "user1:redhat\nuser2:redhat" > /etc/rsyncd.passwd 
[root@rsync data]# chmod 600 /etc/rsyncd.passwd   
[root@rsync data]# cat /etc/rsyncd.passwd 
user1:redhat
user2:redhat

重启服务:

[root@rsync data]# service xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]

基于用户名从Rsync服务器拉取数据:

[root@httpd1 tmp]# rsync -r user1@192.168.2.1::tools ./

Password: 

[root@httpd1 tmp]# ls

CentOS-Base.repo.bak   CentOS-Media.repo  fstab  local.repo

CentOS-Debuginfo.repo  CentOS-Vault.repo  issue  pam.d

基于用户名从Rsync服务器推送数据:

[root@httpd1 tmp]# rsync /etc/rc.d/rc.sysinit user2@192.168.2.1::tools     #客户端操作
[root@rsync data]# ls                                               #服务器端查看推送结果
CentOS-Base.repo.bak   CentOS-Media.repo  fstab  local.repo
CentOS-Debuginfo.repo  CentOS-Vault.repo  issue  rc.sysinit