rsync的实际应用

需求:mysql

天天晚上01点整在 Web 服务器上打包备份(系统配置文件、日志文件、其余目录),并经过rsync命令推送备份服务器backup上备份保留

nginx

一:环境准备

角色   web

外网IP(NAT)  redis

内网IP(LAN)  sql

主机名vim

WEB服务器安全

  eth0:10.0.0.7bash

 eth1:172.16.1.7服务器

       web01测试

NFS存储服务器

 eth0:10.0.0.31

 eth1:172.16.1.31

       nfs01

Rsync备份服务器

 eth0:10.0.0.41

 eth1:172.16.1.41

     backup

二:需求思路

备份思路:
全部服务器在本地按日期打包, 而后再推到备份服务器backup上


具体要求以下:
1)全部服务器的备份目录必须都为/backup

2)备份的系统配置文件包括但不限于:
1.配置文件
//开机自启动配置文件  设备挂载配置文件  本地内网配置文件
/etc/rc.local       	/etc/fstab      /etc/hosts              

2.重要目录
//cron定时任务       firewalld防火墙       脚本目录
/var/spool/cron/    /etc/firewalld     	   /server/scripts

//3.系统日志文件
/var/log/   //系统安全日志、sudo日志、内核日志、rsyslog日志

//4.应用程序配置文件 rsync、nginx、PHP、mysql、redis.....
//本身思考下还有什么须要备份的?


5)全部服务器推送数据, 以主机名_IP地址_当前时间做为目录, 全部的备份数据存放至该目录下 /backup/nfs-server_172.16.1.31_2018-09-02/
/backup/nfs-server_172.16.1.31_2018-09-03/
/backup/nfs-server_172.16.1.31_2018-09-04/

3)全部服务器本地保留最近7天的数据, 避免浪费磁盘空间


4)Rsync备份服务器上,其它要保留6个月的数据副本。 
/backup/nfs-server_172.16.1.31_2018-09-02/
/backup/nfs-server_172.16.1.31_2018-09-03/
/backup/nfs-server_172.16.1.31_2018-09-04/
/backup/web-server_172.16.1.31_2018-09-02/
/backup/web-server_172.16.1.31_2018-09-03/
/backup/web-server_172.16.1.31_2018-09-04/

6)确保备份的数据完整,在备份服务器上对备份的数据进行检查,把备份的成功及失败结果信息发给系统管理员邮箱中。
7)真实工做中除了服务器之间备份, 可能还会须要异地备份,这个地方请你们思考如何异地备份。

三:细节实现-最简洁的脚本【客户端】

rsync 基本搭建省略。。。

1:如何拼接出对应的目录

主机名:hostname

IP地址:ifconfig eth1|awk 'NR==2{print $2}'

日期:date +%F

[root@nfs01 ~]# echo $(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)

nfs01_172.16.1.31_2018-09-03

2:考虑备份的文件以及推送

 

 

 

3:考虑推送数据时的密码问题:

方式一:

[root@nfs01 ~]# cat /etc/rsync.passwd 

redhat

[root@nfs01 ~]# ll /etc/rsync.passwd 

-rw------- 1 root root 7 Sep  3 10:42 /etc/rsync.passwd

[root@nfs01 ~]#rsync -avz /root/anaconda-ks.cfg  rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd

  

方式二:

[root@nfs01 ~]#export RSYNC_PASSWORD=redhat

[root@nfs01 ~]#rsync -avz /backup/ rsync_backup@172.16.1.41::backup

  

4:暂时脚本是这样:

[root@nfs01 ~]# cat /server/scripts/client_rsync_backup.sh 

#!/usr/bin/bash

 

Host=$(hostname)

Addr=$(ifconfig eth1|awk 'NR==2{print $2}')

Date=$(date +%F)

Dest=${Host}_${Addr}_${Date}

Path=/backup

 

#!/usr/bin/bash

 

Host=$(hostname)

Addr=$(ifconfig eth1|awk 'NR==2{print $2}')

Date=$(date +%F)

Dest=${Host}_${Addr}_${Date}

Path=/backup

 

#1.建立目录

mkdir -p $Path/$Dest

 

#2.备份文件

                #system

/usr/bin/cp -rp /etc/fstab /etc/hosts $Path/$Dest

                #dir

/usr/bin/cp -rp /etc/firewalld /server/scripts $Path/$Dest

                #conf

/usr/bin/cp -rp /etc/rsyncd.conf $Path/$Dest

 

#3.推送数据

export RSYNC_PASSWORD=redhat

rsync -avz /backup/ rsync_backup@172.16.1.41::backup

 

5:批量建立前一个月的数据

[root@nfs01 backup]# for i in {0..30};do date -s 2018/08/$i;sh /server/scripts/client_rsync_backup.sh ;done

 

四:实现完整功能【客户端】

1:数据流过程

备份文件

    打包

   flag标记

rsync推送

 校验flag

   邮件通知

散文件

 -> 打包

 ->标签

 ->运输

  ->校验

  ->通知

 

打包:tar

标签:MD5

校验:肯定数据正确

 

2:如何加标签--服务端如何校验

加标签

[root@nfs01 backup]# md5sum nfs01_172.16.1.31_2018-09-03/syste.tar.gz >flag

[root@nfs01 backup]# cat flag

fe032643312dee71136b39bcb0e28e01  nfs01_172.16.1.31_2018-09-03/syste.tar.gz

验证标签

[root@nfs01 backup]# md5sum -c flag

nfs01_172.16.1.31_2018-09-03/syste.tar.gz: OK

测试:

[root@nfs01 backup]# echo '123' >nfs01_172.16.1.31_2018-09-03/syste.tar.gz

[root@nfs01 backup]# md5sum -c flag

nfs01_172.16.1.31_2018-09-03/syste.tar.gz: FAILED

md5sum: WARNING: 1 computed checksum did NOT match

一堆数据怎么加标签?

[root@nfs01 backup]# md5sum nfs01_172.16.1.31_2018-09-03/*.tar.gz

3efeb6d2be0422043b6323bfa8bdc9f4  nfs01_172.16.1.31_2018-09-03/conf.tar.gz

9e06a9b698416f28b29d2890a6c39232  nfs01_172.16.1.31_2018-09-03/dir.tar.gz

ba1f2511fc30423bdbb183fe33f3dd0f  nfs01_172.16.1.31_2018-09-03/syste.tar.gz

3:增长和校验大量数据

[root@nfs01 backup]# for i in {0..30};do date -s 2018/08/$i;sh /server/scripts/client_rsync_backup.sh ;done

 

 

如何大规模校验?

[root@nfs01 ~]# md5sum -c /backup/*/flag*

 

 

如何基于当天校验?

[root@nfs01 ~]# find /backup/ -type f -name "flag_$(date +%F)"|xargs md5sum -c

/backup/nfs01_172.16.1.31_2018-08-30/conf.tar.gz: OK

/backup/nfs01_172.16.1.31_2018-08-30/dir.tar.gz: OK

/backup/nfs01_172.16.1.31_2018-08-30/syste.tar.gz: OK

4:保留最近7天的数据

[root@nfs01 ~]# find /backup/ -type d  -mtime +7

 

[root@nfs01 ~]# find /backup/ -type d  -mtime +7 -exec rm -rf {} \;

5:最终客户端脚本:

[root@nfs01 ~]# vim /server/scripts/client_rsync_backup_md5.sh

#!/usr/bin/bash

 

Host=$(hostname)

Addr=$(ifconfig eth1|awk 'NR==2{print $2}')

Date=$(date +%F)

Dest=${Host}_${Addr}_${Date}

Path=/backup

 

#1.建立目录

[ -d $Path/$Dest ]||mkdir -p $Path/$Dest

 

#2.备份文件

cd / && \

#system

[ -f $Path/$Dest/syste.tar.gz ] || tar czf $Path/$Dest/syste.tar.gz etc/fstab etc/hosts && \

                #dir

[ -f $Path/$Dest/dir.tar.gz ] || tar czf $Path/$Dest/dir.tar.gz etc/firewalld server/scripts && \

                #conf

[ -f $Path/$Dest/conf.tar.gz ] || tar czf $Path/$Dest/conf.tar.gz etc/rsyncd.conf && \

[ -f $Path/$Dest/flag_$Date ] || md5sum $Path/$Dest/*.tar.gz >$Path/$Dest/flag_$Date

#3.推送数据

export RSYNC_PASSWORD=redhat

rsync -avz $Path/ rsync_backup@172.16.1.41::backup

[ -d $Path/$Dest]||/usr/bin/cp -rp /etc/rsyncd.conf $Path/$Dest &&\

 

#4.保留本地最近7天的数据

find $Path/ -type d -mtime +7 -exec rm -rf {} \;

 

五:编写定时任务【客户端】

[root@nfs01 ~]# crontab -l

00 01 * * * /bin/bash /server/scripts/client_rsync_backup_md5.sh &>/dev/null

 

六:服务端须要定时校验,校验完成须要发邮件通知管理员

 

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

[root@backup /]# vim /etc/mail.rc

set bsdcompat

set from=xxxxx@qq.com

set smtp=smtps://smtp.qq.com:465

 

set smtp-auth-user=xxxxx@qq.com  #管理员邮箱

set smtp-auth-password=xxxxx  #客户端受权码

set smtp-auth=login

set ssl-verify=ignore

set nss-config-dir=/etc/pki/nssdb/

 

 

 

 

 

脚本

[root@backup ~]# mkdir -p /server/scripts/

[root@backup ~]# cat /server/scripts/check_backup.sh

 

#/usr/bin/bash

Path=/backup

Date=$(date +%F)

 

#1.校验数据

find $Path -type f -name "flag_$Date"|xargs md5sum -c >$Path/result_$Date

 

#2.通知管理员

mail -s "Rsync_backup $(date +%F)" 572891887@qq.com <$Path/result_$Date

 

#3.保留最近6个月的数据

#flag mtime 3day

find $Path/ -type f -name "result*" -mtime +3 -exec rm -f {} \;

#date mtime 180day

find $Path/ -type d -mtime +180|xargs rm -rf

  

定时任务

      服务端编写定时任务脚本

      [root@backup backup]# crontab -l

       00 05 * * * /bin/bash /server/scripts/check_backup.sh &>/dev/null