全网服务器数据备份方案(模拟生产环境)+邮件告知

Posted WILL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网服务器数据备份方案(模拟生产环境)+邮件告知相关的知识,希望对你有一定的参考价值。

使用rsync实现全网数据备份(模拟生产环境)+邮件告知

项目要求来源于网络:http://oldboy.blog.51cto.com/2561410/1856048

假定3台服务器主机名分别为web01backupnfs01,主机信息如下表:

服务器说明

内网IP

主机名

nginx web服务器

192.168.1.222

WEB-01

NFS存储服务器

192.168.1.233

NFS-01

rsync备份服务器

192.168.1.244

BACKUP

要求:每天晚上00点整在Web服务器上打包备份系统配置文件、网站程序目录及访问日志并通过rsync命令推送备份服务器backup上备份保留(备份思路可以是先在本地按日期打包,然后再推到备份服务器backup上),NFS存储服务器同Web服务器,实际工作中就是全部的服务器。

具体要求如下:

1)所有服务器的备份目录必须都为/backup

2)要备份的系统配置文件包括但不限于:

a.定时任务服务的配置文件(/var/spool/cron/root)(适合webnfs服务器)。

b.开机自启动的配置文件(/etc/rc.local)(适合webnfs服务器)。

c.日常脚本的目录 (/server/scripts)(适合webnfs服务器)。

d.防火墙iptables的配置文件(/etc/sysconfig/iptables)

e.自己思考下还有什么需要备份呢?

3)Web服务器站点目录假定为(/var/html/www)

4)Web服务器A访问日志路径假定为(/app/logs

5)Web服务器保留打包后的7天的备份数据即可(本地留存不能多于7天,因为太多硬盘会满)

6)备份服务器上,保留每周一的所有数据副本,其它要保留6个月的数据副本。

7)备份服务器上要按照备份数据服务器的内网IP为目录保存备份,备份的文件按照时间名字保存。

8*需要确保备份的数据尽量完整正确,在备份服务器上对备份的数据进行检查,把备份的成功及失败结果信息发给系统管理员邮箱中:

特别提示:本题在工作中是网站生产环境全网备份项目方案的一个小型模拟,很有意义。

--准备好相应的机器(修改好机器名,关闭iptablesselinux,配置好yum源),并配置好相应的host解析,相同的时间(这里上台机子都已配置完成)

--host 解析

[root@backup ~]# vim /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.1.222 web01

192.168.1.233 nfs01

192.168.1.244 backup #添加

--使用ntpdate实现时间同步

[root@nfs-01 ~]# yum install ntpdate

[root@nfs-01 ~]# vim ntpdate.sh #脚本复制好用执行一遍让时间一致

#!/bin/bash

ntpdate time.nist.gov

hwclock -w

[root@nfs-01 nfs-01 ~]# crontab -e

* * * * 1 /root/time.sh #每周同步一次

1、搭建rsync服务端(blackup服务器)

1.1.安装rsync

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

1.2.修改/etc/xinetd.d/rsync

[root@backup ~]# vim /etc/xinetd.d/rsync

1.3.配置/etc/rsyncd.conf(需要手动生成)

[root@backup ~]# vim /etc/rsyncd.conf

uid = rsync #rsync以什么用户启动

gid = rsync #rsync 以什么组启动

use chroot = no

max connections = 200 #最大连接数

timeout = 300 #超时时间

pid file = /var/run/rsyncd.pid #pid文件路径

lock file = /var/run/rsync.lock #指定lock文件

log file = /var/log/syncd.log #日志文件

[backup]

path = /backup/ #back目录

ignore errors #忽略错误

read only = no #是否字符(若从客户端同步到服务器必须设为no)

list = no #在否允许列表

hosts allow = 192.168.1.0/24 #允许的ip

auth users = rsync_backup #认证的用户,服务器必须存在这个系统用户

secrets file = /etc/rsync.password #指定用户密码文件

#以上配置文件需去除注释才能直接复制,否则报错

1.4.创建用户,及目录

[root@backup ~]# useradd -s /sbin/nologin -M rsync

[root@blackup ~]# mkdir /backup

[root@backup ~]# chown -R rsync.rsync /backup

1.5.创建密码文件

[root@backup ~]# vim /etc/rsync.password

rsync_backup:123456 #虚拟用户及密码

[root@backup ~]# chmod 600 /etc/rsync.password #权限必须为600

1.6.启动,添加开机启动

[root@backup ~]# rsync --daemon

[root@backup ~]# ss -antup|grep rsync

[root@backup ~]# echo "/usr/bin/rsync --daemon">>/etc/rc.local #开机启动

2.1客户端配置(nfs01

[root@nfs-01 ~]# yum install rsync -y

[root@nfs-01 ~]# mkdir /backup/

[root@nfs-01 ~]# touch /backup/1.txt #创建个测试文件

[root@nfs-01 ~]# echo "123456" >/etc/rsync.password #创建密码文件

[root@nfs-01 ~]# chmod 600 /etc/rsync.password

[root@nfs-01 ~]# rsync -avz /backup/ rsync://rsync_backup@192.168.1.244/backup --password-file=/etc/rsync.password

3.1客户端配置(web01

[root@web-01 ~]# yum install rsync -y

[root@web-01 ~]# mkdir /backup/

[root@web-01 ~]# touch /backup/2.txt

[root@web-01 ~]# echo "123456" >/etc/rsync.password

[root@web-01 ~]# chmod 600 /etc/rsync.password

[root@web-01 ~]# rsync -avz /backup/ rsync://rsync_backup@192.168.1.244/backup --password-file=/etc/rsync.password

3.2模拟真实生产环境创建些文件

[root@web-01 ~]# mkdir -p /var/html/www

[root@web-01 ~]# touch /var/html/www/{1..10}

[root@web-01 ~]# mkdir -p /app/logs

[root@web-01 ~]# touch /app/logs/{1..g}

3.3创建备份脚本

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

[root@web-01 ~]# vim /server/scripts/sh.sh

#!/bin/bash

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

ip=$(ifconfig eth0|awk -F "[ :]+" \'NR==2{print $4}\') #获取ip

backpath=/backup/ #备份目录

name=`hostname` #主机名

mkdir -p $backpath/$ip

#判断周一

if [ $(date +%w) -eq 2 ];then

date="$(date +%F -d "-1day")_week1"

else

date="$(date +%F -d "-1day")"

fi

cd / #切换到根目录并回车

tar zcf $backpath/$ip/$name"_"${date}"_sysconfig".tar.gz var/spool/cron/ etc/rc.d/rc.local server/scripts/

tar zcf $backpath/$ip/$name"_"${date}"_data".tar.gz var/html/www/ #注释掉,nfs服务器不需要备份web数据

tar zcf $backpath/$ip/$name"_"${date}"_logs".tar.gz app/logs/ #注释掉,nfs服务器不需要备份web数据

find $backpath -type f -name "*.tar.gz"|xargs md5sum > $backpath/$ip/flag_$ip"_"${date} #给文件打标记

#备份到balackup服务器

rsync -az $backpath rsync://rsync_backup@192.168.1.244/backup --password-file=/etc/rsync.password

#删除7天谴数据

find $backpath -type f -mtime +7|xargs rm -f

[root@web-01 ~]# crontab -e

00 00 * * * /bin/sh /server/scripts/sh.sh >/dev/null 2>&1 #添加

3.4创建定时任务,并将脚本文件复制到其他服务器并修改(nfs01

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

[root@nfs-01 ~]# vim /server/scripts/sh.sh

#!/bin/bash

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

ip=$(ifconfig eth0|awk -F "[ :]+" \'NR==2{print $4}\') #获取ip

backpath=/backup/ #备份目录

name=`hostname` #主机名

mkdir -p $backpath/$ip

#判断周一

if [ $(date +%w) -eq 2 ];then

date="$(date +%F -d "-1day")_week1"

else

date="$(date +%F -d "-1day")"

fi

cd / #切换到根目录并回车

tar zcf $backpath/$ip/$name"_"${date}"_sysconfig".tar.gz var/spool/cron/ etc/rc.d/rc.local server/scripts/

#tar zcf $backpath/$ip/$name"_"${date}"_data".tar.gz var/html/www/ #注释掉,nfs服务器不需要备份web数据

#tar zcf $backpath/$ip/$name"_"${date}"_logs".tar.gz app/logs/ #注释掉,nfs服务器不需要备份web数据

find $backpath -type f -name "*.tar.gz"|xargs md5sum > $backpath/$ip/flag_$ip"_"${date} #给文件打标记

#备份到balackup服务器

rsync -az $backpath rsync://rsync_backup@192.168.1.244/backup --password-file=/etc/rsync.password

#删除7天谴数据

find $backpath -type f -mtime +7|xargs rm -f

[root@nfs-01 ~]# crontab -e

00 00 * * * /bin/sh /server/scripts/sh.sh >/dev/null 2>&1 #添加

设置个就近的时间后查看nfs-01web-01,能否正常推数据

[root@backup ~]# ls /backup/

4mailx使用外部的SMTP来实现blackup服务器邮件报警

mailx是一个小型的邮件发送程序

具体步骤如下:

4.1、安装

[root@blackup ~]# yum install mailx

4.2、编辑配置文件

[root@blackup ~]# vim /etc/mail.rc #添加如下内容

set from=xxxx@126.com

set smtp=smtp.126.com

set smtp-auth-user=xx@126.com

set smtp-auth-password=xxx

set smtp-auth=login

---说明

from:对方收到邮件时显示的发件人

smtp:指定第三方发邮件的smtp服务器地址

set smtp-auth-user:第三方发邮件的用户名

set smtp-auth-password:用户名对应的密码,有些邮箱需要填授权吗

smtp-authSMTP的认证方式,默认是login,也可以改成CRAM-MD5PLAIN方式

4.3、测试

[root@001 ~]# init 6

[root@001 ~]# mail -s "hesaucaq" xx@qq.com < /etc/passwd

[root@001 ~]# echo "测试邮件" | mail -s "测试" xxxxx@qq.com

转自:http://www.cnblogs.com/imweihao/p/7250500.html

以上已经实现了发邮件功能!!!

4.4、在(backup)编辑脚本实现报警

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

[root@blackup ~]# cd !$

脚本如下:

#!/bin/bash

export LANG=en

ip1="192.168.1.222"

ip2="192.168.1.233" #机器增加需加更多的ip

logpath=/tmp/flag.log #日志文件地址,后面汇总到这个文件来发送

#判断周一

if [ $(date +%w) -eq 2 ];then

date="$(date +%F -d "-1day")_week1"

else

date="$(date +%F -d "-1day")"

fi

find /backup/$ip1 -name flag_$ip1"_"${date}|xargs md5sum -c &> $logpath

find /backup/$ip2 -name flag_$ip2"_"${date}|xargs md5sum -c &>> $logpath #需更改成ip2和追加

find /backup/$ip1 -type f -name "*.tar.gz" -a ! -name "*week*" -mtime +180|xargs rm -f

find /backup/$ip2 -type f -name "*.tar.gz" -a ! -name "*week*" -mtime +180|xargs rm -f #需要更改成ip2

mail -s "backup`date`" imweihao@126.com < $logpath #汇总到一个文件发送

[root@blackup scripts]# crontab -e

10 00 * * * /bin/sh /server/scripts/mail.sh >/dev/null 2>&1 #之间最好错开,如果数据量大的话可能需要时间

测试:

设置两个时间点,周一和周二的日期看是否正常,有些时候太会收不到邮件,那是因为被网易的垃圾邮件机制屏蔽了,一会再试,或者发到自己邮箱!

---以上已实现多机数据备份及邮件告警如果需要增加机器或者增加备份的数据,在脚本中添加即可

---附1:Rsync的命令格式可以为以下六种:

Rsync的命令格式可以为以下六种:
rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
对应于以上六种命令格式,rsync有六种不同的工作模式:
对应于以上六种命令格式,rsync有六种不同的工作模式:
  1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。如:rsync -a /data /backup
  2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号”:”分隔符时启动该模式。如:rsync -avz *.c foo:src
  3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。如:rsync -avz foo:src/bar /data
  4)从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。如:rsync -avzP root@172.16.78.192::www /databack
  5)从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。如:rsync -avzP /databack root@172.16.78.192::www
  6)列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www
rsync参数的具体解释如下:

正常情况下会使用 -avz相当与-vzrtopgD1,表示同步时文件和目录属性不变

-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-R, --relative 使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links 保留软链接
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-H, --hard-links 保留硬链结
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t, --times 保持文件时间信息
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run现实哪些文件将被传输
-W, --whole-file 拷贝文件,不进行增量检测
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--max-delete=NUM 最多删除NUM个文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force 强制删除目录,即使不为空
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME IP超时时间,单位为秒
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR 在DIR中创建临时文件
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P --progress 显示备份过程及传输进度

-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 绑定到特定的地址
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
--blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
--progress 在传输时现实传输过程
--log-format=formAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, --help 显示帮助信息

 

----附2:rsync 常见错误及解决方法

问题 @ERROR: chroot failed

@ERROR: chroot failed rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]

原因:服务器端的目录不存在或无权限。

解决办法:

创建目录并修正权限可解决问题。

问题 skipping non-regular file

receiving incremental file list

skipping non-regular file "vendor/bin/doctrine"

skipping non-regular file "vendor/bin/doctrine.php"

sent 1990 bytes received 489209 bytes 327466.00 bytes/sec total size is 182515746 speedup is 371.57

原因:source源文件有软链接。

解决方法:修改为 rsync -va,其中 -a == -rlptgoD (no -H,-A,-X) 或者 rsync -rvltOD 也可以。

解决后:

receiving incremental file list

vendor/bin/doctrine -> ../doctrine/orm/bin/doctrine

vendor/bin/doctrine.php -> ../doctrine/orm/bin/doctrine.php

sent 1998 bytes received 489279 bytes 327518.00 bytes/sec total size is 182515746 speedup is 371.51

问题@ERROR: module is read only

sending incremental file list

ERROR: module is read only

rsync error: syntax or usage error (code 1) at main.c(866) [receiver=3.0.6]

rsync: read error: Connection reset by peer (104)

rsync error: error in rsync protocol data stream (code 12) at io.c(759) [sender=3.0.6]

原因:source源服务器端权限设置read为only只读权限。

解决方法:read only = false

问题@ERROR: auth failed on module tee

@ERROR: auth failed on module tee rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.6]

原因:服务器端该模块(tee)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败。

解决方法:提供正确的用户名密码解决此问题。

问题 @ERROR: Unknown module \'tee_nonexists\'

@ERROR: Unknown module \'tee_nonexists\' rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.6]

原因:服务器不存在指定模块。

解决方法:提供正确的模块名或在服务器端修改成你要的模块以解决问题。

问题 password file must not be other-accessible

password file must not be other-accessible

continuing without password file

Password:

原因:这是因为rsyncd.pwd rsyncd.secrets的权限不对,应该设置为600。

解决方法:chmod 600 rsyncd.pwd

问题 rsync: failed to connect No route to host

rsync: failed to connect to 192.168.1.10: No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=3.0.6]

原因:对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。

解决方法:在iptables 中开放该端口,语句如下:

iptables -I INPUT -p tcp –dport 873 -j ACCEPT

rsync默认端口873,其实就是把tcp udp的873端口打开。

问题 rsync error: error starting client-server protocol

rsync error: error starting client-server protocol (code 5) at main.c(1524) [Receiver=3.0.6]

原因:/etc/rsyncd.conf配置文件内容有错误。请正确核对配置文件。

问题 rsync: chown "" failed: Invalid argument (22)

rsync: chown "" failed: Invalid argument (22)

原因:权限无法复制。去掉同步权限的参数即可。(这种情况多见于Linux向Windows的时候)

问题 @ERROR: daemon security issue — contact admin

@ERROR: daemon security issue — contact admin rsync error: error starting client-server protocol (code 5) at main.c(1530) [sender=3.0.6]

原因:同步的目录里面有权限不足的软连接文件,需要服务器端的/etc/rsyncd.conf打开use chroot = yes。

问题 rsync: read error: Connection reset by peer (104)

rsync: read error: Connection reset by peer (104) rsync error: error in rsync protocol data stream (code 12) at io.c(794) [receiver=3.0.6]

解决:很大可能是服务器端没有开启 rsync 服务,开启服务。

问题 @ERROR: failed to open lock file

@ERROR: failed to open lock file rsync error: error starting client-server protocol (code 5) at main.c(1495) [receiver=3.0.6]

解决:配置文件 rsync.conf 中添加 lock file = rsyncd.lock 即可解决。

 

以上是关于全网服务器数据备份方案(模拟生产环境)+邮件告知的主要内容,如果未能解决你的问题,请参考以下文章

分布式实战:Redis企业级灾备方案

Linux-Rsync项目实战(详细) 备份全网服务器数据生产架构方案

一次惊险的lvs切换

U-Mail邮件系统分布式+双机热备方案确保同步稳定传输

centos7 Mysql5.7.15版本 一主一备架构(生产环境带数据,不锁库)

主备机房介绍