需求:
每天晚上01点整在 Web 服务器上打包备份(系统配置文件、日志文件、其他目录),并通过rsync命令推送备份服务器backup上备份保留
一:环境准备
角色 |
外网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 |
二:需求思路:
备份思路:
所有服务器在本地按日期打包, 然后再推到备份服务器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