各种back up solutions的步骤和分析,都说标题要长
这两天时间稍微多一点,好好的研究了一下back up的策略,本文只适用于各种shared hosting, vps, dedicated server, server clusters. 但是主要侧重于vps以上以及多台服务器的备份策略,系统环境为centos 6, 是否有whm/cpanel 均可。首先来说,作为一个marketer,最重要的莫过于自己的数据,而且我相信论坛上很多做paid traffic的人没有做back up的习惯,而且我的学员群里就有活生生的例子。。。数据库倒掉,辛苦全报废了,或者被东欧人入侵,数据全报废了。。我的其中一台服务器的硬盘也曾经报废了,但是我很幸运,因为managed的服务,立刻就给我恢复了,但是这也给我敲醒了警钟。
我不是linux备份方面的专家,以前一直使用managed的服务,但是目前服务器太多( 基本上US每个大型机房都有我的box),有些服务器的用途决定了他不需要managed的服务,毕竟挣钱是在太不容易了,所以就有了此文。此文的中心思想是automated back up,该花钱的地方花钱,该省钱的地方省钱。
论坛卧虎藏龙,如果此文有任何不正确之处,敬请各位大神以及各位hostloc过来的专家们不吝指出,争取打造为比较标准,完整的back up tutorial!
目前来说,backup一般分为三种,简单的说有FTP备份,rsync备份,以及R1Soft 备份( 商业软件)。(不考虑其他公司的in-house 程序,例如bpbackup等等)
三种备份各有个的优势,再有whm/cpanel的情况下, FTP备份是最最最简单的,但是流量消耗也是最大的,需要WHM/Cpanel支持。 Rsync 备份属于incremental 备份,效率较高,利用timestamp 的特性只备份变化的文件/夹,需要掌握一定的linux commands。 R1soft作为商业软件,也是incremental备份,基本各大IDC都在卖他们的服务,back up功能是最好的,能够有效的减少CPU负载以及磁盘的IO.
这三种方式,无论哪一种方式,都需要你有一台back up server 或者vps,或者第三方back up service. 对于自己的back up server来说,需要的配置由你的实际情况有关。 Rsync的方式内存1GB即可,R1Soft 需要最少8GB内存。服务器的硬盘可以选择2*1TB, RAID 1 BBU 或者RAID 6的搭配方式( 一般来说RAID 1足够,RAID 6 是备份十分敏感的数据 ,RAID10 一般是向外提供back up的service)。下面我们来实际分析一下:
1) FTP 备份. 主服务器最好有WHM/CPanel面板。同时你需要有back up server 或者第三方back up service的FTP信息。
CPanel 下备份: Back Up Wizard => Back Up => Full Back Up => Remote FTP Server, 然后填写remote back up FTP 信息即可。不好的一点是你无法实现automated backup.
想用CPanel实现automated backup,可以使用如下代码保存在/home/youraccount/fullbackup.php :<?php
// Disclaim: 此code来源于internet,非 advertcn.com原创。此code适用于FTP 备份,或者rsync备份,或者自动备份到Amazon S3
// 你需要再你的/home下建立一个backup的文件夹
// Information required for cPanel access
$cpuser = "username"; // Username used to login to cPanel
$cppass = "password"; // Password used to login to cPanel
$domain = "example.com";// Your main domain name
$skin = "x"; // Set to cPanel skin you use (script will not work if it does not match). Most people run the default "x" theme or "x3" theme
// Information required for FTP host
$ftpuser = "ftpusername"; // Username for FTP account
$ftppass = "ftppassword"; // Password for FTP account
$ftphost = "ip_address"; // IP address of your hosting account
$ftpmode = "passiveftp"; // FTP mode
// Notification information $notifyemail = "[email protected]"; // Email address to send results
// Secure or non-secure mode $secure = 0; // Set to 1 for SSL (requires SSL support), otherwise will use standard HTTP
// Set to 1 to have web page result appear in your cron log $debug = 0;
// *********** NO CONFIGURATION ITEMS BELOW THIS LINE *********
$ftpport = "21";
$ftpdir = "/backups/"; // Directory where backups stored (make it in your /home/ directory). Or you can change 'backups' to the name of any other folder created for the backups;
if ($secure) {
$url = "ssl://".$domain;
$port = 2083;
} else {
$url = $domain;
$port = 2082;
}
$socket = fsockopen($url,$port);
if (!$socket) { echo "Failed to open socket connection... Bailing out!n"; exit; }
// Encode authentication string
$authstr = $cpuser.":".$cppass;
$pass = base64_encode($authstr);
$params = "dest=$ftpmode&email=$notifyemail&server=$ftphost&user=$ftpuser&pass=$ftppass&port=$ftpport&rdir=$ftpdir&submit=Generate Backup";
// Make POST to cPanel
fputs($socket,"POST /frontend/".$skin."/backup/dofullbackup.html?".$params." HTTP/1.0\r\n");
fputs($socket,"Host: $domain\r\n");
fputs($socket,"Authorization: Basic $pass\r\n");
fputs($socket,"Connection: Close\r\n");
fputs($socket,"\r\n");
// Grab response even if we do not do anything with it.
while (!feof($socket)) {
$response = fgets($socket,4096); if ($debug) echo $response;
}
fclose($socket);
?> 如果我们想每天凌晨2点钟进行备份,可以将如下code加到cron当中,就可以实现自动备份到远程FTP中00 2 * * * /usr/local/bin/php /home/youraccount/fullbackup.php 或者将上面的code稍微修改下,只需要产生备份的文件,也可以利用下面的Rsycn或者amazon s3进行备份。
WHM 下实现automated back up: Back up => Configure Back Up, 然后再这里enable backup,并且填好FTP信息即可。
2) Rsync 备份. 此办法属于incremental 备份的,效率较高,节省服务器的CPU 负载,减少IO等等,但是配置较为复杂,需要一定的linux 基础。
代码如下:a) 用root身份登录录住服务器(避免权限问题)
b) 设立SSH key pair。
有的box没有安装rsync,需要自己安装rsync 这种情况概率很低
# yum install rsync
你需要用如下命令检查是不是系统已经存在一个key
# cat ~/.ssh/id_rsa.pub
如果已经存在,可以直接到c),否则执行如下命令:
# ssh-keygen -t rsa -N ''
注意,是两个单引号,这样就产生了两个默认的key: id_rsa 和 id_rsa.pub
c)把RSA加密的key 复制到你的back up server, 假设IP为9.8.89.2
# scp /root/.ssh/id_rsa.pub [email protected]:/root/
然后ssh到你的back up server,执行下列命令:
# cat /root/id_rsa.pub >> /root/.ssh/authorized_keys
# chmod 644 /root/.ssh/authorized_keys
这样SSH pair就构建完毕。
d) 测试SSH pair是不是成功,如果不需要密码,就说明成功了
#ssh -i /root/.ssh/id_rsa [email protected]
e) 最后一步也就是最重要的一步,备份,假设我们的住服务器的备份文件夹是/home/var/etc, 需要备份到back up server的/home/root/backup_server1,则我们需要将
下列命令写入到cron:
#echo "0 5 * * * root rsync -avz -e ssh /home/var/etc [email protected]:/home/root/backup_server1" >> /etc/crontab
表示每天5点的时候同步这两个文件夹
一些其他的备份例子:
备份整个server: rsync -avz -e ssh / [email protected]:/home/root/backup_server1
备份home: rsync -avz -e ssh /home [email protected]:/home/root/backup_server1
备份某一个用户: rsync -avz -e ssh /home/advertcn [email protected]:/home/root/backup_server1由代码可以看出,rsync只能同步文件,不能保存每天都备份的数据。但是相当的经济实惠。
3) R1Soft 软件备份。虽然花点钱,但是使用的很值。我的建议是服务器多的同学可以考虑这个产品。买一个2*1TB的RAID 1的服务器,就可以备份n多服务器,甚至也可以提供备份服务。很多大型的ISP的备份服务都是R1Soft。 我建议可以使用gigenet或者steadfast 的R1Soft 备份服务,价格公道,network好。http://www.gigenet.com/hosting-solutions/storage/r1soft-cdp-backup/http://steadfast.net/services/disaster-recovery.backup.php4) 直接备份到Amazon S3.
S3的服务有保证,你的备份文件不会丢失,不需要考虑什么RAID 1,5,6,10之类的。而且AWS的价格不是一般的便宜,每GB文件0.095刀,我估计大部分人的文件10GB到头了,也就是一个月1刀的费用。。。服务公道。可以综合上面的Rsync和FTP的获取备份文件的办法,将文件直接备份到Amazon S3。Amazon S3 全部使用API 进行操作,步骤非常的简单,备份过程如下:
a) 注册AWS账户,获取你的access key 和secret keyhttp://aws.amazon.com/s3/b) 在你的主服务器上安装s3 client,用来和AWS进行通信<p># cd /etc/yum.repos.d</p><p># wget http://s3tools.org/repo/RHEL_6/s3tools.repo</p><p># yum install s3cmd</p>配置s3 client<p># s3cmd --configure</p><p></p>这个过程需要你输入你的aws的access key 和secret key,其余全部默认即可。
这样就完成了基本的配置工作,下面开始配置备份过程。
c) 备份配置
在S3上建议一个bucket,假设用来备份广告中国的这个server#s3cmd mb s3://advertcn这样以后所有的关于advertcn的数据都会保存在这个bucket上
(更多的命令,可以查看:http://s3tools.org)
前面我们已经说过了如何开启WHM 自动备份功能,或者查看http://docs.cpanel.net/twiki/bin/view/AllDocumentation/WHMDocs/ConfigBackup假设我们使用的是WHM的默认备份文件夹/backup, 则在里面还有一个文件夹/cpbackup/daily,所有文件都会在daily里面
创建备份log文件# mkdir /var/log/backuplogs这样基本的参数就全部完毕
d) 自动备份代码
将下面的代码保存为/root/dailybackup.sh#!/bin/bash
##notification email, 把这个email改成自己的email,需要改
[email protected]
ERRORLOG=/var/log/backuplogs/backup.err`date +%F`
ACTIVITYLOG=/var/log/backuplogs/activity.log`date +%F`
##需要备份的文件地址,按照前面说过的,或者改成自己的
SOURCE=/backup/cpbackup/daily
##S3的Bucket文件名称,不要改
DESTINATION=`date +%F`
##保存的备份的天数,3表示只保持近三天的备份文件,一般用5或者7,或者up to yourself
DEGREE=3
##clear 日志,不要改
:> ${ERRORLOG}
:> ${ACTIVITYLOG}
##上传到amazon S3,把backup_daily改成相应的s3 bucket
/usr/bin/s3cmd -r put ${SOURCE} s3://Backup_daily/${DESTINATION}/ 1>>${ACTIVITYLOG} 2>>${ERRORLOG}
ret2=$?
##发送email notification,不要改
msg="BACKUP NOTIFICATION ALERT FROM `hostname`"
if [ $ret2 -eq 0 ];then
msg1="Amazon s3 Backup Uploaded Successfully"
else
msg1="Amazon s3 Backup Failed!!\n Check ${ERRORLOG} for more details"
fi
echo -e "$msg1"|mail -s "$msg" ${_EMAIL}
#######################
##删除超过备份天数的文件
## 本地服务器和amazon s3全部删除,把backup_daily改成相应的bucket
#######################
DELETENAME=$(date--date="${DEGREE} days ago" +%F)
/usr/bin/s3cmd -r --force del s3://Backup_daily/${DELETENAME} 1>>${ACTIVITYLOG} 2>>${ERRORLOG}然后更改权限,加入cron,实现自动备份<p># chmod u+x /root/dailybackup.sh</p><p># cp -p /root/dailybackup.sh /etc/cron.daily/</p>这样基本就完成了自动备份工作。
从S3恢复文件到本地服务器:<p># mkdir restore</p><p>
</p><p>#s3cmd -r get s3://Backup_daily/2011-02-32 restore</p>是不是很简单?
Note:
1) 如果你想在每天WHM完成备份之后就执行这个备份命令,可以如下:
添加代码<p>#!/usr/bin/perl</p><p>system(“/root/dailybackup.sh”);</p>到/scripts/postcpbackup,再改文件权限
# chmod u+x /scripts/postcpbackup
2) 如果你想修改WHM每天的自动备份时间,可以在WHM后台
WHM => Cpanel => Manage Plugins => Install and update, 给cronconfig打上勾
然后去Plugin里面设定自动备份的时间即可。
--------------------------------------------------------------------------------------------------------------------------------------------------
以上涵盖了大部分人的备份方式。不要过于追求高端,选择合适你的就好,as long as it 能够保护好你的数据。
目前广告中国采取双重备份,每天自动备份到amazon s3,同时通过R1Soft 备份到自己的back up server:lol
我是back up 这一行的菜鸟,希望各路大仙不吝指出我的代码错误或者offer一个更方便的办法
史上最长的贴子阿,哈哈 本帖最后由 wangblaze 于 2013-3-17 10:53 编辑
学习了,感谢分享 :D 感谢分享:lol 辛苦了,河管:D 学习了,感谢分享 学习了,就是太长了,难道是敲出来的 牛人 很好的教程 这个思路确实是符合三地容灾的要求了。
本地备份接触过很多,NAS、磁带什么的;这个amazon的s3服务学习了。 河马出品,必属精品! 辛苦了,虽然很多东西都是第一次听说,不过日后会用到的。 河马出手必是精品,支持下 河马出品,必属精品!:) 数据少的 直接用Dropbox 自己刷一下xxG就到手了 本帖最后由 jayhkun 于 2013-3-17 13:15 编辑
作为一个IT屌丝男,看了河马大大的备份策略,我也分享一个rsync另外一种备份策略:
这个方法不需要使用ssh的自动登录,只需要两台服务器之间创建一个密码文件。
前提:主服务器(假设IP 1.1.1.1) 备份服务器(假设IP 2.2.2.2) 两台服务器能够互通,都已安装rsync软件(可以用自带的,也可以自己上传软件,编译安装)
下面开始配置:
主服务器(假设IP 1.1.1.1):
1、以root用户建立用户名和密码表文件/etc/backupserver.pas
#echo "backup:123456" > /etc/backupserver.pas
#chmod 600/etc/backupserver.pas
2、创建rsync的主配置文件/etc/rsyncd.conf (需要使用系统自带vi编辑器)
#vi /etc/rsyncd.conf
uid=root
gid=root
use chroot=no
max connections =10
pid file=/var/run/rsyncd.pid
lock file =/var/run/rsync.lock
log file =/var/log/rsync/rsyncd.log
//随便取个名字,在备份服务器配置中需要用到
path=/backup1 //需要备份的目录
ignore errors
read only = yes
list = no
hosts allow= 2.2.2.2 //要访问主服务的主机,也就是备份服务器的IP地址
auth users=backup //密码文件中的用户名
secrets file =/etc/backupserver.pas
3、更改主配置文件权限:
#chmod 700 /etc/rsyncd.conf
4、4)启动服务(启动端口873服务):
#rsync --daemon --config=/etc/rsyncd.conf &//此服务启动后,会一直有一个rsync进程
备份服务器(假设IP 2.2.2.2)
1、以root用户建立用户名和密码表文件/etc/backupserver.pas
#echo "backup:123456" > /etc/backupserver.pas
#chmod 600/etc/backupserver.pas
2、创建一个脚本文件/etc/rsync.sh
#vi /etc/rsync.sh
#/bin/sh
rsync-avzrtcopg --progress [email protected]::backupdir /backup2 --password-file=/etc/backupserver.pas //执行这条命令就会从主服务器的/backup1目录同步到备份服务器的/backup2目录
更改此脚本权限:
#chmod 755/etc/rsync.sh
3、创建定时作业任务:
#vi /etc/crontab
0 3 * * * root nohup /etc/rsync.sh >> /etc/data.log 2>&1 &//每天3点启动同步脚本并将日志写入/etc/data.log文件中
4、重启crond服务,使其生效
#/etc/rc.d/inti.d/crond restart