rsync数据备份

一、备份

1.什么是备份?

把重要的数据或文件再次复制一份并保存下来

2.为什么要做备份

1.数据重要
2.为了出现故障,恢复数据

3.能不能不备份

1.重要的数据一定要备份
2.不重要的可以不备份

4.备份的常用工具

cp
scp
rsync

二、rsync简介

rsync 常用选项

-a          		# 归档模式传输, 等于-tropgDl    -t -r -o -p -g -D -l
-v          		# 详细模式输出, 打印速率, 文件数量等
-z          		# 传输时进行压缩以提高效率
-r           		# 递归传输目录及子目录,即目录下得所有目录都同样传输。
-t          		# 保持文件时间信息
-o          		# 保持文件属主信息
-p         		# 保持文件权限
-g         		# 保持文件属组信息
-l         	        # 保留软连接
-P        	        # 显示同步的过程及传输时的进度等信息
-D         	        # 保持设备文件信息
-L          		# 保留软连接指向的目标文件
-e         	        # 使用的信道协议,指定替代rsh的shell程序
--exclude=PATTERN       # 指定排除不需要传输的文件模式
--exclude-from=file 	# 文件名所在的目录文件
--partial           	# 断点续传
--password-file=xxx 	# 使用密码文件

1.简介

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

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

2)限速演示

--bwlimit=100       #限速传输

[root@web01 /tmp]# rsync -avP --bwlimit 100 /tmp/ rsync_backup@172.16.1.41::backup
sending incremental file list
./
data.txt
      5,537,792   1%  100.04kB/s

3)数据一致

--delete            # 让目标目录和源目录数据保持一致

#推:数据与推送数据的源数据一致
[root@web01 /tmp]# rsync -avP --delete /tmp/ rsync_backup@172.16.1.41::backup
sending incremental file list
deleting file2
deleting file1

sent 223 bytes  received 43 bytes  532.00 bytes/sec
total size is 0  speedup is 0.00

#推:数据与拉取数据的源数据一致
[root@web01 /tmp]# rsync -a -v -P rsync_backup@172.16.1.41::backup /tmp --delete
receiving incremental file list
deleting file4
deleting file3
./

sent 32 bytes  received 203 bytes  470.00 bytes/sec
total size is 0  speedup is 0.00
rsync简称远程同步
不同主机之间传递数据:
Linux --->  windows   linux ---> linux   windows ---> linux   linux ---> mac

1)rsync优点

Rsync的优点如下:
1、可以镜像保存整个目录树和文件系统。
2、可以很容易的做到保持原来文件的许可权、时间、软链接等。
3、无须特使许可权即可安装。
4、拥有优化的流程,文件传输效率高。
5、可以使用Rsh、SSH等方式来传输文件,当然也可以直接通过Socket连接。
6、支持匿名传输。
另外,与SCP相比,传输速度不是一个层次级的。我们在局域网时经常用Rsync和SCP传输大量Mysql数据,
发现Rsync至少比Scp快20倍以上,所以大家如果需要在Linux/Unix服务器之间互传海量资料,Rsync是非常好的选择。

2.rsync特性

支持拷贝特殊文件,如连接文件、设备等。
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。
可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。
可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。
可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****。
支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。

3.rsync生产场景

1.借助cron+rsync把所有客户端服务器数据同步到备份服务器。
2.针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案。
3.通过本地打包备份,然后rsync结合inotify应用把全网数统一备份到一个固定存储服务器,然后在存储服务器上通过脚本检查并报警管理员备份结果。
4.定期将IDC机房的数据 备份公司的内部服务器,防止机房地震及火灾问题导致数据丢失。
5.实时同步,解决存储服务器等的单点问题。

4.备份类型

1.全备:将数据从头备份一次
2.增备:对于新增加的数据进行备份
3.差异备份:针对上一次全备之后更新的数据进行备份

三、Rsync的应用场景

1.rsync传输方式

1.push 推
客户端将数据传输到服务端

2.pull 拉
客户端将数据下载下来


2.问题

1.push 推
当客户端数量多,容易造成推送数据阻塞

2.pull 拉
如果客户端数量过多,会对服务端造成很大压力

3.大量服务器备份场景

#假设:像现在有20台机器要备份到一台机器
使用推和拉结合的方式

4.异地备份场景

四、rsync传输模式

1.传输模式

1.本地方式
2.远程方式
3.守护进程方式

2.本地方式(类似于CP)

类似于cp命令,但是cp是全量复制,每次都提示替换
rsync是增量,只要文件属性没有更改就不会替换

1)语法

#本地拷贝数据命令
命令	   选项      源文件  目标
rsync [OPTION...] SRC... [DEST]

2)示例

[root@backup ~]# rsync -avz 1.txt /tmp/
sending incremental file list

sent 44 bytes  received 12 bytes  112.00 bytes/sec
total size is 0  speedup is 0.00

[root@backup ~]# rsync -avz 1.txt /tmp/
#命令拆分
rsync	#命令
-avz	#选项
1.txt	#源文件
/tmp/	#目标地址

2.远程方式(类似于scp)

1)pull拉取数据

#语法:
命令	  选项       用户 @ 主机:源文件  目标地址
rsync [OPTION...] [USER@]HOST:SRC... [DEST]			#如果用户不写,则以当前用户去连接远程机器

#示例
[root@web01 ~]# rsync -avz root@172.16.1.41:/root/1.txt ./
receiving incremental file list
1.txt
sent 43 bytes  received 84 bytes  28.22 bytes/sec
total size is 0  speedup is 0.00

#拆分语句
rsync 				#命令
-avz 				#选项
root				#用户
@					#分隔符
172.16.1.41:		#主机地址
/root/1.txt 		#源文件,要拉取得文件
./					#拉取到的目录地址

#注意:
#拉取远程服务器目录及目录下的文件
[root@web01 ~]# rsync -avz root@172.16.1.41:/tmp ./
#拉取远程服务器目录下的文件,不包含目录本身
[root@web01 ~]# rsync -avz root@172.16.1.41:/tmp/ ./

2)push推送数据

#语法:
rsync [OPTION...] SRC... [USER@]HOST:DEST

#示例:
[root@web01 ~]# rsync -avz file1 root@172.16.1.41:/root/
root@172.16.1.41's password: 
sending incremental file list
file1

sent 83 bytes  received 35 bytes  78.67 bytes/sec
total size is 0  speedup is 0.00

#命令拆分
rsync 				#命令
-avz				#选项
file1 				#源文件
root				#用户
@					#分隔符
172.16.1.41:		#主机
/root/				#目标地址

3.守护进程模式

1)为什么使用守护进程模式

1.rsync远程传输时需要使用系统用户及密码
2.如果使用普通用户,又会出现权限不足的情况

2)守护进程传输模式语法

#语法
rsync [OPTION...] [USER@]HOST::SRC... [DEST]

五、守护进程模式搭建

1.环境准备

主机 IP 身份
backup 172.16.1.41 rsync服务端
web01 172.16.1.7 rsync客户端

2.安装rsync(做备份的服务器都安装)

[root@backup ~]# yum install -y rsync

3.服务端配置

[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup


[root@backup ~]# vim /etc/rsyncd.conf
#指定运行程序的用户
uid = rsync
#运行程序的用户组
gid = rsync
#服务的监听端口
port = 873
#不需要root用户启动,安全机制
fake super = yes
#限制操作目录
use chroot = no
#设置最大连接数
max connections = 200
#超时时间
timeout = 600
#忽略错误
ignore errors
#关闭只读权限
read only = false
#查看模块列表
list = false
#指定授权的虚拟用户
auth users = rsync_backup
#指定虚拟用户使用的密码
secrets file = /etc/rsync.passwd
#日志文件
log file = /var/log/rsyncd.log
#####################################
#模块名字
[backup]
#注释
comment = welcome to oldboyedu backup!
#真实文件目录
path = /backup

4.服务端创建用户

[root@backup ~]# useradd rsync -s /sbin/nologin -M

5.服务端创建密码文件

[root@backup ~]# vim /etc/rsync.passwd
rsync_backup:123456

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

#授权
[root@backup ~]# chmod 600 /etc/rsync.passwd

6.服务端创建真实文件目录

[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup/

7.服务端启动服务

[root@backup ~]# systemctl start rsyncd

#验证启动
[root@backup ~]# netstat -lntp
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      18673/rsync 
tcp6       0      0 :::873                  :::*                    LISTEN      18673/rsync   
       
[root@backup ~]# ps -ef | grep rsync
root      18673      1  0 17:01 ?        00:00:00 /usr/bin/rsync --daemon --no-detach
root      18680   7850  0 17:02 pts/0    00:00:00 grep --color=auto rsync

8.客户端验证推送

1)输入密码的方式

#推送数据
[root@web01 ~]# rsync -avz file2 rsync_backup@172.16.1.41::backup
Password: 123456
sending incremental file list
file2

sent 87 bytes  received 43 bytes  37.14 bytes/sec
total size is 0  speedup is 0.00

#拉取数据
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./
Password: 
receiving incremental file list
./
qiudaodsb

sent 53 bytes  received 173 bytes  64.57 bytes/sec
total size is 0  speedup is 0.00

2)指定密码文件的方式

#客户端配置密码文件
[root@web01 ~]# vim /etc/rsyncd.password
123456
[root@web01 ~]# echo "123456" > /etc/rsyncd.password

#授权
[root@web01 ~]# chmod 600 /etc/rsyncd.password

#推送数据
[root@web01 ~]# rsync -avz file3 rsync_backup@172.16.1.41::backup --password-file=/etc/rsyncd.password 
sending incremental file list
file3

sent 87 bytes  received 43 bytes  86.67 bytes/sec
total size is 0  speedup is 0.00

#拉取数据
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./ --password-file=/etc/rsyncd.password
receiving incremental file list
./
qiudaocsb

sent 50 bytes  received 211 bytes  174.00 bytes/sec
total size is 0  speedup is 0.00

3)配置环境变量的方式

[root@web01 ~]# export RSYNC_PASSWORD=123456

#拉取数据
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./

#推送数据
[root@web01 ~]# rsync -avz file3 rsync_backup@172.16.1.41::backup

二、Rsync备份案例

1.需求

客户端需求
1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02 
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
3.客户端最后将备份的数据进行推送至备份服务器
4.客户端每天凌晨1点定时执行该脚本
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间

服务端需求
1.服务端部署rsync,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留6个月的备份数据,其余的全部删除

2.准备服务器

主机 内网IP
web01 172.16.1.7
backup 172.16.1.41

3.客户端

1)创建备份目录

#备份目录格式
/backup/web01_172.16.1.31_2018-09-02

#取主机名
[root@web01 ~]# hostname
web01

#取IP
[root@web01 ~]# ifconfig eth1 | awk 'NR==2 {print $2}'
172.16.1.7
[root@web01 ~]# hostname -I | awk '{print $2}'
172.16.1.7

#取时间
[root@web01 ~]# date +%F
2020-08-12

#创建目录
[root@web01 ~]# mkdir -p /backup/`hostname`_`hostname -I | awk '{print $2}'`_`date +%F`

2)打包

[root@web01 ~]# cd /backup/web01_172.16.1.7_2020-08-12/

[root@web01 /backup/web01_172.16.1.7_2020-08-12]# tar zcf conf.tar.gz /etc/passwd /var/log/messages &> /dev/null

3)推送数据

[root@web01 ~]# rsync -avz /backup/web01_172.16.1.7_2020-08-12 rsync_backup@172.16.1.41::backup
sending incremental file list
web01_172.16.1.7_2020-08-12/
web01_172.16.1.7_2020-08-12/conf.tar.gz

sent 62,567 bytes  received 47 bytes  125,228.00 bytes/sec
total size is 68,669  speedup is 1.10

4)将以上内容写成脚本

[root@web01 ~]# mkdir /scripts
[root@web01 ~]# vim /scripts/backup.sh
#!/bin/bash
#0.定义变量
SRC=/backup
HOST=`hostname`
IP=`hostname -I | awk '{print $2}'`
DATE=`date +%F`
DIR=${SRC}/${HOST}_${IP}_${DATE}

#1.创建目录
mkdir -p $DIR

#2.进到目录下并打包文件
cd $DIR
tar zcf conf.tar.gz /etc/passwd /var/log/messages &> /dev/null

#3.推送
export RSYNC_PASSWORD=123456
rsync -avz $DIR rsync_backup@172.16.1.41::backup

5)写入定时任务

[root@web01 ~]# crontab -e
#每天凌晨1点进行文件备份
00 01 * * * /bin/bash /scripts/backup.sh &> /dev/null

6)清理数据

#模拟生成一个月数据
[root@web01 ~]# for i in {1..30};do date -s 2020/08/$i;sh /scripts/backup.sh;done

#只保留七天的文件
[root@web01 ~]# find /backup/ -type d -mtime +7 | xargs rm -rf
[root@web01 ~]# ll /backup/
total 0
drwxr-xr-x 2 root root 25 Aug 23 00:00 web01_172.16.1.7_2020-08-23
drwxr-xr-x 2 root root 25 Aug 24 00:00 web01_172.16.1.7_2020-08-24
drwxr-xr-x 2 root root 25 Aug 25 00:00 web01_172.16.1.7_2020-08-25
drwxr-xr-x 2 root root 25 Aug 26 00:00 web01_172.16.1.7_2020-08-26
drwxr-xr-x 2 root root 25 Aug 27 00:00 web01_172.16.1.7_2020-08-27
drwxr-xr-x 2 root root 25 Aug 28 00:00 web01_172.16.1.7_2020-08-28
drwxr-xr-x 2 root root 25 Aug 29 00:00 web01_172.16.1.7_2020-08-29
drwxr-xr-x 2 root root 25 Aug 30 00:00 web01_172.16.1.7_2020-08-30

7)完善脚本

[root@web01 ~]# vim /scripts/backup.sh
#!/bin/bash
#0.定义变量
SRC=/backup
HOST=`hostname`
IP=`hostname -I | awk '{print $2}'`
DATE=`date +%F`
DIR=${SRC}/${HOST}_${IP}_${DATE}

#1.创建目录
mkdir -p $DIR

#2.进到目录下并打包文件
cd $DIR
tar zcf conf.tar.gz /etc/passwd /var/log/messages &> /dev/null

#3.对文件生成验证文件
md5sum $DIR/conf.tar.gz > $DIR/auth.txt

#4.推送
export RSYNC_PASSWORD=123456
rsync -avz $DIR rsync_backup@172.16.1.41::backup

#5.清理数据
find $SRC -type d -mtime +7 | xargs rm -rf

4.服务端

1)安装邮件系统

[root@backup ~]# yum install -y mailx

#编辑邮件系统
[root@backup ~]# vim /etc/mail.rc 
set from=1240206455@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=1240206455@qq.com
set smtp-auth-password=jtyrsvysyukehgdi
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

2)脚本

[root@web01 ~]# vim /scripts/auth.sh
#!/bin/bash
#0.定义变量
SRC=/backup
HOST=`hostname`
IP=`hostname -I | awk '{print $2}'`
DATE=`date +%F`
DIR=${SRC}/${HOST}_${IP}_${DATE}

#1.验证文件的完整性
md5sum -c $DIR/auth.txt > $SRC/result.txt

#2.把验证结果发送到QQ
mail -s "备份数据完整性" 1240206455@qq.com < $SRC/result.txt

#3.清理数据
find $SRC -type d -mtime +180 | xargs rm -rf

三、Rsync结合inotify实现实时备份

1.安装

[root@web01 ~]# yum -y install inotify-tools

2.命令测试

[root@web01 ~]# /usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write  /backup

3.参数详解

-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
    %Xe 事件
    %w 目录
    %f 文件
-e 指定监控的事件
    access 访问
    modify 内容修改
    attrib 属性修改
    close_write 修改真实文件内容
    open 打开
    create 创建
    delete 删除
    umount 卸载

4.实时监控脚本

1)粗糙版

[root@web01 /backup]# vim /scripts/rsync_inotify.sh 
#!/bin/bash
dir=/backup
/usr/bin/inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir | while read line;do
    cd $dir && rsync -az -R --delete . rsync_backup@172.16.1.41::backup --password-file=/etc/rsyncd.password >/dev/null 2>&1
done  &
posted @ 2020-08-11 18:59  nick_xm  阅读(1298)  评论(0编辑  收藏  举报