什么是备份
备份就是把重要的数据或文件再次复制一份保存起来(给源文件增加一个副本)
为什么要备份
数据很重要!!!
出现故障之后,需要恢复数据(软件服务出现问题几率很小,80%都是人为故障)
保证数据不丢失
便于快速恢复
能不能不做备份
对于不重要的数据,我们可以不做备份
对于不必要的数据可以选择定时清理
备份常用工具
本地复制 cp
远程传输 scp rsync
rsync服务概念
rsync英文称为remote synchronizetion,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又由于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及曾量的复制数据,这又类似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
在同步数据的时候,默认情况下,rsync通过其独特的“quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限、属主等属性的变化同步,但是需要制定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可是实现快速的同步备份数据。
实现不同主机数据同步
rsync简称远程同步,可以实现不同主机之间的同步. 同时支持增量和全量的备份.
不通主机: windows --> linux linux --> linux mac --> linux mac --> windows
rsync监听的端口:873
rsync运行模式:C/S模式 client/server
rsync 特性
支持拷贝特殊文件,如连接文件、设备等。
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。
可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。
可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。
可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****。
支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。
生产场景备份方案
1.借助cron+rsync把所有客户服务器数据同步到备份服务器。
2.针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案。
3.通过本地打包备份,然后rsync结合inotify应用把全网数统一备份到一个固定存储服务器,然后在存储服务器上通过脚本检查并报警管理员备份结果。
4.定期将IDC机房的数据 备份公司的内部服务器,防止机房地震及火灾问题导致数据丢失。
5.实时同步,解决存储服务器等的单点问题。
rsync如何实现的备份 * (备份方式)
rsync实现备份有两种方式:一种是全量备份,一种是增量备份。
全备:将数据完全的备份下来
增备:全备之后,把发生变化数据再备份一次
Rsync应用场景 *
rsync的传输方式: pull 拉 push 推
推:客户端将需要的数据上传到服务端
拉:客户端讲需要的数据下载下来
存在的问题
推:
如果推送的客户端机器过多,容易造成推送数据缓慢
拉:
如果客户端过多,下载数据会对服务端造成压力过大
rsync多server端
例:现在有20台机器,怎么有效快速的缓解推送和拉取时的速度和压力问题s
异地备份场景
Rsync传输模式 *
传输模式一般有三种模式:本地方式、远程方式以及守护进程方式。
本地方式
类似于cp,不支持推送和拉取,只是单纯复制
#本地传输语法
命令 参数、选项 源文件 目标位置
Local: rsync [OPTION...] SRC... [DEST]
#语法示例
[root@web01 ~]# rsync -avz 1.txt /mnt/
#语法拆分
rsync #备份命令
-avz #参数、选项
./1.txt #源文件
/mnt/ #目标位置
类似于cp,但是cp是全量复制,每次都提示覆盖,rsync是增量,只要文件没有变化就不会再传输,如果有任意改变则传输
远程传输方式
类似于scp
- 拉取数据命令语法
#pull拉取数据命令语法
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
#pull拉取数据命令语法实例
web02到web01拉取文件
[root@web02 ~]# rsync -avz root@172.16.1.7:/root/1.txt ./
#pull拉取数据命令语法拆分
rsync #命令
-avz #参数
root #远端服务器用户
@ #分隔符
172.16.1.7: #远端服务器主机IP
/root/1.txt #源地址文件
./ #目标位置
注意:
[root@web02 ~]# rsync -avz root@172.16.1.7:/var/log/ ./ #拉取远程目录下的文件
[root@web02 ~]# rsync -avz root@172.16.1.7:/var/log ./ #拉取远程目录下的文件及目录
- 推送命令语法
#push推送数据命令语法
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
#push推送数据命令语法示例
web02推送文件至web01
[root@web02 ~]# rsync -avz ./log/ root@172.16.1.7:/mnt/ #推送目录下的文件到远端位置
[root@web02 ~]# rsync -avz ./log root@172.16.1.7:/mnt/ #推送目录及目录下的文件到远端
#push推送数据命令语法拆分
rsync #命令
-avz #参数
./log #本地文件或目录
root #远端服务器用户
172.16.1.7 #远端主机ip
/mnt #远端服务器位置
注意:
#当不写用户推送或拉取时,默认使用当前用户连接远端主机同样的用户
[root@web02 ~]# rsync -avz ./log 172.16.1.7:/mnt/
#普通用户也可以推送,只能推送至普通用户有权限的目录下
[root@web02 ~]# rsync -avz ./log qiudao@172.16.1.7:/home/qiudao
守护进程传输模式
为什么是用守护进程模式?
1.rsync传输时,使用系统用户和系统密码(极其不安全)
2.使用普通用户的时候,会出现权限不足的情况
守护进程传输模式语法
- pull拉取数据命令语法
#pull拉取数据命令语法
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
#pull拉取数据命令示例
#客户端web01拉取bakcup服务器的数据
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./
rsync #命令
-avz #参数
rsync_backup #虚拟用户
@ #分隔符
172.16.1.41 #远端主机
::backup #模块名
./ #当前位置
注意:
拉取服务端模块名对应的目录下的文件,拉取的文件可以使任意属主属组
- push推送数据命令语法
#push推送数据命令语法
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
#客户端web01推送数据至bakcup服务器
[root@web01 ~]# rsync -avz backup/ rsync_backup@172.16.1.41::backup
rsync #命令
-avz #参数
backup/ #本地文件
rsync_backup #虚拟用户
@ #分隔符
172.16.1.41 #远端主机
::backup #模块名
注意:
推送时,远端模块对应的目录权限一定是rsyncd服务配置的用户
守护进程模式实践
主机角色 | 外网ip | 内网ip | 主机名 |
---|---|---|---|
Rsync服务端 | 192.168.15.41 | 172.16.1.41 | backup |
Rsync客户端 | 192.168.15.7 | 172.16.1.7 | web01 |
安装rsync(客户端和服务端都要操作)
[root@backup ~]# yum install -y rsync
[root@web01 ~]# yum install -y rsync
配置rsync(服务端) *
[root@backup ~]# vim /etc/rsyncd.conf
#运行进程的用户
uid = rsync
#运行进程的用户组
gid = rsync
#服务的监听端口
port = 873
#无需让rsync以root身份运行,保证文件属性的安全机制
fake super = yes
#操作那个目录就不允许跳出该目录
use chroot = no
#最大连接数
max connections = 200
#超时时间
timeout = 600
#忽略错误信息
ignore errors
#只读,配置成false,文件可读写
read only = false
#查看模块信息
list = false
#定义虚拟用户(rsync传输时使用的用户)
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 ~]# useradd rsync -s /sbin/nologin -M
创建虚拟用户的密码文件并授权(服务端)
[root@backup ~]# echo "rsync_backup:123456" > /etc/rsync.passwd
[root@backup ~]# chmod 600 /etc/rsync.passwd
创建文件目录(服务端)
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup/
启动服务(服务端)
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 22815/rsync
[root@backup ~]#
客户端验证
#方式一:输入密码的方式
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./
[root@web01 ~]# rsync -avz backup/ rsync_backup@172.16.1.41::backup
#方式二:指定密码文件的方式
#客户端添加密码文件
[root@web01 ~]# echo "123456" > /etc/rsync.passwd
[root@web01 ~]# chmod 600 /etc/rsync.passwd
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./ --password-file=/etc/rsync.passwd
[root@web01 ~]# rsync -avz backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
#方式三:配置环境变量的方式
[root@web01 ~]# export RSYNC_PASSWORD=123456
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./
[root@web01 ~]# rsync -avz backup/ rsync_backup@172.16.1.41::backup
rsync常见报错
#1.报错内容:
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./backup
@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1648) [Receiver=3.1.2]
#原因:模块名字配置错误
#2.报错内容:
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./backup
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1648) [Receiver=3.1.2]
#原因:
1.服务端密码文件不存在(名字写错了/没有创建/配置文件错了)
2.密码文件权限不是600
3.服务端密码文件用户名或密码错误
4.客户端密码输入错误或密码文件内容与服务端不一致
#3.报错内容
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./backup
rsync: failed to connect to 172.16.1.41 (172.16.1.41): No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(125) [Receiver=3.1.2]
#原因:服务端防火墙开启
#4.报错内容:
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::/backup ./backup
ERROR: The remote path must start with a module name not a /
rsync error: error starting client-server protocol (code 5) at main.c(1648) [Receiver=3.1.2]
#原因:“::”守护进程模式双冒号后面为模块名,不能使用目录
#5.报错内容:
[root@web01 ~]# rsync -avz ./backup rsync_backup@172.16.1.41::backup
sending incremental file list
rsync: failed to write xattr user.rsync.%stat for "backup" (in backup): Permission denied (13)
rsync: failed to write xattr user.rsync.%stat for "backup/file1" (in backup): Permission denied (13)
backup/
sent 215 bytes received 1,099 bytes 2,628.00 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
[root@web01 ~]#
#原因:服务端推送文件的目录权限不足
#6.报错内容:
[root@web01 ~]# rsync -avz ./backup rsync_backup@172.16.1.41::backup
rsync: failed to connect to 172.16.1.41 (172.16.1.41): Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
#原因:服务端rsyncd服务没有启动
#7.报错内容:
[root@web01 ~]# rsync -avz ./backup rsync_backup@172.16.1.41::backup
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]
#原因:服务端模块对应的目录不存在
#8.报错内容:
[root@nfs ~]# rsync -avz /data/ rsync_backup@172.16.1.41::data
Password:
sending incremental file list
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission denied (13)
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission denied (13)
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission denied (13)
rsync: recv_generator: failed to stat "11_class.xlsx" (in data): Permission denied (13)
rsync: failed to read xattr user.rsync.%stat for "." (in data): Permission denied (13)
sent 81 bytes received 476 bytes 222.80 bytes/sec
total size is 12,437 speedup is 22.33
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
#原因:selinux没有关闭
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 #文件名所在的目录文件
--bwlimit=100 #限速传输
--partial #断点续传
--delete #让目标目录和源目录数据保持一致
--password-file=xxx #使用密码文件
排除参数 --exclude --exclude-from
#推送当前目录下除了dir10以外的所有文件
[root@web01 ~]# rsync -avz ./* rsync_backup@172.16.1.41::backup --exclude=dir10
#排除文件里指定的文件
[root@web01 ~]# rsync -avz ./* rsync_backup@172.16.1.41::backup --exclude-from 1.txt
sending incremental file list
1.txt
dir1/
dir2/
dir3/
dir4/
dir5/
sent 229 bytes received 67 bytes 197.33 bytes/sec
total size is 26 speedup is 0.09
#文件内容
[root@web01 ~]# cat 1.txt
dir10
dir6
dir7
dir8
dir9
限速参数 --bwlimit=100(默认单位为M)
#创建一个500M文件
[root@web01 ~]# dd if=/dev/zero of=./1.txt bs=1M count=500
#指定速度每秒1M
[root@web01 ~]# rsync -avzP --bwlimit 1 ./1.txt rsync_backup@172.16.1.41::backup
sending incremental file list
1.txt
105,676,800 20% 1.01MB/s 0:06:46
数据一致 --delete(无差异同步)
拉:数据与服务端一致,以服务端的数据为准
推:数据与客户端一致,以客户端的数据为准
数据始终与 数据来源的一端保持一致
#拉取数据时与服务端一致
[root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::backup ./ --delete
Rsync备份案例
主机名 | 外网IP | 内网IP |
---|---|---|
web01 | 192.168.15.7 | 192.168.15.7 |
backup | 192.168.15.41 | 192.168.15.41 |
需求
客户端:
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个月的备份数据,其余的全部删除
客户端
- 创建备份目录
[root@web01 ~]# hostname
web01
[root@web01 ~]# hostname -I | awk '{print $2}'
172.16.1.7
[root@web01 ~]# date +%F
2020-02-13
[root@web01 ~]# mkdir /backup/`hostname`_`hostname -I | awk '{print $2}'`_`date +%F` -p
[root@web01 ~]# mkdir /backup/$(hostname)_$(hostname -I | awk '{print $2}')_$(date +%F) -p
[root@web01 ~]# cd /backup/
[root@web01 backup]# ll
total 0
drwxr-xr-x 2 root root 6 Feb 13 11:35 web01_172.16.1.7_2020-02-13
- 打包文件并放到指定目录下
[root@web01 backup]# tar zcf /backup/`hostname`_`hostname -I | awk '{print $2}'`_`date +%F`/file2.tar.gz /etc/passwd
- 推送文件
[root@web01 backup]# rsync -avz /backup/web01_172.16.1.7_2020-02-13 rsync_backup@172.16.1.41::backup
- 写成脚本并优化
#!/bin/bash
#1.定义变量
SRC=/backup
HOST=`hostname`
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
DEST=${HOST}_${IP}_${DATE}
#2.创建目录
mkdir $SRC/$DEST -p
#3.备份文件
cd / && tar zcf $SRC/$DEST/file.tar.gz etc/passwd
#4.推送文件
export RSYNC_PASSWORD=123
rsync -az $SRC/$DEST rsync_backup@172.16.1.41::backup
- 客户端每天凌晨1点定时执行该脚本
[root@web01 backup]# crontab -l
#备份文件
* * * * * /bin/bash /scripts/client.sh
- 保留七天的数据
#创建一个月数据
[root@web01 backup]# for i in {1..30};do date -s 2020/02/$i;sh /scripts/client.sh;done
#删除七天前数据
[root@web01 backup]# find /backup/ -type d -mtime +7 | xargs rm -rf
- 最后客户端脚本完善
#!/bin/bash
#1.定义变量
SRC=/backup
HOST=`hostname`
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
DEST=${HOST}_${IP}_${DATE}
#2.创建目录
mkdir $SRC/$DEST -p
#3.备份文件
cd / && tar zcf $SRC/$DEST/file.tar.gz etc/passwd
#4.给文件添加验证信息
md5sum $SRC/$DEST/file.tar.gz > $SRC/$DEST/flag.txt
#5.推送文件
export RSYNC_PASSWORD=123
rsync -az $SRC/$DEST rsync_backup@172.16.1.41::backup
#6.只保留七天的数据
find $SRC -type d -mtime +7 | xargs rm -rf
- 客户端脚本判断文件是否存在
#!/bin/bash
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
SRC=/backup
HOST=$(hostname)
ADDR=$(ifconfig eth1|awk 'NR==2 {print $2}')
DATE=$(date +%F)
DEST=${HOST}_${ADDR}_${DATE}
#2.创建目录
mkdir -p $SRC/$DEST
#3.备份文件
cd / && \
[ -f $SRC/$DEST/sys.tar.gz ] || tar czf $SRC/$DEST/sys.tar.gz etc/fstab etc/passwd && \
#4.使用md5sum做标记
[ -f $SRC/$DEST/flag_$DATE ] || md5sum $SRC/$DEST/sys.tar.gz > $SRC/$DEST/flag_$DATE
#5.本地推送到备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $SRC/$DEST rsync_backup@172.16.1.41::backup
#6.保留最近七天数据
find $SRC/ -type d -mtime +7|xargs rm -rf
服务端
- 服务端脚本
#!/bin/bash
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
SRC=/backup
DATE=$(date +%F)
#2.验证文件的完整性
md5sum -c $SRC/*_$DATE/flag_$DATE > $SRC/result_$DATE
#3.将验证结果发送给管理员
mail -s "数据验证结果" 1240206455@qq.com < $SRC/result_$DATE
#4.只保留180天数据
find $SRC -type d -mtime +180 | xargs rm -rf
Rsync结合inotify实现实时同步
安装inotify
[root@web01 backup]# yum install -y inotify-tools
命令测试
[root@web01 backup]# inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /backup/
参数详解
-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
%Xe 事件
%w 目录
%f 文件
-e 指定监控的事件
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载
实时监控同步数据的脚本
粗糙版
[root@backup ~]# vim 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.31::backup --password-file=/etc/rsync.passwd >/dev/null 2>&1
done &
精油版
#!/bin/bash
src=/data
des=backup
rsync_passwd_file=/etc/rsync.passwd
ip1=172.16.1.41
user=rsync_backup
cd ${src}
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
do
INO_EVENT=$(echo $file | awk '{print $1}')
INO_FILE=$(echo $file | awk '{print $2}')
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]
then
rsync -azcR --password-file=${rsync_passwd_file} ${INO_FILE} ${user}@${ip1}::${des}
fi
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
rsync -azR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} >/dev/null 2>&1
fi
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
if [ ! -d "$INO_FILE" ]
then
rsync -azcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} >/dev/null 2>&1
fi
fi
done &