使用rsync实现全网数据备份(模拟生产环境)+邮件告知
项目要求来源于网络:http://oldboy.blog.51cto.com/2561410/1856048
假定3台服务器主机名分别为web01、backup、nfs01,主机信息如下表:
服务器说明 |
内网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)(适合web和nfs服务器)。
b.开机自启动的配置文件(/etc/rc.local)(适合web和nfs服务器)。
c.日常脚本的目录 (/server/scripts)(适合web和nfs服务器)。
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)*需要确保备份的数据尽量完整正确,在备份服务器上对备份的数据进行检查,把备份的成功及失败结果信息发给系统管理员邮箱中:
特别提示:本题在工作中是网站生产环境全网备份项目方案的一个小型模拟,很有意义。
--准备好相应的机器(修改好机器名,关闭iptables,selinux,配置好yum源),并配置好相应的host解析,相同的时间(这里上台机子都已配置完成)
--host 解析
[[email protected] ~]# 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实现时间同步
[[email protected] ~]# yum install ntpdate
[[email protected] ~]# vim ntpdate.sh #脚本复制好用执行一遍让时间一致
#!/bin/bash
ntpdate time.nist.gov
hwclock -w
[[email protected] nfs-01 ~]# crontab -e
* * * * 1 /root/time.sh #每周同步一次
1、搭建rsync服务端(blackup服务器)
1.1.安装rsync
[[email protected] ~]# yum install rsync -y
1.2.修改/etc/xinetd.d/rsync
[[email protected] ~]# vim /etc/xinetd.d/rsync
1.3.配置/etc/rsyncd.conf(需要手动生成)
[[email protected] ~]# 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.创建用户,及目录
[[email protected] ~]# useradd -s /sbin/nologin -M rsync
[[email protected] ~]# mkdir /backup
[[email protected] ~]# chown -R rsync.rsync /backup
1.5.创建密码文件
[[email protected] ~]# vim /etc/rsync.password
rsync_backup:123456 #虚拟用户及密码
[[email protected] ~]# chmod 600 /etc/rsync.password #权限必须为600
1.6.启动,添加开机启动
[[email protected] ~]# rsync --daemon
[[email protected] ~]# ss -antup|grep rsync
[[email protected] ~]# echo "/usr/bin/rsync --daemon">>/etc/rc.local #开机启动
2.1客户端配置(nfs01)
[[email protected] ~]# yum install rsync -y
[[email protected] ~]# mkdir /backup/
[[email protected] ~]# touch /backup/1.txt #创建个测试文件
[[email protected] ~]# echo "123456" >/etc/rsync.password #创建密码文件
[[email protected] ~]# chmod 600 /etc/rsync.password
[[email protected] ~]# rsync -avz /backup/ rsync://[email protected]/backup --password-file=/etc/rsync.password
3.1客户端配置(web01)
[[email protected] ~]# yum install rsync -y
[[email protected] ~]# mkdir /backup/
[[email protected] ~]# touch /backup/2.txt
[[email protected] ~]# echo "123456" >/etc/rsync.password
[[email protected] ~]# chmod 600 /etc/rsync.password
[[email protected] ~]# rsync -avz /backup/ rsync://[email protected]/backup --password-file=/etc/rsync.password
3.2模拟真实生产环境创建些文件
[[email protected] ~]# mkdir -p /var/html/www
[[email protected] ~]# touch /var/html/www/{1..10}
[[email protected] ~]# mkdir -p /app/logs
[[email protected] ~]# touch /app/logs/{1..g}
3.3创建备份脚本
[[email protected] ~]# mkdir /server/scripts -p
[[email protected] ~]# 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://[email protected]/backup --password-file=/etc/rsync.password
#删除7天谴数据
find $backpath -type f -mtime +7|xargs rm -f
[[email protected] ~]# crontab -e
00 00 * * * /bin/sh /server/scripts/sh.sh >/dev/null 2>&1 #添加
3.4创建定时任务,并将脚本文件复制到其他服务器并修改(nfs01)
[[email protected] ~]# mkdir -p /server/scripts/
[[email protected] ~]# 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://[email protected]/backup --password-file=/etc/rsync.password
#删除7天谴数据
find $backpath -type f -mtime +7|xargs rm -f
[[email protected] ~]# crontab -e
00 00 * * * /bin/sh /server/scripts/sh.sh >/dev/null 2>&1 #添加
设置个就近的时间后查看nfs-01,web-01,能否正常推数据
[[email protected] ~]# ls /backup/
4、mailx使用外部的SMTP来实现blackup服务器邮件报警
mailx是一个小型的邮件发送程序
具体步骤如下:
4.1、安装
[[email protected] ~]# yum install mailx
4.2、编辑配置文件
[[email protected] ~]# vim /etc/mail.rc #添加如下内容
set [email protected]
set smtp=smtp.126.com
set [email protected]
set smtp-auth-password=xxx
set smtp-auth=login
---说明
from:对方收到邮件时显示的发件人
smtp:指定第三方发邮件的smtp服务器地址
set smtp-auth-user:第三方发邮件的用户名
set smtp-auth-password:用户名对应的密码,有些邮箱需要填授权吗
smtp-auth:SMTP的认证方式,默认是login,也可以改成CRAM-MD5或PLAIN方式
4.3、测试
[[email protected] ~]# init 6
[[email protected] ~]# mail -s "hesaucaq" [email protected] < /etc/passwd
[[email protected] ~]# echo "测试邮件" | mail -s "测试" xxxxx@qq.com
转自:http://www.cnblogs.com/imweihao/p/7250500.html
以上已经实现了发邮件功能!!!
4.4、在(backup)编辑脚本实现报警
[[email protected] ~]# mkdir -p /server/scripts/
[[email protected] ~]# 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`" [email protected] < $logpath #汇总到一个文件发送
[[email protected] scripts]# crontab -e
10 00 * * * /bin/sh /server/scripts/mail.sh >/dev/null 2>&1 #之间最好错开,如果数据量大的话可能需要时间
测试:
设置两个时间点,周一和周二的日期看是否正常,有些时候太会收不到邮件,那是因为被网易的垃圾邮件机制屏蔽了,一会再试,或者发到自己邮箱!
---以上已实现多机数据备份及邮件告警如果需要增加机器或者增加备份的数据,在脚本中添加即可
--附: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 即可解决。