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

服务端需求
  1.服务端部署rsync,用于接收客户端推送过来的备份数据
  2.服务端需要每天校验客户端推送过来的数据是否完整
  3.服务端需要每天校验的结果通知给管理员
  4.服务端仅保留6个月的备份数据,其余的全部删除
注意:所有服务器的备份目录必须都为/backup  建议备份的数据内容如下   
/etc/rc.local /etc/fstab /etc/hosts /etc/firewalld /server/scripts /var/spool/cron/


准备3台服务器主机名分别为web01、backup 、nfs主机信息见下表:

角色 外网IP(NAT)   内网IP(LAN) 主机名
WEB eth0:10.0.0.7 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

一,客户端备份需求分析

遇到的问题: 1.我要备份什么? /etc/rc.local /etc/fstab /etc/hosts /var/spool/cron/ /etc/firewalld /server/scripts 2.我要备份到哪里? /backup目录 该主机的主机名称该主机的IP地址今天的日期 3.我要推送到哪儿? 备份服务器 172.16.1.41 backup模块


执行成功再粘贴进脚本中
1.我们要准备一个目录
[root@nfs ~]# mkdir -p "/backup/$(hostname)_$(ifconfig eth1 | awk '/inet / {print $2}')_$(date +%F)"

2.将文件备份到该目录中
[root@nfs ~]# cp -r /etc/rc.local /etc/fstab /etc/hosts /backup/nfs_172.16.1.31_2020-04-15/

3.使用rsync命令进行运输
[root@nfs ~]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup

4.保留最近7天

  1. #测试拿来用就OK
  2. for i in {1..30};
  3. do date -s 2020/04/$i && sh /scripts/clinet_push_data.sh;
  4. done

[root@nfs ~]# find /backup -type d -mtime +7 | xargs rm -rf

5.编写定时任务
[root@nfs backup]# crontab -l
#backup \* * * * * /usr/bin/sh /scripts/clinet_push_data.sh &>/dev/null #测试 #00 01 * * * /usr/bin/sh /scripts/clinet_push_data.sh &>/dev/null


6.脚本编写:(将手动执行成功的1 2 3 4 5 写成一个脚本)

  1. [root@nfs ]# vim /scripts/clinet_push_data.sh
  2. #!/usr/bin/bash
  3. export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  4. #( echo $PATH 粘贴-》申明命令执行的路径)
  5. #固定的字符=不确定的值 ---------->>> 变量的使用让所有的调用可以变得灵活
  6. Host=$(hostname)
  7. Addr=$(ifconfig eth1 | awk '/inet / {print $2}')
  8. Time=$(date +%F)
  9. Path=/backup
  10. DirName="${Host}_${Addr}_${Time}"
  11. #1.我们要准备一个目录
  12. mkdir -p "${Path}/${DirName}"
  13. #2.将文件备份到该目录中
  14. cp -r /etc/rc.local /etc/fstab /etc/hosts ${Path}/${DirName}
  15. #3.使用rsync命令进行运输(脚本中免密操作)
  16. export RSYNC_PASSWORD=123456
  17. rsync -avz ${Path}/ rsync_backup@172.16.1.41::backup
  18. #4.保留本地7天的数据
  19. find ${Path} -type d -mtime +7 | xargs rm -rf

打包前一天的 $(date +%F -d ‘1 day ago’)

PS:$符号后的括号:

(1)${a} 代表变量a的值, 在不引起歧义的情况下可以省略大括号。 ${ } 会比较精确的界定变量名称的范围。 (2)$(cmd) shell编程中用于命令替换,和cmd效果相同。 [root@backup01 ~]# echo hostname backup01 [root@backup01 ~]# echo $(hostname) backup01

(3)$((expression)) 和exprexpression效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。

  1. 配置定时任务,定时执脚本测试

    image.png image.png


二,客户端推送脚本完善,服务端查收

1. 备份服务规划

(ntpdate time.windows.com #同步服务器时间)

  1. 服务端部署rsync,用于接收客户端推送过来的备份数据
  2. 服务端需要每天校验客户端推送过来的数据是否完整

md5sum命令用于生成和校验文件的md5值。它会逐位对文件的内容进行校验。是文件的内容,与文件名无关,也就是文件内容相同,其md5值相同。md5值是一个128位的二进制数据,转换成16进制则是32(128/4)位的进制值。 md5校验,有很小的概率不同的文件生成的md5可能相同。比md5更安全的校验算法还有SHA*系列的。 在网络传输时,我们校验源文件获得其md5sum,传输完毕后,校验其目标文件,并对比如果源文件和目标文件md5,一致的话,则表示文件传输无异常。否则说明文件在传输过程中未正确传输。

  1. 服务端仅保留6个月的备份数据,其余的全部删除
    流程图
    34. Rsync全网备份 - 图3

2. 备份服务实现步骤

2.1 完善改客户端推送数据脚本,加入校验功能:

[root@nfs ~]# vim /scripts/clinet_push_data.sh

  1. #!/usr/bin/bash
  2. #客户端推送备份的数据至备份服务器 by oldxu
  3. #0.将目录需要用的主机名,IP,时间,定义为变量
  4. export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  5. Host=$(hostname)
  6. Addr=$(ifconfig eth1 | awk '/inet / {print $2}')
  7. Time=$(date +%F)
  8. Path=/backup
  9. DirName="${Host}_${Addr}_${Time}"
  10. #1.我们要准备一个目录
  11. mkdir -p "$Path/$DirName"
  12. #2.将文件备份到该目录中
  13. cd / && \
  14. tar czf $Path/$DirName/sys.tar.gz etc/rc.local etc/fstab && \
  15. tar czf $Path/$DirName/other.tar.gz etc/hosts && \
  16. md5sum $Path/$DirName/*.tar.gz > $Path/$DirName/check_flag_$Time
  17. #3.使用rsync命令进行运输
  18. export RSYNC_PASSWORD=123456
  19. rsync -avz $Path/ rsync_backup@172.16.1.41::backup
  20. #4.保留本地7天的数据
  21. find $Path -type d -mtime +7 | xargs rm -rf

注意给权限:chmod +x /scripts/clinet_push_data.sh

**

反斜杠一般用作转义字符,或称逃脱字符,Linux如果echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号 echo -e “\n”

反斜杠的另一种作用,就是当反斜杠用于一行的最后一个字符时,Shell把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。


2.2 编写服务端校验脚本:

根据客户端推送的封条 —> 校验数据是否一致,最后通知管理员。

  1. [root@backup ~]# cat /scripts/check_clinet_data.sh
  2. #!/usr/bin/bash
  3. #检查客户端推送的数据 by oldxu
  4. #0.将目录需要用的主机名,IP,时间,定义为变量
  5. export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  6. Time=$(date +%F)
  7. Path=/backup
  8. #1.找到当天的check_flag文件,校验数据是否是完整的,并且将校验结果存储至某个文件中
  9. find $Path/ -type f -name "check_flag_$Time" | xargs md5sum -c > $Path/result_$Time
  10. #3.将校验的结果通知给管理人员
  11. mail -s "Rsync Backup $Time" #收件人邮箱 <$Path/result_$Time
  12. #4.服务端仅保留6个月的备份数据,其余的全部删除
  13. find $Path -type d -mtime +180 | xargs rm -rf

PS: md5sum —help c, —check:从指定文本中读取md5值,然后检测MD5值对应的文件是否完整,这个“指定文本”的格式如下:

$md5sum a.out > md5.txt $cat md5.txt 40a9477fa25a9df86361571dd60feffc a.out $ md5sum -c md5.txt a.out: OK

md5只能针对文件校验

2.3 配置发件人邮箱账号密码:

[root@backup  ~]# cat  /etc/mail.rc
set from=simba777@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=simba777@qq.com
set smtp-auth-password=#复制客户端授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

------>  ospbcthlvkvubceh

error: commd not for found: yum install -y mailx

2.4 配置定时任务

[root@nfs backup]# crontab -l
#backup
00 01 * * * /usr/bin/sh /scripts/clinet_push_data.sh &>/dev/null

PS: 如何快速备份一台新的机器? [root@web01 ~]# rsync -avz 172.16.1.31:/scripts /

接下来完整的测试一把,测试完成后,需要将时间修改为对应的真实时间。

nfs、web: [root@nfs  ~]# crontab -l
* * * * * /usr/bin/sh /scripts/clinet_push_data.sh &>/dev/null
backup: [root@backup  ~]# crontab -l
/2    * /usr/bin/sh /scripts/check_clinet_data.sh &>/dev/null

三,排错:

1. 备份时显示权限不足--->查看服务端权限 ,属组属组,rysnc是否启动。
    chmod 600 /etc/rsync.passwd
    systemctl start rsyncd

2. 收不到邮件怎么办?
  1.看看配置文件的邮箱地址
  2.有没有安装mailx
  4.校验失败
    校验脚本写错了
    查看时间是是否相符合
nfs:
ntpdate  time.windows.com  同步时间
date -s  2020-xx-xx 修改时间