近半年,先後丟失 5 個網站資料和網站模板程式,大多都是由於 VPS 硬碟損壞造成,RAID10 為了速度是很不保險的。最近的 2 次分別是 DirectSpace 和 BuyVM,所以,必需備份,作好 VPS 隨時準備丟失資料的準備。
昨天花了一整天,把目前所有的站做了每日同步,以下分享給大家實際操作方法。網上關於 rsync 的資料也不少,但多數我想會把你看暈的,以下我用例項來講解,重點的地方我會詳細說明,希望讓大家都會用。
以下,假設網站所在的 VPS 為 A,儲存備份的 VPS 為 B,系統均為 CentOS 。
備份方法為 B 定時向 A 拉資料來備份
一、 VPS A 上面的具體部署
1. 安裝 rsync
yum -y install rsync
把 rsync 加入開機啟動
echo 'rsync --daemon' >> /etc/rc.d/rc.local
2. 設定 rsync 密碼
echo '你的使用者名稱:你的密碼' > /etc/rsyncd.scrt
chmod 600 /etc/rsyncd.scrt
這裡的使用者名稱和密碼,在 VPS B 上將會用到
3. 配置 rsync
vim /etc/rsyncd.conf
放入以下內容, #後面是我的註釋
下載:rsyncd.conf
uid = root
gid = root
use chroot = no
read only = yes
max connections = 10
port = 873
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
#log file = /var/log/rsync.log # 偶不想記錄 log
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[www]
path = /var/www/
comment = AAA.com
ignore errors
read only = yes
list = no
auth users = andy
secrets file = /etc/rsyncd.scrt
#exclude = AAA.com/blog/cache/ #不需要備份的目錄,我使用 exclude from 方法來排除
exclude from = /etc/rsync_exclude.txt
hosts allow = 備份伺服器的 IP
hosts deny = *
4. 排除不備份的目錄
vim /etc/rsync_exclude.txt
輸入不備份的目錄,每行一個,不可以用絕對路徑,而必須用上面配置檔案中 path 的相對路徑,如
AAA.com/blog/cache/
AAA.com/manual/
這個排除檔案有更高階的+-寫法,我們不需要,簡單夠用就好,用 exclude from 方法,好處在於隨時要新增不需要備份的內容時,方便新增,且不需要重啟 rsync 程式
5. 製作一個重啟 rsync 的指令碼
vim /root/rsyncd_restart.sh
放入以下內容
kill -9 `cat /var/run/rsyncd.pid`
rm -f /var/run/rsyncd.pid
rm -f /var/run/rsyncd.lock
rsync --daemon
chmod 600 /root/rsyncd_restart.sh
chmod +x /root/rsyncd_restart.sh
現在直接用 /root/rsyncd_restart.sh 來重新啟動 rsync 程式
6. 備份 MySQL 的指令碼
此指令碼可同時備份多個資料庫,並進行 gzip 壓縮,按日期目錄儲存,3 天之前的備份將被自動刪除
vim /root/mysql_backup.sh
下載: mysql_backup.sh
#!/bin/bash
# 以下配置資訊請自己修改
mysql_user="USER" #MySQL 備份使用者
mysql_password="PASSWORD" #MySQL 備份使用者的密碼
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8" #MySQL 編碼
backup_db_arr=("db1" "db2") #要備份的資料庫名稱,多個用空格分開隔開 如 ("db1" "db2" "db3")
backup_location=/var/www/mysql #備份資料存放位置,末尾請不要帶 「/」,此項可以保持預設,程式會自動建立資料夾
expire_backup_delete="ON" #是否開啟過期備份刪除 ON 為開啟 OFF 為關閉
expire_days=3 #過期時間天數 預設為三天,此項只有在 expire_backup_delete 開啟時有效
# 本行開始以下不需要修改
backup_time=`date +%Y%m%d%H%M` #定義備份詳細時間
backup_Ymd=`date +%Y-%m-%d` #定義備份目錄中的年月日時間
backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #3 天之前的日期
backup_dir=$backup_location/$backup_Ymd #備份資料夾全路徑
welcome_msg="Welcome to use MySQL backup tools!" #歡迎語
# 判斷 MYSQL 是否啟動,mysql 沒有啟動則備份退出
mysql_ps=`ps -ef |grep mysql |wc -l`
mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`
if [[$mysql_ps == 0] -o [$mysql_listen == 0]]; then
echo "ERROR:MySQL is not running! backup stop!"
exit
else
echo $welcome_msg
fi
# 連線到 mysql 資料庫,無法連線則備份退出
mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password <
use mysql;
select host,user from user where user='root' and host='localhost';
exit
end
flag=`echo $?`
if [ $flag != "0"]; then
echo 「ERROR:Can't connect mysql server! backup stop!"
exit
else
echo "MySQL connect ok! Please wait. 。。。。。"
# 判斷有沒有定義備份的資料庫,如果定義則開始備份,否則退出備份
if ["backup_db_arr"!= "" ]then
#dbnames=$(cut -d ',' -f1-5 $backup_database)
#echo "arr is (${backup_db_arr[@]})"
for dbname in ${backup_db_arr[@]}
do
echo "database $dbname backup start. 。。"
`mkdir -p $backup_dir`
`mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --default-character-set=$mysql_charset | gzip 》 $backup_dir/$dbname-$backup_time.sql.gz`
flag=`echo $?`
if [ $flag == "0"];then
echo "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz"
else
echo "database $dbname backup fail!"
fi
done
else
echo "ERROR:No database to backup! backup stop"
exit
fi
# 如果開啟了刪除過期備份,則進行刪除操作
if ["$expire_backup_delete" == "ON" -a "$backup_location"!= "" ]then
`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} ;`
echo "Expired backup data delete complete!"
fi
echo "All database backup success! Think you!"
exit
fi
chmod 600 /root/mysql_backup.sh
chmod +x /root/mysql_backup.sh
好了,加入 crontab 每天 00:00 定時自動備份
00 00 * * * /root/mysql_backup.sh
至此,網站所在 VPS A 上的部署已經都完成了!接下來在備份 VPS B 上進行設定來拉備份。
二、 VPS B 上面的具體部署
1. 安裝 rsync
yum -y install rsync
這裡不需要加入開機啟動了,因為是客戶端,不是服務端
2. 設定 rsync 密碼
echo '你在 A 上設定的密碼'> /etc/rsync.pass
chmod 400 /etc/rsync.pass
3. 測試一下同步
先建個儲存備份的地方
mkdir -p /var/rsync/
測試一下同步
rsync -avzP --delete --password-file=/etc/rsync.pass 使用者名稱 @192.168.0.100::www /var/rsync/AAA.com/
這條命令,我說明一下幾個要點
-avzP 是啥,自己搜尋我站內介紹
--delete 是為了比如 A 上刪除了一個檔案,同步的時候,B 會自動刪除那個檔案
--password-file 剛才 VPS B 中 /etc/rsync.pass 設定那個密碼,要和 VPS A 的 /etc/rsyncd.scrt 中的密碼一樣,這樣 cron 執行的時候,就不需要密碼了
這條命令中的 「使用者名稱」 為 VPS A 的 /etc/rsyncd.scrt 中的使用者名稱
這條命令中的 192.168.0.100 為 VPS A 的 IP 地址
::www,注意是 2 個 : 號,www 為 VPS A 的配置檔案 /etc/rsyncd.conf 中的 [www],意思是根據 A 上的/etc/rsyncd.conf 來同步其中的 [www] 段內容,一個 : 號的時候,用於不
根據配置檔案,直接同步指定目錄
4. 加入 crontab 每天 00:30 同步
30 00 * * * rsync -avzP --delete --password-file=/etc/rsync.pass 使用者名稱 @192.168.0.100::www /var/rsync/AAA.com/ > /dev/null 2>&1
OK!至此大功告成!不怕丟資料了,天天自動備份!
如果還要再保險一點,再加個 VPS C 。
C 來同步 B,雙重備份,哪個掛了都不怕!