1. RSYNC介绍

RSYNC是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具。Rsync软件适用于unix/linux/windows等多种操作系统平台。

远程数据备份工具,可以实现全备份及增量备份,也可以本地备份。

英文全称是Remote synchronization.
具有以下三种功能:

  1. 远程copy的功能:相当于ssh自带的scp命令,但是又优于scp命令,scp每次都是全量拷贝。rsync高在增量拷贝,scp每次都是全量copy。
  2. 本地copy功能:相当于是cp命令,但是又优于cp命令,因为cp每次都是全量copy。
  3. rsync还可以实现删除功能:相当于rm命令。

CentOS5.X中自带的rsync版本都是2.6.x的版本,该版本存在的问题主要是性能方面的,比如,同步大量小文件时容易出现内存溢出或同步中断等现象,这主要与其2.6版本采用先列文件列表,再进行同步的处理机制有关,在处理大文件同步时也市场发生同步文件不完整的现象.不过在CentOS6.x系列rsync版本都进行了升级,本篇文章使用的linux系统是CentOS6.7, 自带的rsync的版本是3.0.6.

2. RSYNC的特性

下面的特性是从rsync官方网站上抄录的:

  1. support for copying links, devices, owners, groups, and permissions
    支持拷贝链接,设备,用户,用户组和属性权限。
  2. exclude and exclude-from options similar to GNU tar
    支持像tar一样排除(或者从文件中排除)备份文件的特性
  3. a CVS exclude mode for ignoring the same files that CVS would ignore
    支持CVS排除文件模式
  4. can use any transparent remote shell, including ssh or rsh
    支持远程shell(ssh,rsh等)数据传输
  5. does not require super-user privileges
    不需要超级用户的权限
  6. pipelining of file transfers to minimize latency costs
    rsync3.x版本以后是一边比较文件一边进行传输,减少了文件传输的延迟
  7. support for anonymous or authenticated rsync daemons (ideal for mirroring)
    支持匿名或需要验证的rsync守护进程模式
3. 使用的工作场景
  1. 把所有客户数据数据同步到备份服务器(可以配合定时任务,实现每天定时备份)
  2. 实时同步(解决存储服务器的单点故障问题),rsync结合inotify的功能做实时数据同步。
4. RSYNC的工作方式

Rsync大致使用三种主要的传输数据的方式:

  • 单个主机本地之间的数据传输(此时类似于cp命令的功能)[本地传输模式]
  • 借助rcp,ssh等通道来传输数据(此时类似于scp命令的功能)[远程shell传输模式]
  • 以守护进程(socket)的方式传输数据(这个是rsync自身的重要的功能)[守护进程模式]

官方介绍:

1. Local:  rsync [OPTION...] SRC... [DEST]
2. Access via remote shell:
        Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
        Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
3. Access via rsync 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的一些基本理论介绍。看着比较枯燥,下面开始实战之旅:

5. 实战环境介绍

众所周知,linux有不同的发行商,内核也有不同的版本,下面是本篇文章的实验版本:

[root@backup ~]# cat /etc/redhat-release 
CentOS release 6.7 (Final)
[root@backup ~]# uname -a
Linux backup 2.6.32-573.26.1.el6.x86_64 #1 SMP Wed May 4 00:57:44 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@backup ~]#

Rsync的版本:

[root@backup ~]# rsync --version
rsync  version 3.0.6  protocol version 30

首先确认Rsync是否已经安装:

[root@backup ~]# rpm -qa rsync
rsync-3.0.6-12.el6.x86_64
[root@backup ~]# 
出现了这个信息说明已经安装,如果系统上没有安装rsync可以使用下面的命令进行安装:
yum install rsync -y
6. 实战之本地传输模式

本地传输模式实现的是本地同步功能,相当于是cp,rm等命令,说的简单一点就是在同一台机器上把数据从一个地方拷贝到另一个地方或者删除数据,rsync比cp命令高级的地方在于,rsync拷贝时使用的是增量拷贝,即只会把不同的内容拷贝过去,这样就大大提升了性能。

  1. 语法格式
rsync [OPTION...] SRC... [DEST]
  1. 语法说明:
1. rsync为同步的命令
 2. [option]为同步时需要的参数
 3. SRC为源,即待拷贝的分区,文件或目录
 4. [DEST]为目的分区,文件或目录
  1. 示例:
本地拷贝命令
 [root@backup ~]# cp /etc/hosts /tmp             #使用cp命令拷贝文件
 [root@backup ~]# rsync /etc/hosts /opt         #使用rsync命令拷贝文件
 [root@backup ~]# ls /opt/hosts
 /opt/hosts
 [root@backup ~]#

 本地删除命令:(这个功能比较危险,一般不建议用)
 [root@backup ~]# mkdir /null -p     #创建一个不包含任何文件的空目录,名称随意
 [root@backup ~]# ls /tmp/
 a.txt  hosts  today_backup_file.txt
 [root@backup ~]# rsync -avz --delete /null/ /tmp    #然后把这个空目录拷贝到要删除的目录,加--delete参数就实现了rsync的删除功能, 这里需要注意/null/这个目录后面一定要加/,不能写成/null这样,写成这样的话,就会把/null这个目录(包含目录名)拷贝到/tmp目录下,就实现不了删除的功能了。
 sending incremental file list
 ./
 deleting .ICE-unix/
 deleting today_backup_file.txt
 deleting hosts
 deleting a.txt
 deleting .pwd.lock

 sent 29 bytes  received 15 bytes  88.00 bytes/sec
 total size is 0  speedup is 0.00
 [root@backup ~]#
  1. 重要参数介绍
-r --recursive 递归模式,子目录下的所有目录都同样传输
 -t --times 保持文件时间信息
 -o --owner 保持文件属主信息
 -p –perms 保持文件权限
 -g --group保持文件属性
 -P --progress 显示同步的过程及传输时的进度等信息
 -D --devices 保持设备文件信息
 -l --links 保留软连接
 -e --rsh=command 使用的通道协议,指定替代rsh的shell程序,例如ssh等
 --exclude=PATTERN 指定排除不需要传输的文件模式
 --exclude-from=file (文件名所在的目录文件)
 --bwlimit=RATE 限制传输的速度
 更多参数,请参照:
 http://www.samba.org/ftp/rsync/rsync.html

三个常用参数:

-v –verbose 详细输出模式,传输时的进度等信息 
 -z –compress 传输时进行压缩以提高传输效率, --compress-level=NUM可按级别压缩  
 -a --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl
7. 通过远程shell进行数据传输(remote shell mode)

用于两台机器之间数据的传输,比如把重要数据备份到服务器。这个模式相当于是scp命令实现的功能,不过rsync还是可以实现增量的拷贝,而且支持目录的拷贝,这个是比rsync好用的地方。

通过远程shell(rcp,ssh等)传输可以分为两种情况,其语法分别为:

拉: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
推: rsync [OPTION...] SRC... [USER@]HOST:DEST

语法说明:

1.  rsync 为同步的命令
2.  [OPTION...]为同步时的参数选项
3.  [USER@]HOST:SRC...为同步的远程的链接用户和主机地址
4.  SRC为源,即待copy的分区,文件或目录等,和HOST之间用一个冒号连接
5.  [DEST]为目的分区,文件或目录等

拉取表示从远端主机把数据同步到执行命令的本地主机相应的目录;
推送表示从本地主机执行命令把本地的数据同步到远端主机指定目录下。

拉取的语法示例:

rsync -avz -e 'ssh -p 22' root@172.16.1.41:/opt/ /tmp/

推送的语法示例:

rsync -avz -e 'ssh -p 22' /etc/ root@172.16.1.41:/tmp/

特别提示:
注意一下两个命令的区别:

rsync –avz /opt/ /tmp/
rsync -avz /opt /tmp/

/opt/表示推送或拉取/opt目录下的内容,/opt表示推送或拉取/opt目录及其里面的内容。

8. 实战之使用RSYNC守护进程模式(重点)

可以说,前面讲的都是铺垫,这个才是重中之重。

工作原理:

RSYNC守护进程模式,包含服务器以及客户机,服务器上启动rsync的守护进程,客户机配置对应的用户名和密码,实现客户机到服务器的备份功能。RSYNC守护进程启动的机器就是我们文章标题所说的备份服务器。 其他的机器作为客户端,向这台机器推送数据,或从这台机器上拉取数据。

在本篇文章的实战中服务器端的host那么是backup,所以我们简称这台服务器为backup, 客户机端的hostname是nsf01,同理,我们简称这台客户机为nfs01.

8.1 服务器端(bakup机器)配置

a. 首先确认软件是否安装:

[root@backup ~]# rpm -aq rsync
rsync-3.0.6-12.el6.x86_64
[root@backup ~]#

b. 创建用户

[root@backup ~]# useradd rsync -s /sbin/nologin -M  #这个是rsync进程使用的用户
[root@backup ~]# id rsync
uid=501(rsync) gid=501(rsync) 组=501(rsync)
[root@backup ~]#
客户端连到服务器用rsync用户访问权限访问数据

c. 创建服务器端的配置文件(rsyncd.conf)

#rsync_config_______________start
#created by grewan 07::23 2016-05-28
#Email:wangqj541@163.com blog: 
##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  #这个是rsync的log文件,比较有用
[backup]
path = /backup/
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
#rsync_config_______________end

配置文件说明:

参数

说明

uid=rsync

rsync使用的用户ID。缺省uid为-2,通常为nobody

gid=rsync

rsync使用的组(用户所在的组)。缺省gid为-2,通常为nobody

use chroot=no

如果为true,daemon会在给客户端传输文件前“chroot to the path”。这是rsync安全的一个配置,因为我们大多数都是在内网使用rsync,所以不用配置也可以

max connections=200

设置最大连接数,默认为0,意思为无限制,负值为关闭这个模块

timeout=300

默认为0,意思为no timeout,建议为300-500(s)

pid file=/var/run/rsyncd.pid

rsync daemon启动后将其进程PID写入此文件。如果这个文件已经存在,rsync进程不会覆盖该文件,而是会终止

lock file=/var/run/rysncd.lock

指定loc文件用来支撑max connections的参数,使得总连接数不会超过限制,默认为/var/run/rsyncd.lock

log file = /var/log/rsyncd.log

rsync的日志文件

ignore errors

忽略IO错误

read only = false

指定客户端是否可以上传文件,默认对所有模块都为true

list = false

是否允许客户端可以查看可用模块列表(类似ls),默认为true

hosts allow = 172.16.1.0/24

指定可以联系的客户端主机名或者ip地址或者地址段,默认情况没有此参数,即都可以连接

hosts deny = 0.0.0.0/32

指定不可联系的客户端主机名或IP地址或地址段,禁止他们连接。默认情况没有此参数,即都可以连接

auth users = rsync_backup

指定以空格或逗号分隔的用户可以使用哪些模块,用户不需要在本地系统中存在,默认所有用户无密码的访问

secrets file = /etc/rsync.password

指定用户名和密码存放的文件。格式:用户名:密码, 密码不超过8位

[backup]

模块名称,需要用中括号括起来,起名没有特殊要求,但最好是有意义的名称,便于以后维护

path = /backup/

在这个模块中,daemon使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写问题。

d. 创建备份目录

[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup/  #一定记得修改文件的用户和用户组
[root@backup ~]# ls -ld /backup/
drwxr-xr-x 2 rsync rsync 4096 5月  22 15:05 /backup/
[root@backup ~]#

e. 创建密码文件(根据配置文件生生成)

[root@backup ~]# echo "rsync_backup:grewan" > /etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password

f. 启动服务

[root@backup ~]# rsync --daemon
[root@backup ~]# lsof -i :873    #rsync的端口是873, 使用这个命令检查rsync服务是否启动成功
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   3894 root    4u  IPv4  15807      0t0  TCP *:rsync (LISTEN)
rsync   3894 root    5u  IPv6  15808      0t0  TCP *:rsync (LISTEN) 
更多信息参考:[root@backup ~]# man rsyncd.conf
8.2 客户端(nsf01机器)配置

a. 配置密码文件

[root@nfs01 ~]# echo "grewan" > /etc/rsync.password

b. 修改密码文件权限

[root@nfs01 ~]# chmod 600 /etc/rsync.password
8.3 示例测试

注意:这里的示例都是在客户机端(nsf01)上进行操作的,一般的使用场景都是从客户机备份数据到服务器。

语法格式:

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

1.在客户端(nfs01)上创建/backup目录,及测试文件

[root@grewan backup]# mkdir /backup -p   #创建目录
[root@grewan backup]# touch {1..10}      #创建10个测试文件
[root@grewan backup]# ls
1  10  2  3  4  5  6  7  8  9

2.把客户端/backup目录中的内容,备份到备份服务器:

[root@nfs01 backup]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password 
sending incremental file list
./
1
10
2
3
4
5
6
7
8
9

sent 450 bytes  received 201 bytes  1302.00 bytes/sec
total size is 0  speedup is 0.00
[root@nfs01 backup]#
命令说明: 
rsync -avz这个是命令和对应的参数
/backup/: 把backup目录下的内容推送到服务器
rsync_backup@172.16.1.41::backup : 这个是服务器的信息,rsync_backup是配置文件/etc/rsyncd.conf中配置的用户名,
          172.16.1.41是服务器的ip地址,backup是/etc/rsyncd.conf中配置的模块名,这个地方一定不要弄错,
          可以再回去看看配置文件,加深印象
--password-file:指定密码文件,不加这个参数的情况下,要手动输入密码。

3.在备份服务器端(backup机器)查看备份的结果

[root@backup ~]# cd /backup/
[root@backup backup]# ls
1  10  2  3  4  5  6  7  8  9
[root@backup backup]#

4.第二种推送的方式
使用rsync协议的方式进行推送

[root@nfs01 backup]# rsync -avz /backup/ rsync://rsync_backup@172.16.1.41/backup --password-file=/etc/rsync.password 
sending incremental file list
./
1
2
3
4
5

sent 239 bytes  received 106 bytes  690.00 bytes/sec
total size is 0  speedup is 0.00
[root@nfs01 backup]#

5.从备份服务器拉取内容

[root@nfs01 backup]# rsync -avz rsync_backup@172.16.1.41::backup /backup/ --password-file=/etc/rsync.password 
receiving incremental file list
./
1
2
3
4
5

sent 162 bytes  received 326 bytes  325.33 bytes/sec
total size is 0  speedup is 0.00
[root@nfs01 backup]# ls
1  2  3  4  5
[root@nfs01 backup]#

6.第二种拉取的方式

[root@nfs01 backup]# rm -f *
[root@nfs01 backup]# rsync -avz rsync://rsync_backup@172.16.1.41/backup /backup/ --password-file=/etc/rsync.password 
receiving incremental file list
./
1
2
3
4
5

sent 162 bytes  received 326 bytes  976.00 bytes/sec
total size is 0  speedup is 0.00
[root@nfs01 backup]#

7.删除rsync同步进程

kill `cat /var/run/rsyncd.pid`  
kill `/var/run/rsyncd.pid`
9. 多目录共享

多目录共享的意思是说客户端可以向服务器端多个目录下进行推送或拉取。这个实现起来很简单,就是在配置文件中配置多个模块,每个模块可以指定不同的用户名,密码等等信息。如果所有推送的模块基本信息都相同,就可以把配置信息放在多个模块的上面,模块只配置一个对应的路径即可,像下面这个示例这样:

[root@backup backup]# cat /etc/rsyncd.conf 
#rsync_config_______________start
#created by grewan 07::23 2016-05-28
#Email:wangqj541@163.com blog: 
##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/
[test]
path = /test/
#rsync_config_______________end