1、rsync简介:

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

    Rsync具有本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,类似于ssh带的scp命令,但又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝,当然rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似于cp命令,但同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。利用rsync还可以删除文件和目录,这又相当于rm命令。

    一个rsync相当于scp、cp、rm,但是还优于他们每一个命令。

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

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

2、Rsync命令简单操作

1)rsync的工作方式

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

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

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

  以守护进程(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

============================================================

2)rsync命令参数选项

  -v  --verbose      详细模式输出,传输时的进度等信息
  -z  --compress     传输时进行压缩以提高传输效率,--compress-level=NUM可按级别压缩
  -a  --archive      归档模式,表示以递归方式传输文件,并保持所有文件属性,
  -r  --recursive    对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r
  -t  --times        保持文件时间信息
  -o  --owner        保持文件属主信息
  -p  --perms        保持文件权限
  -g  --group        保持文件属组信息
  -P  --progress     显示同步的过程及传输时的进度等信息
  -D  --devices      保持设备文件信息
  -l  --links        保留软链接
  -e  --rsh=COMMAND  使用的信道协议,指定替代rsh的shell程序。例如:ssh
  --exclude=PATTERN  指定排除不需要传输的文件模式
  --bwlimit=RATE     限速传输带宽

常用参数组合:-avz或者用-vzrtopg

3)rsync基本命令操作

① 从另一台服务器上面复制文件到本地服务器(本地服务器必须有ssh通道;):(下载

[oldboy@nfs-client ~]$ rsync -avz -e 'ssh -p 52113' 10.90.3.163:~/oldboy@10.90.3.174 /home/oldboy/

receiving incremental file list

oldboy@10.90.3.174

 

sent 30 bytes  received 159 bytes  378.00 bytes/sec

total size is 158  speedup is 0.84

[oldboy@nfs-client ~]$ ll /home/oldboy/oldboy\@10.90.3.174

-rwxr-xr-x 1 oldboy oldboy 158 10 23 18:31 /home/oldboy/oldboy@10.90.3.174

② 把本地服务器文件复制到另一台服务器上面(本地服务器必须有ssh通道;):(上传

[oldboy@nfs-client ~]$ rsync -avz /etc/passwd -e 'ssh -p 52113' 10.90.3.163:~

sending incremental file list

passwd

 

sent 675 bytes  received 34 bytes  1,418.00 bytes/sec

total size is 1,397  speedup is 1.97

[oldboy@nfs-server ~]$ ll /home/oldboy/passwd

-rw-r--r-- 1 root root 1397 Nov 21 17:28 /home/oldboy/passwd

③ 本地服务器复制文件或目录(类似于cp命令):(本地复制

[oldboy@nfs-client ~]$ rsync -avz /etc/group /mnt/

sending incremental file list

group

 

sent 415 bytes  received 35 bytes  900.00 bytes/sec

total size is 594  speedup is 1.32

[oldboy@nfs-client ~]$ ll /mnt/group

-rw-r--r-- 1 root root 594 11 21 17:28 /mnt/group

④ 本地服务器删除文件或目录(类似于rm命令)

[oldboy@nfs-client ~]$ mkdir null

[oldboy@nfs-client ~]$ rsync -r --delete null/ /mnt/

[oldboy@nfs-client ~]$ ll /mnt/

总用量 0

3、Rsync以守护进程(socket)的方式传输数据(重点)

1)部署环境

本文使用Vmware虚拟机环境下Linux主机来进行实验。和生产环境的真实服务器部署几乎没任何区别。

操作系统:

[root@lamp tools]# cat /etc/redhat-release
CentOS release 6.5 (Final)

内核版本:

[root@lamp /]# uname -r
2.6.32-431.el6.x86_64

主机网络参数设置:

主机名

网卡eth0

默认网关

用途

A-Server

10.90.3.142

10.90.3.1

Rsync服务器

B-Server

10.90.3.140

10.90.3.1

Rsync节点

C-Server

10.90.3.220

10.90.3.1

Rsync节点

提示:如无特殊说明,子网掩码均为255.255.255.0

2)具体要求

  要求在A-server上以rsync守护进程的方式部署rsync服务,使得所有rsync节点客户端主机,可以把本地数据通过rsync的方式备份到数据备份服务器A-server上。本例的客户端仅以B-serverC-server为例。

3)rsync守护进程备份拓扑图

rsync.png

4)rsync服务器端部署

  配置rsyncd.conf

首先确认rsync是否安装:

[root@nginx-proxy /]# which rsync

/usr/bin/rsync

#

[root@nginx-proxy /]# rpm -qa rsync

rsync-3.0.6-9.el6_4.1.x86_64

[root@nginx-proxy /]# rsync --version

rsync  version 3.0.6  protocol version 30

Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.

Web site: http://rsync.samba.org/

Capabilities:

    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,

    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,

    append, ACLs, xattrs, iconv, symtimes

 

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you

are welcome to redistribute it under certain conditions.  See the GNU

General Public Licence for details.

编辑rsyncd.conf配置文件(默认没有这个文件需要自己创建

[root@nginx-proxy /]# vim /etc/rsyncd.conf
  1 #created by oldboy 09:35 2018-11-23
  2 #rsyncd.conf start
  3 uid = rsync          #用户名
  4 gid = rsync          #组名
  5 use chroot = no                     #安全性考虑,指定一个目录。当前为空,因为在局域网内无需考虑安全问题
  6 max connections = 4                 #指定客户端连接此服务器的数量
  7 timeout = 300                       #超时时间
  8 pid file = /var/run/rsyncd.pid      #rsync进程号文件路径
  9 lock file = /var/run/rsync.lock     #锁文件路径
 10 log file = /var/log/rsyncd.log      #rsync日志文件路径
 11 [oldboy]                            #模块
 12 path = /oldboy/                     #传输数据路径(类似于nfs的共享目录)
 13 ignore errors                       #忽略错误
 14 read only = false                   #权限(当前权限为可写)
 15 list = false                        #是否允许列表
 16 hosts allow = 10.90.3.0/24          #允许主机
 17 hosts deny = 0.0.0.0/32             #拒绝主机
 18 auth users = rsync_backup           #rsync虚拟用户
 19 secrets file = /etc/rsync.password  #用户密码文件路径
 20 #rsync_config______________end

②  守护进程方式启动rsync

[root@nginx-proxy /]# rsync --daemon

③  检查rsync端口(默认端口为873,如不是为873,则说明守护进程方式启动rsync失败)

[root@nginx-proxy /]# netstat -lnpt|grep rsync
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      4250/rsync         
tcp        0      0 :::873                      :::*                        LISTEN      4250/rsync

④  rsync启动之后操作

创建共享目录:

[root@nginx-proxy /]# mkdir /oldboy

创建用户:

[root@nginx-proxy /]# useradd rsync -s /sbin/nologin

修改oldboy目录的属主和属组:

[root@nginx-proxy /]# chown -R rsync.rsync /oldboy/

创建用户密码文件:

[root@nginx-proxy /]# echo "rsync_backup:oldboy123" > /etc/rsync.password
[root@nginx-proxy /]# cat /etc/rsync.password 
rsync_backup:oldboy123
[root@nginx-proxy /]# chmod 600 /etc/rsync.password

5) rsync客户端配置

客户端:B-server

[root@B-server /]# echo "oldboy123" > /etc/rsync.password
[root@B-server /]# chmod 600 /etc/rsync.password
[root@B-server /]# cat /etc/rsync.password
oldboy123
[root@B-server /]# ll /etc/rsync.password
-rw------- 1 root root 10 11月 25 21:20 /etc/rsync.password

客户端:C-server

[root@C-server /]# echo "oldboy123" > /etc/rsync.password
[root@C-server /]# chmod 600 /etc/rsync.password
[root@C-server /]# cat /etc/rsync.password
oldboy123
[root@C-server /]# ll /etc/rsync.password
-rw------- 1 root root 10 Jan  8 12:01 /etc/rsync.password

4、Rsync客户端操作(一般只在客户端推、拉数据)

1)客户端拉取A-server服务端数据

B-server客户端命令操作:

[root@B-server /]# ls /data/

[root@B-server /]# rsync -avz rsync_backup@10.90.3.142::oldboy /data/ --password-file=/etc/rsync.password

receiving incremental file list

./

test/

test/a/

test/a/b/

test/a/b/c/

sent 83 bytes  received 179 bytes  524.00 bytes/sec

total size is 0  speedup is 0.00

[root@B-server /]# tree /data/

/data/

└── test

    └── a

        └── b

            └── c

4 directories, 0 files

C-server客户端命令操作:

[root@C-server /]# mkdir /databackup

[root@C-server /]# ls /databackup/

[root@C-server /]# rsync -avz rsync_backup@10.90.3.142::oldboy /databackup/ --password-file=/etc/rsync.password

receiving incremental file list

./

test/

test/a/

test/a/b/

test/a/b/c/

sent 83 bytes  received 179 bytes  524.00 bytes/sec

total size is 0  speedup is 0.00

[root@C-server /]# ls /databackup/

Test

[root@C-server /]# tree /databackup/

/databackup/

└── test

    └── a

        └── b

            └── c

 

4 directories, 0 files

2)客户端推送数据到A-server服务器端

C-server客户端命令操作:

[root@C-server accp]# pwd

/accp

[root@C-server accp]# touch {1..6}

[root@C-server accp]# ls

1  2  3  4  5  6

[root@C-server accp]# rsync -avz /accp/ rsync_backup@10.90.3.142::oldboy --password-file=/etc/rsync.password

sending incremental file list

./

1

2

3

4

5

6

 

sent 281 bytes  received 125 bytes  812.00 bytes/sec

total size is 0  speedup is 0.00

B-server客户端命令操作:

[root@B-server /]# mkdir /benet

[root@B-server /]# cd /benet/

[root@B-server benet]# touch {a..f}

[root@B-server benet]# ls

a  b  c  d  e  f

[root@B-server benet]# rsync -avz /benet/ rsync_backup@10.90.3.142::oldboy --password-file=/etc/rsync.password

sending incremental file list

./

a

b

c

d

e

f

 

sent 281 bytes  received 125 bytes  812.00 bytes/sec

total size is 0  speedup is 0.00

A-server服务器端检查:

[root@nginx-proxy /]# ls /oldboy/

1  2  3  4  5  6  a  b  c  d  e  f  test

A-server服务器端有两个客户端推送过来的数据,则说明rsync守护进程模式配置成功。

5、Rsync小结

1)Rsync Server

  1.vi /etc/rsyncd.conf(用户、目录、虚拟用户及密码文件、模块)

  2.创建共享目录/oldboy

  3.创建Rsync用户,并且授权访问/oldboy

  4.创建密码文件,复制配置文件里的路径,然后添加密码内容

    内容-->虚拟用户名:密码

  5.密码文件权限:600

  6.rsync --deamon然后放入/etc/rc.local

  7.tail /var/log/rsyncd.log

2)Rsync Client(多个):

  1.创建密码文件(和服务端的密码文件没有任何关系)

    --password-file=/etc/rsync.password  内容:密码

  2.密码权限:600

    /etc/rsync.password  600

  3.同步命令:可以用man查看

[root@nginx-proxy /]# man rsync
rsync(1)                                                              rsync(1)
 
NAME
       rsync ? a fast, versatile, remote (and local) file-copying tool
 
SYNOPSIS
       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)Rsync服务故障排查及解决方法

https://blog.51cto.com/13716812/2395965


4)Rsync企业场景应用

1、两台服务器之间数据同步(定时同步)

2、把所有客户服务器数据同步到备份服务器(定时同步)

   生产场景集群架构服务器备份方案

3rsync结合inotifysersync的功能做实时的数据同步(实时同步)

   rsync + inotifyrsync + sersync

6Rsync无差异同步

1)无差异同步rsync企业工作场景

①  备份 --delete风险

本地有啥,远端就有啥,本地没有的远端有也要删除。服务器端的目录数据可能丢失。

②  rsync拉取企业工作场景:

代码发布,下载。--delete风险

远端有啥,本地就有啥,远端没有的本地有也要删除。客户端的目录数据可能丢失。

注意:无差异同步—delete这个参数操作不慎容易丢失数据,风险较大,请谨慎操作。

2)无差异同步方案

#查看服务器端目录,当前目录为空

[root@nginx-proxy oldboy]# ls

#查看客户端目录内容,然后拉取服务器端数据(服务器端数据为空)

[root@B-server benet]# ls
1  2  3  4  5  a  b  c  d  e  f
[root@B-server benet]# rsync -avz --delete rsync_backup@10.90.3.142::oldboy /benet/ --password-file=/etc/rsync.password 
receiving incremental file list
deleting f
deleting e
deleting d
deleting c
deleting b
deleting a
deleting 5
deleting 4
deleting 3
deleting 2
deleting 1
./
 
sent 67 bytes  received 112 bytes  358.00 bytes/sec
total size is 0  speedup is 0.00

#检查客户端目录内容

[root@B-server benet]# ll
总用量 0

总结:以上结果说明,远端有啥,本地就有啥,远端没有的本地有也要删除。客户端的目录数据可能丢失。

建议:在没有特殊必要时,最好不要用无差异同步,操作不慎很容易丢失数据的

7、rsync相关参考资料

https://rsync.samba.org/

man rsyncd.conf

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

https://www.samba.org/ftp/rsync/rsyncd.conf.html