WordPress双机备份

这里的双机指的是VPS而不是虚拟机空间,要实现Wordpress双机备份你得有两台VPS主机。为什么要双机备份呢?因为再稳定的VPS也不能保证长时间运行而不进行主机维护、网络维护。

以前用Linode的时候偶尔也会出现线路抽风,后来由于主机价格的原因换到了Buyvm,真真切切体会到贵有贵的道理便宜有便宜的原因,用Linode的时候由于服务器稳定很少进行维护以至于长期不登录而忘记root密码,而Buyvm呢,每个月总有那么一两次,要么是母鸡维护,要么是防火墙升级、路由切换什么的,不过每次都有通知暂停服务器时间最长2小时左右。

最近正好手头有两台VPS,每个上面有两个小站,流量都不大,使用率也不是很高,完全可以运行在一台上面。于是想到了用下面的方法实现Wordpress双机备份,当然这种方式仅限于应用到按天更新的小小博客。流量大的、交互多的、会员多的如果不在乎一两天数据的可以用这种方式冷备。

原理挺简单的,就是让两台主机的内容一模一样,当然包含数据库的内容,用dnspod的域名监控,当网站访问出现问题的时候DNS会临时指向备用IP,尝试了几次切换时间最长不会超过200秒。

1.搭建服务器环境lnmp。这个不用多说,能想到实现Wordpress双机的,搭环境的活应该不在话下。保持两台主机数据一致即可。

2.主备节点的设置免密码登录。主节点就是平时访问网站的主机,备节点数据保持和主机点一致。为了传输数据和运行对端脚本,先在双机实现免密码登录

首先在主节点上操作用ssh-keygen创建公钥

#ssh-keygen -t rsa

提示“Enter passphrase (empty for no passphrase): ”的时候按回程跳过,设置免密码登录不可以使用passphrase

之后会看到下面类似告诉你密钥和公钥的保存位置

Your identification has been saved in /home/fendou/.ssh/id_rsa.
Your public key has been saved in /home/fendou/.ssh/id_rsa.pub.

然后将主节点的公钥文件传个备节点(假设主节点ip为192.168.1.11,备节点ip为192.168.1.12),实现主节点访问备节点无密码登录

#scp id_rsa.pub root@192.168.1.12:~/.ssh/authorized_keys

在主节点上运行,在提示YES/NO的时候输入YES,首次登陆会保存认证过的主机信息到.ssh/known_hosts中,下次ssh访问的时候就不需要密码也不会弹出提示了

#ssh 192.168.1.12

备节点的设置……(应该不用多说了吧!)

3.设置主节点备份脚本,就叫做backup-wpfendou.sh吧
登录主节点192.168.1.11

#cd /home
#mkdir backup
#cd backup
#vim backup-wpfendou.sh

编辑主节点的备份脚本用于Crontab执行备份

#!/bin/bash
#!/bin/bash
# description: WordPress backup shell script
# site: www.fendou.info

st=$(date +%s)
USER="root" #mysql root
PASSWORD="chadianbamimaxielule" #root's password
DATABASE="wpfendou" #backup database name
MAIL="*a*g*e*8*1*2*@gmail.com" #your mail address   
BACKUP_DIR=/home/backup/wpfendou/ #备份文件存储路径 
LOGFILE=/home/backup/data_backup.log #日志文件路径
 
#DATE=`date +%Y%m%d-%H%M` #用日期格式作为文件名
DUMPFILE=$DATABASE.sql 
ARCHIVE=$DATABASE.sql.tar.gz 
OPTIONS="-u$USER -p$PASSWORD $DATABASE"

#判断备份文件存储目录是否存在,否则创建该目录 
if [ ! -d $BACKUP_DIR ] 
then
	mkdir -p "$BACKUP_DIR"
fi  

#开始备份之前,将备份信息头写入日记文件 
echo "    ">> $LOGFILE 
echo "--------------------" >> $LOGFILE 
echo "BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE 
echo "--------------------" >> $LOGFILE  

#切换至备份目录 
cd $BACKUP_DIR 
mysqldump $OPTIONS > $DUMPFILE 
#判断数据库备份是否成功 
if [[ $? == 0 ]]
then 
tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1 
echo "[$ARCHIVE] Backup Successful!" >> $LOGFILE 
rm -f $DUMPFILE #删除原始备份文件,只需保留备份压缩包
# 把压缩包文件备份到其他机器上。
scp -P 2345 $BACKUP_DIR$ARCHIVE root@192.168.1.12:/home/recovery/wpfendou/ >> $LOGFILE 2>&1
else 
echo "Database Backup Fail!" >> $LOGFILE 
#备份失败后向管理者发送邮件提醒 
mail -s "Database:$DATABASE Daily Backup Fail!" $MAIL < .
fi 
echo "Backup DB Process Done" 
mail -s "Database:$DATABASE Daily Backup Successful" $MAIL < .
#echo "Backup FILES www.fendou.info"
scp -P 2345 -r /home/wwwroot/www.fendou.info/ root@192.168.1.12:/home/wwwroot/
echo "Backup FILES Process Done"
#Cleaning
find $BACKUP_DIR  -type f  -name "*.tar.gz" -exec rm -f {} \;
#Remote Recovery
ssh -p 2345 root@192.168.1.12 "cd /home/recovery ; ./recovery-wpfendou.sh"
echo "Remote Recovery Finished"

一切尽在脚本中,需要特别注意的是scp -大P 指定主机的ssh端口,一般默认22端口是不需要此参数的,另外还是ssh -小p 也是ssh端口,Linux真矫情。脚本开始定义一些路径和用户名密码,貌似有点儿不安全:)然后开始导出数据库并tar打包压缩,然后传到备节点,接着直接传网站文件,抱歉没有写成打包压缩传送,我觉得这样一屏一屏的刷文件有黑ker的感觉。注意最后一行是远程执行备节点的恢复脚本,请继续看下一小节。

3.设置备节点恢复脚本,就叫做recovery-wpfendou吧

#!/bin/bash
# description:  WordPress recovery shell script
# site: www.fendou.info
USER="root" #mysql root
PASSWORD="chadianbamimaxielule" #root's password
DATABASE="wpfendou" 
MAIL="*2*v@163.com" #mail   
RECOVERY_DIR=/home/recovery/wpfendou/ #备份文件存储路径 
LOGFILE=/home/recovery/data_recovery.log #日志文件路径
OPTIONS="-u$USER -p$PASSWORD $DATABASE"

cd $RECOVERY_DIR
file=$(ls *.gz 2> /dev/null|wc -l)
if [[ "$file" != "0" ]]
then
ARCHIVE=$DATABASE.sql.tar.gz
#echo "Recovery Database ARCHIVE File Name:"$ARCHIVE
tar -vxf $RECOVERY_DIR$ARCHIVE
DUMPFILE=$DATABASE.sql
#echo "Recovery Database DUMPFILE Name:"$DUMPFILE
mysql $OPTIONS < $DUMPFILE echo "$(date) -- [$DUMPFILE] Recovery Successful!" >> $LOGFILE
rm -f $ARCHIVE $DUMPFILE
mail -s "Database:$DATABASE Daily Recovery Successful" $MAIL < . else echo "$(date) -- DUMPFILE not Found!" >> $LOGFILE
mail -s "Database:$DATABASE Daily Recovery Fail" $MAIL < .
fi
echo "Recovery Process Done"

其实这个脚本就是用来恢复数据库的,细心的可能发现两个脚本中定义的mail为啥一个是gmail的邮箱而另一个是163的邮箱,这尼玛是因为备节点的IP被gmail列黑名单了,不得已启用163的转发,害人折腾半天postfix。

4.设置Crontab每天晚上在主节点上执行备份

0 1 * * * /home/backup/backup-wpfendou.sh

5.最后一步就简单了,把域名转到dnspod管理,监控网站并设置备节点IP,有图有真相!

dnspod

《WordPress双机备份》有4个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注