(转)全网服务器数据备份解决方案
第1章 项目准备工作
1.1 基本备份要求
已知3台服务器主机名分别为:web01,backup,nfs01,主机信息如下表:
服务器说明 |
外网IP |
内网IP |
主机名 |
Nginx web服务器 |
10.0.0.8/24 |
172.16.1.8/24 |
web01 |
NFS存储服务器 |
10.0.0.31/24 |
172.16.1.31/24 |
nfs01 |
rsync备份服务器 |
10.0.0.41/24 |
172.16.1.41/24 |
backup |
需求:每天晚上0点整在web服务器上打包备份系统配置文件,网站程序目录及访问日志通过rsync命令推送备份服务器backup上备份保留。
具体要求如下:
1)web服务器和备份服务器的备份目录都必须为/backup
2)要备份的系统配置文件包括但不限余:
a.定时任务服务的配置文件(/var/spool/cron/root)
b.开机自启动的配置文件(/etc/rc.local)
c.日常脚本的目录(/server/scripts)
d.防火墙iptables的配置文件(/etc/sysconfig/iptables)
3)web服务器站点目录为(/var/html/www)
4)Web服务器A访问日志的路径为(/app/logs)
5)Web服务器保留打包后的7天的备份数据即可(本地留存不能多于7天,因为太多硬盘会满)
6)备份服务器上,保留最近7天的备份数据,同时保留6个月内每周一的所有数据。
7)备份服务器上要安装备份数据服务器的内网IP为目录保存备份,备份的文件安装时间名字保存。
8)需要确保备份的数据尽量完整争取,在备份服务器上对备份的数据进行检查,把备份的成功及失败结果信息发给系统管理员的邮箱中。
1.2 简单逻辑图
1.3 解题思路
1)搭建backup服务器。
a.搭建rsync服务
2)搭建web服务器。
1.验证rsync服务能否推送成功。
2.开发脚本,实现打包,备份,推送,校验,删除。
3.配置定时任务定时推送,每天0点定时推送。
3)搭建backup服务器。
1.实现校验,删除,报警。
2.配置定时任务每天6点定时执行。
4)搭建nfs服务器。
1.验证rsync服务能否推送成功。
2.开发脚本,实现打包,备份,推送,校验,删除。
3.配置定时任务定时推送,每天0点定时推送。
第2章 项目实施
2.1 搭建backup服务器。
2.1.1 rsync的默认配置文件是/etc/rsyncd.conf,配置文件默认是空的,需要自己编辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
[root@backup ~] # cat /etc/rsyncd.conf #rsync_config_____________________________start #created by oldboy 15:01 2007-6-5 ##rsyncd.conf start## uid = rsync gid = rsync use chroot = no max connections = 200 timeout = 300 pid file = /var/run/rsyncd .pid lock file = /var/run/rsyncd .lock log file = /var/log/rsyncd .log ignore errors read only = false list = false hosts allow = 172.16.1.0 /24 #hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file = /etc/rsync .password [backup] path = /backup [nfsbackup] path = /nfsbackup [luo] path = /luo ignore errors read only = false list = false hosts allow = 172.16.1.0 /24 #hosts deny = 0.0.0.0/32 auth users = tang secrets file = /etc/tang #rsync_config________________________end |
2.1.2 添加用户rsync
1
2
3
|
[root@backup ~] # useradd rsync -s /sbin/nologin -M [root@backup ~] # cat /etc/passwd|grep rsync rsync :x:501:501:: /home/rsync : /sbin/nologin |
为什么用虚拟用户?
应答:文件和进程都要满足属主的要求,文件和进程的存在一定是需要用户的,也是为了安全问题。
2.1.3 根目录下添加backup目录
1
2
3
4
|
[root@backup ~] # mkdir -p /backup/ [root@backup ~] # chown -R rsync.rsync /backup/ [root@backup ~] # ls -ld /backup/ drwxr-xr-x 3 rsync rsync 20480 1月 18 09:51 /backup/ |
2.1.4 创建rsync的密码配置文件,默认也是空的
1
2
3
4
5
|
[root@backup ~] # cat /etc/rsync.password rsync_backup:oldboy [root@backup ~] # chmod 600 /etc/rsync.password [root@backup ~] # ls -l /etc/rsync.password -rw-------. 1 root root 20 11月 29 01:14 /etc/rsync .password |
2.1.5 开启服务并开机自启动
1
2
|
[root@backup ~] # tail -1 /etc/rc.local /usr/bin/rsync --daemon |
2.1.6 服务器端测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@backup ~] # ps -ef|grep rsync|grep -v grep root 23049 1 0 Jan15 ? 00:00:00 rsync --daemon root@backup ~] # lsof -i:rsync COMMAND PID USER FD TYPE DEVICE SIZE /OFF NODE NAME rsync 23049 root 3u IPv4 56971 0t0 TCP *: rsync (LISTEN) rsync 23049 root 5u IPv6 56972 0t0 TCP *: rsync (LISTEN) [root@backup ~] # netstat -lntup|grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 23049 /rsync tcp 0 0 :::873 :::* LISTEN 23049 /rsync [root@backup ~] # telnet 172.16.1.41 873 Trying 172.16.1.41... Connected to 172.16.1.41. Escape character is '^]' . @RSYNCD: 30.0 说明服务器端配置没有问题 |
2.2 验证rsync服务能否推送成功。
2.2.1 客户端配置
1
2
3
4
|
[root@web01 ~] # cat /etc/rsync.password oldboy [root@web01 ~] # ls -ld /etc/rsync.password -rw------- 1 root root 7 1月 18 16:01 /etc/rsync .password |
2.2.2 客户端推送
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@web01 backup] # rsync -avz /backup/ rsync_backup@172.16.1.41::backup/ --password-file=/etc/rsync.password sending incremental file list ./ 1 10 2 3 4 5 6 7 8 9 说明客户端推送成功 |
2.2.3 Web服务器实现打包,备份,推送,删除。
2.2.3.1 命令行备份
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
[root@web01 backup] # mkdir /var/html/www -p [root@web01 scripts] # mkdir /app/logs -p [root@web01 /] # tar zcvfh /backup/sys_config_$(date +%F).tar.gz ./var/spool/cron/root ./server/scripts/ ./etc/rc.local . /var/spool/cron/root . /server/scripts/ . /server/scripts/bak .sh . /etc/rc . local [root@web01 /] # tar zcvfh /backup/webdata_config_$(date +%F).tar.gz ./var/html/www/ . /var/html/www/ . /var/html/www/4 . /var/html/www/7 . /var/html/www/5 . /var/html/www/6 . /var/html/www/2 . /var/html/www/8 . /var/html/www/3 . /var/html/www/10 . /var/html/www/1 . /var/html/www/9 [root@web01 /] # tar zcvfh /backup/access_log_config_$(date +%F).tar.gz ./app/logs/ . /app/logs/ . /app/logs/f . /app/logs/c . /app/logs/a . /app/logs/d . /app/logs/e . /app/logs/b . /app/logs/g |
2.2.3.2 推送:
1
|
[root@web01 backup] # rsync -avz /backup/ rsync_backup@172.16.1.41::backup/ --password-file=/etc/rsync.password |
2.2.3.3 删除:
1
|
[root@web01 backup] # find /backup/ -type f -mtime +7|xargs rm -rf |
2.2.3.4 全部放到脚本里:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
cat /server/scripts/bak .sh #!/bin/sh export PATH= /usr/local/sbin : /usr/local/bin : /sbin : /bin : /usr/sbin : /usr/bin : /root/bin IP=$( ifconfig eth1| awk -F "[ :]+" 'NR==2{print $4}' ) Bak_Path= /backup mkdir $Bak_Path/$IP -p if [ $( date +%w) - eq 2 ]; then date = "$(date +%F -d " -1day ")_week1" else date = "$(date +%F -d " -1day ")" fi cd / &&\ tar zcfh $Bak_Path/$IP /sys_config_ ${ date }. tar .gz . /var/spool/cron . /etc/rc . local . /server/sc ripts &&\ tar zcf $Bak_Path/$IP /webdata_ ${ date }. tar .gz var /html/www/ &&\ tar zcf $Bak_Path/$IP /access_log_ ${ date }. tar .gz app /logs/ &&\ find $Bak_Path - type f -name "*.tar.gz" | xargs md5sum >$Bak_Path/$IP /flag_ ${ date } &&\ rsync -az $Bak_Path/ rsync_backup@172.16.1.41::backup/ --password- file = /etc/rsync .password &&\ ###delete data before 7days ago by chen at 20170118 find $Bak_Path - type f -mtime +7| xargs rm -f ~ |
2.2.3.5 每天00点定时任务推送
1
2
|
[root@web01 backup] # crontab -l 00 00 * * * /bin/sh /server/scripts/bak .sh > /dev/null 2>&1 完成客户端的定时任务推送工作 |
第3章 backup服务器实现校验,删除,报警
首先我们测试下如果实现服务器报警
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@backup ~] # tail -1 /etc/mail.rc set from=njlc_jsbcmq@163.com smtp=smtp.163.com smtp-auth-user=njlc_jsbcmq smtp-auth-password=hgg7454196ls smtp-auth=login [root@backup ~] # echo "31qqi zuzi bang"|mail -s "nihao" 373967205@qq.com 就可以收到邮件了 [root@backup scripts] # cat checkbak.sh #!/bin/bash export if [ $( date +%w) - eq 2 ]; then date = "$(date +%F -d " -1day ")_week1" else date = "$(date +%F -d " -1day ")" fi find /backup/ -name "flag_${date}*" | xargs md5sum -c &>> /tmp/mail_ $( date +%F).log find /backup/ - type f -name "*.tar.gz" -a ! -name "*week1*" -mtime +1| xargs rm -f mail -s "backup ~date~" 373967205@qq.com < /tmp/mail_ $( date +%F).log \ cp /tmp/mail_ $( date +%F).log /tmp/mail_ $( date +%F).log.ori > /tmp/mail_ $( date +%F).log 做定时任务,每天上午6点发送邮箱 [root@backup scripts] # crontab -l * * * * * /usr/sbin/ntpdate time .nist.gov > /dev/null 2>&1 * * * * * /bin/bash /server/scripts/checkbak .sh > /dev/null 2>&1 项目完成 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性