第1章   Rsync介绍

1.1  什么是Rsync

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

下面是官方的英文简单描述:rsync - a fast, versatile, remote (and local) file-copying tool

来自:www.samba.org/ftp/rsync/rsync.html

 

 

1.2  Rsync简介

       Rsync英文全称是Remote synchronization,从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似ssh带的scp命令,但有优于scp命令的功能,scp每次都是全量拷贝,而Rsync可以增量拷贝。当然,Rsync还可以在本地主机的不同分区或目录之间全量及增量复制数据,这又类似cp命令,但同样也优于cp命令,cp每次都是全量拷贝,而Rsync可以增量拷贝。

       小提示:利用Rsync还可以实现删除文件和目录的功能,这又相当于rm命令!

       一个Rsync相当于scpcprm,但是还优于他们每一个命令。

 

在同步备份数据时,默认情况下,Rsync通过其独特的“quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限,属主等属性的变化同步,但需要制定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可以实现快速的同步备份数据。

       提示:传统的cpscp工具拷贝,每次均为完整的拷贝,而rsync除了可以完整拷贝外,还具备了增量拷贝的功能,因此,从同步数据的性能及效率上,Rsync工具更胜一筹。

       CentOS5rsync2.x比对方法,把所有的文件比对一遍,然后进行同步。

       CentOs6rysnc3.x比对方法,一遍比对差异,一边对差异的部分进行同步。

 

 

1.3  Rsync的特性

       Rsync的特性如下:

  • 支持拷贝特殊文件如链接文件,设备等。

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

  • 可以做到爆出原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变-p

  • 可实现增量同步,既能同步发生变化的数据,因此数据传输效率很高,tar -N

  • 可以使用rcprshssh等方式来配合传输文件(rsync本身不对数据加密)

  • 可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****

  • 支持匿名的或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像。

 

 

第2章   Rsync的企业工作场景说明

 

两台服务器之间数据同步(cron+rsync

 

2.1  把所有客户服务器数据同步到备份服务器

生产场景集群架构服务器的备份方案cron+rsync

全网服务器数据备份解决方案提出及负责实施200x.03 - 200x.09

1)针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案。

2)通过本地打包备份,然后rsync结合inotify应用吧全网数据统一备份到一个固定存储服务器,存储服务器上通过脚本检查并报警管理员备份结果

3)定期将IDC机房的数据备份公司的内部服务器,防止机房地震及火灾问题导致数据丢失。

 

实时备份inotifysersyncdrbd,双写

 

第3章   Rsync的工作方式

3.1  传输方式

一般来说,Rsync大致使用三种主要的传输数据的方式。分别是:

       1)单个主机本地之间的数据传输(此时类似于cp命令的功能)

       2)借助rcpssh等通道来传输数据(此时类似于scp命令的功能)

       3)以守护进程(socket)的方式传输数据(这个是rsync自身的重要的功能)

以上的集中rsync的工作方式,我们可以通过man rsync帮助或者查看官方的手册。

Local: rsync [OPTION...] SRC... [DEST]

 

Access via remote shell:

 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]

 Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

 

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

 

3.2  本地数据传输模式(local-only mode

       Rsync本地传输模式的语法为:

rsync[OPTION...] SRC... [DEST]

语法说明:

1Rsync为同步的命令

2[OPTION..]为同步时的参数选项

3SRC为源,即待拷的分区、文件或目录等、

4[DEST]为目的分区、文件或目录等

直接本地同步:相当于cp

rsyncetc/hosts/tmp/

 

3.3  常用参数选项说明:

-v, --verbose详细模式输出,传输时的进度等信息

-z --compress传输时进行压缩以提高传输效率,--compress-level=NUM可按级别压缩

-a --archive归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl

-r --recursive对子目录以递归模式,即目录下的所有目录都同样传输,注意是写r

-t --times保持文件时间信息

-o--owner保持文件属主信息

-p--perms保持文件权限

-g--group保持文件属组信息

-P --progress显示同步的过程及传输时的进度等洗洗

-D --devices保持设备文件信息

-l --links保持软链接

-e --rsh=COMMAND使用的信道协议,指定rshshell程序。例如:ssh

--exclude=PATTERN指定排除不需要传输的文件模式

--exclude-from=file(文件名所在的目录文件)

--bwlimit=RATE    linmit socket I/O bandwidth

--delete   让目标目录SRC和源目录数据DST一直。

       保持同步目录及文件属性:

       这里的-avzP相当于-vzrtopgDIP(还多了DI功能),生产环境常用的参数选项为-avzP-vzrtopgP如果是放入脚本中,也可以把-v-p去掉。这里的--progress可以用-P代替。

       特别说明:以上参数为老男孩老师在多年的生产环境中常用的参数,对于初学读者掌握上面的内容已足够,刚开始学习要抓重点,相关的参数还有很多,需要时可以自行man rsync或者查看参考地址。

       avz相当于vzrtopgDI

       生产参数:-avz或者用-vzrtopg

       更多参数:

       1https://www.samba.org/ftp/rsync/rsync.html

       2man rsync

特别提示:请注意一下量命令的差别:

1rsync -avz /opt/ /tmp/

2)rsync -avz /opt /tmp/

第4章   Rsync配置

 

4.1  Rsync服务端:

1、查看rsync安装包

rpm -qa rsync

没有安装的话:yum installrsync -y

 

2、添加rsync服务的用户,管理本地目录的

useradd -s /sbin/nologin -M rsync

id rsync

 

3、生成rsyncd.conf配置文件

vi /etc/rsyncd.conf放入事先准备的配置。man rsyncd.conf去查

 

4、根据rsyncd.confauth users配置账户,远程连接的。

并根据secrets file参数生成密码文件

echo "rsync_backup:oldboy">/etc/rsync.password

cat /etc/rsync.password

 

5、为密码文件配置权限

chmod 600 /etc/rsync.password

ls -l /etc/rsync.password

 

6、创建共享的目录并授权rsync服务管理

mkdir /backup -p

chown R rsync.rsync /backup

如果没有/backup目录,就会chdir failed.

 

7、启动rsync服务并检查

rsync --daemon

ps -ef|grep rsync|grep -v grep

lsof -f :873

 

8、加入开机自启动

echo "/usr/bin/rsync --daemon">>/etc/rc.local

tail -l /etc/rc.local

(over)

排错:

1、输出

2、日志tail /var/log/rsyncd.log

 

 

4.2  rsync客户端

1、生成连接服务器需要的密码文件

echo "oldboy">/etc/rsync.password

cat /etc/rsync.password

 

2、为面文件配置权限

chmod 600 /etc/rsync.password

ls -l /etc/rsync.password

 

3、同步文件

推送:

rsync -avz /backup/ rsyncbackup@172.16.1.41::backup

 --password-file=/etc/rsync.password

rsync -avz /backup/ rsync://rsyncbackup@172.16.1.41::backup

 --password-file=/etc/rsync.password

 

拉:

rsync -avz rsync backup@172.16.1.41::backup/backup/

 --password-file=/etc/rsync.password

rsync -avz rsync://rsyncbackup@172.16.1.41::backup /backup/

--password-file=/etc/rsync.password

 

通过远程shell进行数据传输(remote shell mode

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

        

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

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

语法说明:

1Rsync为同步的命令;

2[OPTION...]为同步时的参数选项;

3[USER@]HOST...Rsync同步的远程的连接用户和主机地址

4SRC为源,即待考的分区、文件或目录等,和HOST之间用一个冒号连接;

 

第5章   实战部署:

5.1  Rsync服务端配置

1、查看环境

[root@backup ~]# cat /etc/redhat-release

CentOS release 6.7 (Final)

 [root@backup ~]# uname -m

x86_64

[root@backup ~]# uname -r

2.6.32-573.el6.x86_64

 

2、查看命令是否安装

[root@backup ~]# rpm -qa rsync

rsync-3.0.6-12.el6.x86_64

[root@backup ~]# yum list rsync#安装命令


 

 

3daemon默认配置文件设置

[root@backup ~]# vim /etc/rsyncd.conf

#rsync_config______start

#created by wangtian 23:12 2016-4-11

#QQ 976199267

#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

[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

4、参数说明:

  1#rsync_config______start

  2 #createdby wangtian 23:12 2016-4-11

  3 #QQ976199267

  4#rsyncd.conf start##

  5 uid = rsync      rsync使用的用户。初始uid-2,通常为nobody

  6 gid =rsync      :使用的组(用户所在的组)初始gid-2,通常为nobody

  7 usechroot = no       :如果为truedaemon会在给客户端传输文件前“chroot to the path”。这是rsync安全的一个配置,因为我们大多数都是在内网使用rsync,所以不配也可以。减少攻击的风险

  8 maxconnections = 200   :最大连接数(最大客户端推拉数据)默认为0,意为无限制,负值为关闭这个模块

  9 timeout =300  超时的参数。默认为0意为no timeout,建议为300-6005-10分钟)

 10 pid file= /var/run/rsyncd.pid  :进程号的文件。rsync daemon启动后将其进程PID写入次文件。如果这个文件已经存在,rsync进程不会覆盖该文件,而是会终止。

 11 lock file= /var/run/rsync.lock :锁文件。指定lock文件来支持“max connections”参数,使得总连接数不会超过限制,默认为/car/run/rsyncd.lock

 12 log file= /var/log/rsyncd.log   :日志,包括错误的日志。不设或者设置错误,rsync会使用syslog输出相关日志信息。

 13 [backup]  :模块

 14 path =/backup :共享的目录

 15 ignoreerrors    :忽略I/O错误。

 16 read only= false      :可写。是否允许客户端可以查看可用模块列表。默认为可以。

 17 list =false :是否荀彧客户端可以查看可用模块列表。默认为可以。

 18 hostsallow = 176.16.1.0/24    :允许的网段。指定可以联系的客户端主机名或和IP地址或地址段,默认情况没有此参数,即都可以连接。

 19 hostsdeny = 0.0.0.0/32   :拒绝的网段。指定不可以联系的客户端主机名或和IP地址或地址段,默认情况没有此参数,即都可以连接。

 20 authusers = rsync_backup      :连接的虚拟用户,非系统用户。指定以空格或逗号分隔的用户可以使用哪些模块,用户不需要在本地系统中存在。默认所有用户无密码访问(anonymous rsync

 21 secretsfile = /etc/rsync.password    :虚拟用户账号和密码文件。指定用户名和密码存放的文件。格式:用户名:密码。

 22#rsync_config______end

5、检查是否有rsync用户

[root@backup ~]# id rsync    #检查

id: rsync: No such user

[root@backup ~]# useradd rsync -s/sbin/nologin -M   #添加rsync用户

[root@backup ~]# id rsync    #检查

uid=500(rsync) gid=500(rsync) groups=500(rsync)

[root@backup ~]# mkdir -p /backup     #创建目录

[root@backup ~]# ls -ld /backup/ 

drwxr-xr-x. 2 root root 4096 Apr 1104:25 /backup/

[root@backup ~]# chown -R rsync.rsync/backup/       #修改属主属组

[root@backup ~]# ls -ld /backup/  #检查

drwxr-xr-x. 2 rsync rsync 4096 Apr 1104:25 /backup/

[root@backup ~]#

 

6、启动服务

[root@backup ~]# rsync --daemon        #daemon模式启动(守护进程)

[root@backup ~]# ps -ef|grep rsync|grep-v grep  #查看daemon进程有没有

root       4122     1  0 04:30 ?        00:00:00 rsync --daemon

[root@backup ~]# netstat -lntup|greprsync   #rsync监听的端口:873

tcp        0     0 0.0.0.0:873                0.0.0.0:*                   LISTEN      4122/rsync         

tcp        0     0 :::873                     :::*                        LISTEN      4122/rsync          

[root@backup ~]# ss -lntup|greprsync       #也可以用ss查看端口

tcp   LISTEN     0      5                     :::873                  :::*      users:(("rsync",4122,5))

tcp   LISTEN     0      5                      *:873                   *:*      users:(("rsync",4122,4))

[root@backup ~]#

提示:如果出现873就对了

7tail /etc/rsyncd.conf文件

[root@backup ~]# tail /etc/rsyncd.conf

[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

8、创建/etc/rsync.password文件。

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

[root@backup ~]# cat /etc/rsync.password

rsync_backup:oldboy

相当于我们创建一个密码文件,这个文件是被配置文件使用的。格式:用户:密码

这个用户不是系统用户,只是配置文件里的虚拟用户。

 

9、为了系统安全,我们需要修改文件的权限

[root@backup ~]# chmod 600/etc/rsync.password

[root@backup ~]# ll /etc/rsync.password

-rw-------. 1 root root 20 Apr 11 04:38/etc/rsync.password

为什么使用600呢?因为600只有root可以看。

 

Rsync服务端配置完成

 

5.2  Rsync客户端配置

[root@nfs01 ~]# echo "oldboy">/etc/rsync.password   #客户端仅需要密码         

[root@nfs01 ~]# chmod 600/etc/rsync.password  #修改权限

[root@nfs01 ~]# cat /etc/rsync.password      #操作完检查

oldboy

[root@nfs01 ~]# ll /etc/rsync.password

-rw-------. 1 root root 7 Apr 11 04:45/etc/rsync.password

 

 

 

5.3  推送环节示例

1、创建目录

[root@nfs01 ~]# mkdir /backup -p

[root@nfs01 ~]# ll /backup/

total 0

2、创建文件

[root@nfs01 ~]# cd /backup/

[root@nfs01 backup]# touch stu{1..100}

[root@nfs01 backup]# ls

stu1   stu18  stu27  stu36 stu45  stu54  stu63 stu72  stu81  stu90

stu10  stu19  stu28  stu37 stu46  stu55  stu64 stu73  stu82  stu91

stu100 stu2   stu29  stu38 stu47  stu56  stu65 stu74  stu83  stu92

stu11  stu20  stu3   stu39 stu48  stu57  stu66 stu75  stu84  stu93

stu12  stu21  stu30  stu4  stu49  stu58  stu67 stu76  stu85  stu94

stu13  stu22  stu31  stu40 stu5   stu59  stu68 stu77  stu86  stu95

stu14  stu23  stu32  stu41 stu50  stu6   stu69 stu78  stu87  stu96

stu15  stu24  stu33  stu42 stu51  stu60  stu7  stu79  stu88  stu97

stu16  stu25  stu34  stu43 stu52  stu61  stu70 stu8   stu89  stu98

stu17  stu26  stu35  stu44 stu53  stu62  stu71 stu80  stu9   stu99

 

daemon模式客户端命令也分为两种:

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

 

3、检查服务端有没有

[root@backup ~]# ls /backup/

[root@backup ~]#

 

4、在客户端进行推送

Push: rsync [OPTION...] SRC...[USER@]HOST::DEST

[root@nfs01 ~]# rsync -avz /backup/rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

rsync: failed toconnect to 172.16.1.41: No route to host (113)

rsync error: error insocket IO (code 10) at clientserver.c(124) [sender=3.0.6]

出现了报错的情况:网络没有连接通

 

5、关闭服务端的防火墙

[root@backup ~]#/etc/init.d/iptables off

Usage: iptables{start|stop|reload|restart|condrestart|status|panic|save}

[root@backup ~]# /etc/init.d/iptablesstop

iptables: Setting chains to policyACCEPT: filter          [  OK  ]

iptables: Flushing firewall rules:                         [  OK  ]

iptables: Unloading modules:                               [  OK  ]

[root@backup ~]#

 

6、再到客户端进行推送就成功了

[root@nfs01 ~]# rsync -avz /backup/rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

sending incremental file list

./

stu1

stu10

stu100

stu11

stu12

...

stu95

stu96

stu97

stu98

stu99

 

sent 4419 bytes  received 1911 bytes  602.86 bytes/sec

total size is 0  speedup is 0.00

 

7、服务端检查

[root@backup ~]# ls /backup/

stu1   stu18  stu27  stu36 stu45  stu54  stu63 stu72  stu81  stu90

stu10  stu19  stu28  stu37 stu46  stu55  stu64 stu73  stu82  stu91

stu100 stu2   stu29  stu38 stu47  stu56  stu65 stu74  stu83  stu92

stu11  stu20  stu3   stu39 stu48  stu57  stu66 stu75  stu84  stu93

stu12  stu21  stu30  stu4  stu49  stu58  stu67 stu76  stu85  stu94

stu13  stu22  stu31  stu40 stu5   stu59  stu68 stu77  stu86  stu95

stu14  stu23  stu32  stu41 stu50  stu6   stu69 stu78  stu87  stu96

stu15  stu24  stu33  stu42 stu51  stu60  stu7  stu79  stu88  stu97

stu16  stu25  stu34  stu43 stu52  stu61  stu70 stu8   stu89  stu98

stu17  stu26  stu35  stu44 stu53  stu62  stu71 stu80  stu9   stu99

[root@backup ~]#

 

到这里,就推送成功了。

后面推拉示例:

推:

rsync -avz /backup/ rsyncbackup@172.16.1.41::backup

 --password-file=/etc/rsync.password

rsync -avz /backup/ rsync://rsyncbackup@172.16.1.41::backup

 --password-file=/etc/rsync.password

 

拉:

rsync -avz rsync backup@172.16.1.41::backup/backup/

 --password-file=/etc/rsync.password

rsync -avz rsync://rsyncbackup@172.16.1.41::backup /backup/

--password-file=/etc/rsync.password

 

 感谢老男孩老师:http://oldboy.blog.51cto.com/

 感谢张导指导:http://www.zyops.com/