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

服务端脚本

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
posted @ 2021-02-10 13:31  水煮沉浮~大刀肉  阅读(125)  评论(0)    收藏  举报