rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于Unix/linux/Windows等多种操作系统平台。
33.1.1)Rsync简介
rsync英文称为remote synchronizetion,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及曾量的复制数据,这又类似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
在同步数据的时候,默认情况下,rsync通过其独特的“quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限、属主等属性的变化同步,但是需要制定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可是实现快速的同步备份数据。
rsync监听端口:873
rsync运行模式:C/S
client/server
客户端/服务端
小提示:利用rsync还可以实现删除文件和目录的功能,这又相当于rm命令,一个rsync相当于scp、cp、rm,但是还优于他们的每一个命令。
33.1.2)Rsync的特性
1)支持拷贝特殊文件,如连接文件、设备等。 2)可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。 3)可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。 4)可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。 5)可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。 6)可以通过socket(进程方式)传输文件和数据(服务端和客户端)。 7)支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。
33.1.3)生产场景架构集群备份方案
1)借助cron+rsync把所有客户服务器数据同步到备份服务器。 2)针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案。 3)通过本地打包备份,然后rsync结合inotify应用把全网数统一备份到一个固定存储服务器,然后在存储服务器上通过脚本检查并报警管理员备份结果。 4)定期将IDC机房的数据 备份公司的内部服务器,防止机房地震及火灾问题导致数据丢失。 5)实时同步,解决存储服务器等的单点问题。
33.1.4)备份类型介绍
备份类型有两种,分别是完全备份和增量备份。
完全备份示意图如下:
增量备份示意图如下:
33.1.5)Rsync的应用场景
33.15.1)应用场景1:推
示意图如下:
33.15.2)应用场景2:拉
示意图如下:
33.15.3)应用场景3:大量数据备份场景
示意图如下:
33.15.4)应用场景4:异地备份
示意图如下:
33.1.6)Rsync的传输模式
Rsync有三种传输模式,分别是本地方式、远程方式、守护进程。
33.1.6.1)本地传输方式
本地方式
类似于cp命令
命令示例:[root@web01 ~]# rsync -avz file0801-1 /ml-1/
命令语法: #本地拷贝数据命令 Local: rsync [OPTION...] SRC... [DEST]
完整示例: #在本地创建目录file0801-1,在目录file0801-1里创建文件f1.txt,在本地创建目标目录ml-1 [root@web01 ~]# mkdir file0801-1 [root@web01 ~]# mkdir ml-1 [root@web01 ~]# cd file0801-1 [root@web01 file0801-1]# touch f1.txt #拷贝目录file0801-1至目录ml-1下 rsync -avz file0801-1 /ml-1/ #检查结果 sending incremental file list file0801-1/ file0801-1/f1.txt sent 123 bytes received 39 bytes 324.00 bytes/sec total size is 0 speedup is 0.00 [root@web01 ~]# ll /ml-1/file0801-1 total 0 -rw-r--r-- 1 root root 0 Aug 1 16:12 f1.txt
33.1.6.2)远程方式
远程方式
类似于scp命令
命令示例:[root@web01 ~]# rsync -avz file0801-1 /ml-1/
命令语法: Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
完整示例:#推 push#先在客户端web01创建要复制的目录及文件[root@web01 ~]# mkdir tmp2[root@web01 ~]# cd tmp2[root@web01 tmp2]# touch f1{.txt,.log}#接着在服务器端backup上创建目标目录[root@backup ~]# mkdir tmp3#拷贝客户端上的tmp2目录至服务器端的目录tmp3中[root@web01 tmp2]# rsync -avz tmp2 root@172.16.1.41:tmp3/#检查结果客户端页面:[root@web01 ~]# rsync -avz tmp2 root@172.16.1.41:tmp3/root@172.16.1.41's password: sending incremental file listtmp2/tmp2/f1.logtmp2/f1.txtsent 168 bytes received 58 bytes 90.40 bytes/sectotal size is 0 speedup is 0.00服务器端页面:(服务器端存在目录tmp2,表示已拷贝成功)[root@backup ~]# cd tmp3[root@backup tmp3]# lltotal 0drwxr-xr-x 2 root root 34 Aug 1 16:58 tmp2[root@backup tmp3]# cd tmp2[root@backup tmp2]# lltotal 0-rw-r--r-- 1 root root 0 Aug 1 16:58 f1.log-rw-r--r-- 1 root root 0 Aug 1 16:58 f1.txt
完整示例:#拉 pull#先在服务器端backup上创建要复制的目录及文件[root@backup ~]# mkdir tp10[root@backup ~]# cd tp10[root@backup tp10]# touch aa.txt#再在客户端web01创建目标目录[root@web01 ~]# mkdir f08[root@web01 ~]# mkdir f09#拉服务器端上的tp10目录至客户端的目录f08中[root@web01 ~]# rsync -avz root@172.16.1.41:tp10/ f08#拉服务器端上的tp10目录至客户端的目录tp09中[root@web01 ~]# rsync -avz root@172.16.1.41:tp10 f09#检查结果加/的情况下,只拷贝目录里的内容(不包含目录)客户端页面:[root@web01 ~]# rsync -avz root@172.16.1.41:tp10/ f08root@172.16.1.41's password: receiving incremental file list./aa.txtsent 46 bytes received 104 bytes 42.86 bytes/sectotal size is 0 speedup is 0.00客户端页面:(客户端存在aa.txt,但没有目录tp10)[root@web01 ~]# cd f08[root@web01 f08]# lltotal 0-rw-r--r-- 1 root root 0 Aug 1 18:00 aa.txt不加/的情况下,拷贝目录整体(包含目录本身及目录里的内容)客户端页面[root@web01 ~]# rsync -avz root@172.16.1.41:tp10 f09root@172.16.1.41's password: receiving incremental file listtp10/tp10/aa.txtsent 47 bytes received 117 bytes 65.60 bytes/sectotal size is 0 speedup is 0.00[root@web01 ~]# cd f09[root@web01 f09]# lltotal 0drwxr-xr-x 2 root root 20 Aug 1 18:00 tp10 #只拷贝了tp10目录[root@web01 f09]# cd tp10[root@web01 tp10]# lltotal 0 #tp10下的文件并没有拷贝过来
PS:注意: rsync不管是推还是拉,推送目录的时候带/和不带/
1.带/ :/etc/ 将etc目录里的所有内容(不包括目录),推过去或者拉过来
2.不带/:/etc 将etc目录整体(包括目录及目录里的所有内容)推过去或者拉过来
33.1.6.3)守护进程
步骤1、客户端、服务端安装rsync
客户端: web01-10.0.0.7[root@web01 ~]# yum install -y rsync
服务端: backup-10.0.0.41[root@backup ~]# yum install -y rsync
步骤2、进入服务端会话页面,进行如下操作
服务端页面:1)先修改配置文件:[root@backup ~]# vim /etc/rsyncd.confuid = rsyncgid = rsyncport = 873fake super = yesuse chroot = nomax connections = 200timeout = 600ignore errorsread only = falselist = falseauth users = rsync_backupsecrets file = /etc/rsync.passwdlog file = /var/log/rsyncd.log#####################################[zls]comment = welcome to oldboyedu backup!path = /backup配置文件详解:[root@backup ~]# vim /etc/rsyncd.confuid = rsync #用户名gid = rsync #用户组port = 873 #端口fake super = yes #无需让rsync以root身份运行use chroot = no #禁锢目录,不允许操作指定目录之外的目录max connections = 200 #最大连接数200timeout = 600 #超时时间600s 10分钟ignore errors #忽略错误信息read only = false #关闭只读,对备份数据可读写list = false #不允许查看模块信息auth users = rsync_backup #认证用户,定义虚拟用户作为连接认证用户secrets file = /etc/rsync.passwd #认证用户的密码文件log file = /var/log/rsyncd.log #日志文件######################################模块(任意名字都可以)[zls] #定义模块信息comment = welcome to oldboyedu backup! #注释信息(无关紧要) path = /backup #路径,定义接收备份数据目录===============================================================2)接着创建用户[root@backup ~]# id rsync #检查用户是否存在id: rsync: no such user#创建用户(不允许登录,不创建家目录)[root@backup ~]# useradd rsync -s /sbin/nologin -M===============================================================3)创建一个备份目录[root@backup ~]# mkdir /backup #创建目录backup#授权rsync用户[root@backup ~]# chown -R rsync.rsync /backup/===============================================================4)创建虚拟用户及密码文件[root@backup ~]# vim /etc/rsync.passwdrsync_backup:123456 #用户名:密码[root@backup ~]# chmod 600 /etc/rsync.passwd #授权===============================================================5)启动rsync添加开机自启[root@backup ~]# ll /usr/lib/systemd/system/rsyncd.service -rw-r--r-- 1 root root 237 Apr 26 01:17 /usr/lib/systemd/system/rsyncd.service[root@backup ~]# systemctl start rsyncd #启动rsyncd守护进程[root@backup ~]# systemctl enable rsyncd #允许开机自启Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.6)检查rsync 873 端口是否处于监听状态
[root@backup ~]# netstat -antup | grep 873
7) rsync 客户端仅需配置虚拟用户的密码,并授权为600安全权限 #方式一:适合终端执行指定用户密码文件
[root@backup ~]# yum install rsync -y
[root@backup ~]# echo " 123456 " > /etc/rsync.pass
[root@backup ~]# chmod 600 /etc/rsync.pass#方式二:脚本使用
[root@backup ~]# export RSYNC_PASSWORD=123456实战一:客户端推送backup目录下所有内容至rsync服务端
[root@backup ~]# export RSYNC_PASSWORD=123456
[root@backup ~]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup /backup/实战二:客户端拉取rsync服务端backup模块数据至本地客户端的/backup 目录
[root@backup ~]# export RSYNC_PASSWORD=123456
[root@backup ~]# rsync -avz rsync_backup@172.16.1.41::backup /backup/实战三:rsync实现数据无差异同步
#拉取远端数据:远端与本地保持一致,远端没有本地有会被删除,造成客户段数据丢失
[root@backup ~]# export RSYNC_PASSWORD=123456
[root@backup ~]# rsync -avz --delete rsync_backup@172.16.1.41::backup/ /data/#推送数据到远端:本地与远端保持一致,本地没有远端会被删除,造成服务器端数据丢失
[root@backup ~]# export RSYNC_PASSWORD=123456
[root@backup ~]# rsync -avz --delete /date/ rsync_backup@172.16.1.41::backup/实战四: rsync的Limit限速#文件过大导致内部交换机带宽被沾满,导致用户的请求无法响应
[root@backup ~]# export RSYNC_PASSWORD=123456
[root@backup ~]# rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup/ /data/
步骤3、进入客户端会话页面,进行如下操作
客户端页面:#创建虚拟用户的密码文件[root@web01 ~]# vim /etc/rsync.pass1 #输入密码,对应服务器端密码文件中的密码[root@web01 ~]# chmod 600 /etc/rsync.pass #授权
步骤4、在客户端页面,创建目录,并在该目录下批量创建文件
客户端页面:[root@web01 ~]# mkdir /data #创建目录data[root@web01 ~]# cd /data #切换到目录data[root@web01 data]# touch file{1..50} #在目录data下批量创建50个文件
Rsync的推操作:
[root@web01 data]# rsync -avz /data/ rsync_backup@172.16.1.41::wangxiaogang#将目录data推至服务器端 在守护进程中,不考虑加/或者不加/
Rsync的拉操作
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::wangxiaogang rt#将服务器端的模板目录拉至客户端的rt目录中 在守护进程中,不考虑加/或者不加/