王 銳
中國(guó)鐵通錦州分公司營(yíng)收中心,遼寧錦州 121000
我們構(gòu)建的游戲平臺(tái)游戲數(shù)據(jù)庫(kù)使用的是Mysql數(shù)據(jù)庫(kù),每天數(shù)據(jù)吞吐量巨大。系統(tǒng)的不穩(wěn)定、黑客攻擊及其他未知不定因素都可能對(duì)游戲數(shù)據(jù)造成毀滅性的破壞。因此我們決定再建一個(gè)與在用服務(wù)器同配置的服務(wù)器系統(tǒng)來完成數(shù)據(jù)的備份及同步。同時(shí),我們還配置了對(duì)整個(gè)Mysql數(shù)據(jù)庫(kù)定期進(jìn)行備份,起到了雙保險(xiǎn)的作用。這樣,一旦發(fā)生數(shù)據(jù)丟失,能在最短時(shí)間內(nèi)恢復(fù)網(wǎng)站運(yùn)行,使損失降到最低。下面就具體介紹一下我們的搭建過程。
主從數(shù)據(jù)庫(kù)服務(wù)器的網(wǎng)絡(luò)拓?fù)淝闆r如圖1 。
1)服務(wù)器配置
游戲數(shù)據(jù)庫(kù)主服務(wù)器:至強(qiáng)3.0 雙處理器 內(nèi)存8G RAID10;游戲數(shù)據(jù)庫(kù)從服務(wù)器:至強(qiáng)3.0 雙處理器 內(nèi)存8G RAID10。2)軟件環(huán)境
運(yùn)行操作系統(tǒng):Ubuntu 7.10;
數(shù)據(jù)庫(kù)管理系統(tǒng):Mysql 5.0。
Mysql主服務(wù)器可以通過發(fā)送操作日志給從服務(wù)器的方式,讓兩臺(tái)數(shù)據(jù)庫(kù)機(jī)器保持同步更新,當(dāng)主服務(wù)器出現(xiàn)故障時(shí),可以將從服務(wù)器升級(jí)為主服務(wù)器,提高服務(wù)的可靠性,但因?yàn)椴僮鲾?shù)據(jù)量較大,必須保證主服務(wù)器和從服務(wù)器之間的流量足夠(如在同一個(gè)局域網(wǎng)內(nèi)),可以從全新服務(wù)器安裝主從服務(wù)器,也可以在主服務(wù)器運(yùn)行一段時(shí)間后再添加從服務(wù)器,這里主服務(wù)器已經(jīng)配置完成,并運(yùn)行過一段時(shí)間。
1)添加從服務(wù)器:首先安裝并配置好從Mysql服務(wù)器, 配置兩臺(tái)Mysql的server-id不同,如主Mysql server-id=1,從服務(wù)器Mysql server-id=2;
2)理論上可以進(jìn)行熱操作,但為了提高速度和可靠性,只進(jìn)行了停機(jī)操作。
首先關(guān)掉所有訪問數(shù)據(jù)庫(kù)的客戶程序,并用以下命令重啟mysql
$sudo /etc/init.d/mysql restart;
3)重啟進(jìn)入mysql服務(wù)器,并記下當(dāng)前日志的文件名和位置
$mysql -uroot
mysql > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73 | test | manual,mysql |
+---------------+----------+--------------+------------------+
記下上圖的文件名:mysql-bin.003 和位置73,這個(gè)過程確保沒有其它程序在操作數(shù)據(jù)庫(kù);
4)關(guān)閉mysql, 并打包數(shù)據(jù)庫(kù)文件
$sudo /etc/init.d/mysql stop
$sudo tar czvf ~/mysqlbak.tar.gz /var/lib/mysql/.
$sudo /etc/init.d/mysql start
5)登錄從服務(wù)器,下載打包的文件,并解壓到相應(yīng)位置
$sftp wolf@192.168.0.212
$get mysqlbak.tar.gz
$sudo tar zxvf mysqlbak.tar.gz /var/lib/mysql/.
6)進(jìn)入查看文件屬性
$cd /var/lib/mysql
$ls-al
7)更改相應(yīng)的屬性
$ sudo chown mysql /var/lib/mysql/*
$sudo chgrp mysql /var/lib/mysql/*
8)啟動(dòng)從mysql服務(wù)器,并設(shè)置復(fù)制
$sudo /etc/init.d/mysql restart
$mysql-uroot
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
9)啟動(dòng)從服務(wù)器線程
mysql> START SLAVE;
10)到這一步從服務(wù)器就已經(jīng)配置完成了。改變主服務(wù)器上的數(shù)據(jù),觀察從服務(wù)器數(shù)據(jù)已經(jīng)對(duì)應(yīng)被更新,可以確認(rèn)主從服務(wù)器安裝成功。
盡管我們已經(jīng)配置了主從服務(wù)器,數(shù)據(jù)庫(kù)的安全性大大提高,但對(duì)于人為的誤操作造成的數(shù)據(jù)丟失卻還是無能為力,因?yàn)槟愕乃胁僮鞫急煌暾麖?fù)制到從服務(wù)器,所以我們還是需要定時(shí)做全庫(kù)備份。
備份數(shù)據(jù)庫(kù)服務(wù)器 IP:192.168.0.3
1)創(chuàng)建全庫(kù)備份工作腳本
$nano automysqldump.sh
在打開的編輯器中輸入以下內(nèi)容,并退出保存(注意替換以下mysql登錄信息)
#!/bin/bash
HOST=192.168.1.1 # mysql IP
USER=root # mysql username
PASSWORD=123 # mysql password
BAKDIR=/home/huayu/backup/sqlbak # default
DATESTR=`date +%F-%H%M%S `
if [[ -d $BAKDIR ]]
then
echo "passthis"
else
mkdir $BAKDIR
fi
mysqldump -h $HOST -u $USER -p$PASSWORD --alldatabases > $BAKDIR/$DATESTR.sql
tar zcvf $BAKDIR/$DATESTR.tar.gz $BAKDIR/$DATESTR.sql
rm -rf $BAKDIR/$DATESTR.sql
2)給腳本配置執(zhí)行屬性
$chmod u+x automysqldump.sh
3)將備份腳本配置成系統(tǒng)周期任務(wù)
$sudo nano /etc/crontab
以打開的編輯器中輸入以下內(nèi)容,注意腳本實(shí)際存放位置
退出保存后運(yùn)行
$sudo /etc/init.d/cron restart
使配置生效。系統(tǒng)將會(huì)在每天凌晨3點(diǎn)準(zhǔn)時(shí)執(zhí)行automysqldump.sh腳本,對(duì)整個(gè)mysql數(shù)據(jù)庫(kù)進(jìn)行備份
未搭建主/從數(shù)據(jù)庫(kù)服務(wù)器前對(duì)整個(gè)Mysql數(shù)據(jù)庫(kù)的備份是每隔一個(gè)小時(shí)進(jìn)行備份一次,在備份期間數(shù)據(jù)庫(kù)服務(wù)器無法處理更新,導(dǎo)致玩家無法登陸游戲或訪問游戲慢。通過主從數(shù)據(jù)庫(kù)服務(wù)器的搭建,我們的備份通過使用從數(shù)據(jù)庫(kù)服務(wù)器來執(zhí)行,解決了數(shù)據(jù)備份期間玩家無法登陸游戲問題。
通過這次主/從庫(kù)服務(wù)器的搭建也增加了游戲數(shù)據(jù)庫(kù)的健壯性,使從數(shù)據(jù)庫(kù)服務(wù)器能夠與主數(shù)據(jù)庫(kù)服務(wù)器保持?jǐn)?shù)據(jù)同步,主數(shù)據(jù)庫(kù)服務(wù)器出現(xiàn)問題時(shí),可以切換到從數(shù)據(jù)庫(kù)服務(wù)器成為主數(shù)據(jù)庫(kù)服務(wù)器投入使用,避免了長(zhǎng)時(shí)間的服務(wù)中斷。另一個(gè)好處是可以使用從數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行備份,而不會(huì)干擾主數(shù)據(jù)庫(kù)服務(wù)器。在備份過程中,主數(shù)據(jù)庫(kù)服務(wù)器可以繼續(xù)處理更新。
[1]Leon.atkinson.Mysql核心編程[M].北京:清華大學(xué)出版社,2005,10.
[2]Beneorta.Mysql必知必會(huì)[M].北京:人民郵電出版社,2008,12.
[3]唐漢明.Mysql數(shù)據(jù)庫(kù)開發(fā)優(yōu)化與管理維護(hù)[M].北京:人民郵電出版社,2008,4.