Rsync备份案例
rsync备份案例
客户端需求
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个月的备份数据,其余的全部删除
注意:所有服务器的备份目录必须都为/backup
1.客户端将需要备份的文件放入指定的目录中 /backup/nfs_172.16.1.31_2018-09-02
2.客户端每天凌晨1点使用rsync命令推送一次nfs_172.16.1.31_2018-09-05
3.客户端保留最近7天的数据即可
一、主机规划
主机 | IP | 身份 |
---|---|---|
backup | 172.16.1.41 | rsync服务端 |
nfs | 172.16.1.31 | rsync客户端 |
web01 | 172.161.7 | rsync客户端 |
二、研读需求
客户需求
1.客户端提前准备存放的备份的目录,目录规则如下:**/backup/nfs_172.16.1.31_2018-09-02**
#客户端需要准备一个目录【backup】存放备份的文件,在这个目录下面自动生成一个由【主机名_IP_时间】目录
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至**/backup/nfs_172.16.1.31_2018-09-02**
#系统配置文件、应用配置这里统一定义为【/etc/passwd】【/etc/fstab】,用**tar**命令打包,拷贝至刚刚创建的目录中
3.客户端最后将备份的数据进行推送至备份服务器
#rsync推送至备份服务器【backup】
4.客户端每天凌晨1点定时执行该脚本
#定时任务即可
5.客户端本地保留最近7天的数据, 避免浪费磁盘空间
#删除前七天的内容
服务端需求
1.服务端部署rsync,用于接收客户端推送过来的备份数据
#部署rsync
2.服务端需要每天校验客户端推送过来的数据是否完整
#可以用md5sum来校验
3.服务端需要每天校验的结果通知给管理员
#部署邮件系统
4.服务端仅保留6个月的备份数据,其余的全部删除
#删除前180天的内容
三、客户端准备
【主机web01、nfs上】
以nfs为例,web01拷贝脚本即可
批量修改时间。并执行脚本,产生数据文件
[root@nfs scripts]# for i in {1..30};do date -s 2021/2/$i;sh /scripts/client_backup.sh;done
客户端脚本
1、创建/backup目录
[root@nfs ~]# mkdir /backup
2、创建脚本存放目录
[root@nfs ~]# mkdir /scripts
3、在脚本目录中创建脚本
[root@nfs scripts]# vim client_backup.sh
#!/bin/bash
#Date:2021-2-8
#Author:zxm
#Warring:命令使用绝对路径
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#定义变量
Hostname=$(hostname)
IP=$(ifconfig eth1 | awk 'NR==2 {print $2}')
Date=$(date +%F)
SRC=/backup
DEST=${Hostname}_${IP}_${Date}
#1、创建目录
#mkdir -p $SRC/$DEST
#这样创建固然没有错误,假如同一天需要备份两次,
#那么创建目录这个动作也就操作了两次,在这里做一次判断
#假如这个文件夹存在,就不必创建
#[ -d $SRC/$DEST ] 判断目录是否存在,||实现逻辑或的功能【见扩展笔记内容】
[ -d $SRC/$DEST ] || mkdir -p $SRC/$DEST
#2、备份文件
#这里也判断一次是否存在压缩文件,如果一天内要对需要备份的文件进行两次备份且
#内容有所改变的话,则不能进行判断,因为判断了增加的内容就不能备份进去
#tar命令中c是创建,z是压缩gz的格式,f是强制,P是解决这个错误 ==>tar: Removing leading `/’ from member names
[ -f $SRC/$DEST/sys.tar.gz ] || /usr/bin/tar czfP $SRC/$DEST/sys.tar.gz /etc/fstab /etc/passwd && \
[ -f $SRC/$DEST/other.tar.gz ] || /usr/bin/tar czfP $SRC/$DEST/other.tar.gz /scripts/client_backup.sh
#3、使用md5sum打标记
#同理一天只执行一次脚本且内容是无增加就不用判断md5sum的值是否改变,这里是同一天多次测试,防止值发生改变
[ -f $SRC/$DEST/flag_$Date ] || /usr/bin/md5sum $SRC/$DEST/*.tar.gz > $SRC/$DEST/flag_$Date
#4、将备份文件推送至备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $SRC/$DEST rsync_backup@172.16.1.41::backup
#5.保留本地最近7天的数据
find $SRC/ -type d -mtime +7|xargs rm -rf
扩展知识
&&运算符
格式
command1 && command2
&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执行这个命令”。
1、命令之间使用 && 连接,实现逻辑与的功能。
2、只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
3、只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。
=======================================================================================================================
||运算符
格式
command1 || command2
||则与&&相反。如果||左边的命令(command1)未执行成功,那么就执行||右边的命令(command2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。
1、命令之间使用 || 连接,实现逻辑或的功能。
2、只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
3、只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。
-----------------------------------------------------------------------------------------------------------------------
命令 mtime 、xargs使用
mtime 常与find连起来使用,还有其他命令【atime、ctime、amin、cmin、mmin】
用法:find . {-atime/-ctime/-mtime/-amin/-cmin/-mmin} [-/+]num
参数分析:
1.第一个参数“.”,代表当前目录,如果是其他目录,可以输入绝对目录和相对目录位置;
2.第二个参数分两部分,前面字母a、c、m为操作类型,后面time为日期,min为分钟(注意只能以time、min作为单位);
3.第三个参数为量,其中不带符号表示符合该数量的,带-表示符合该数量以后的,带+表示符合该数量以前的。
具体解释:
=======================================================================================================================
atmin: 访问时间(access time),指的是文件最后被读取的时间,可以使用touch命令更改为当前时间;
-atime<24小时数> 查找在指定时间曾被存取过的文件或目录,单位以24小时计算。
例如:当前时间为2016年5月18日 14:10:00,查询2016年5月18日00:00:00到2016年5月18日23:59:59被访问过的文件。
time表示日期,时间单位是day,查找单位时间内的不带符号,当前无往前偏移,因此查询语句为:
find . -atime 0 (-amin 同理)
=======================================================================================================================
ctime: 变更时间(change time),指的是文件本身(权限、所属组、位置......)最后被变更的时间,变更动作可以使chmod、chgrp、mv等等;
-ctime<24小时数> 查找在指定时间之时被更改的文件或目录,单位以24小时计算。
例如:当前时间为2016年5月18日 14:10:00,查询2016年5月18日00:00:00到2016年5月18日23:59:59被修改过的文件。查询语句为:
find . -ctime 0
=======================================================================================================================
mtime: 修改时间(modify time),指的是文件内容最后被修改的时间,修改动作可以使echo重定向、vi等等;
-mtime<24小时数> 查找在指定时间曾被更改过的文件或目录,单位以24小时计算。
例如:当前时间为2016年5月18日 14:10:00,查询2016年5月18日00:00:00到2016年5月18日23:59:59内容被修改过的文件。查询语句为:
find . -mtime 0
-----------------------------------------------------------------------------------------------------------------------
xargs
四、服务端准备
安装rsync
1.安装rsync(做备份的服务器都安装)
[root@backup ~]# yum install -y rsync
[root@backup ~]# rpm -qc rsync #找出配置文件
/etc/rsyncd.conf #主配置文件
/etc/sysconfig/rsyncd #选项
2.服务端配置
[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
3.服务端创建用户
[root@backup ~]# useradd rsync -s /sbin/nologin -M
4.服务端创建密码文件
[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
5.服务端创建真实文件目录
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup/
6.服务端启动服务
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable 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
配置邮件服务器
1.配置邮件
[root@backup ~]# yum install mailx -y
[root@backup ~]# vim /etc/mail.rc
set from=123@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=123@qq.com
set smtp-auth-password=xxxxxx #生成授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
2.验证能否成功的发送邮件
[root@backup ~]# echo "test" | mail -s "hello" 123@hotmail.com
服务端脚本
1、创建/backup目录
[root@nfs ~]# mkdir /backup
2、创建脚本存放目录
[root@nfs ~]# mkdir /scripts
3、编写服务端脚本
[root@backup scripts]# vim server_backup.sh
#!/bin/bash
#Date:2021-2-8
#Author:zxm
#Warring:命令使用绝对路径
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#定义变量
Date=$(date +%F)
SRC=/backup
#1.使用md5进行校验,并保存校验的结果
md5sum -c $SRC/*_$DATE/flag_$DATE > $SRC/Data_check_$DATE
#2.将保存的结果文件发送给管理员
mail -s "Rsync Backup $DATE" zxmabc@hotmail.com < $SRC/Data_check_$DATE
#3.保留最近180天的数据
find $SRC/ -type d -mtime +180|xargs rm -rf
最后进行整体测试:
1.删除客户端的整个目录
2.删除服务端/backup下面的所有内容
3.编写定时任务测试【在修改客户端每天凌晨1点,服务端每天凌晨5点】
#客户端
[root@nfs ~]# rm -rvf /backup/*
[root@nfs ~]# crontab -e
* 1 * * * sh /scripts/client_backup.sh
#服务端
[root@backup ~]# rm -rvf /backup/*
[root@backup ~]# crontab -e
* 5 * * * sh /scripts/server_backup.sh
如何扩展备份多台服务器:
[root@web01 ~]# rsync -avz root@172.16.1.31:/server /
[root@web01 ~]# sh /server/scripts/client_push_data.sh
一起动手学习吧!!!