王 銳
中國鐵通錦州分公司營收中心,遼寧錦州 121000
我們構(gòu)建的游戲平臺游戲數(shù)據(jù)庫使用的是Mysql數(shù)據(jù)庫,每天數(shù)據(jù)吞吐量巨大。系統(tǒng)的不穩(wěn)定、黑客攻擊及其他未知不定因素都可能對游戲數(shù)據(jù)造成毀滅性的破壞。因此我們決定再建一個與在用服務(wù)器同配置的服務(wù)器系統(tǒng)來完成數(shù)據(jù)的備份及同步。同時,我們還配置了對整個Mysql數(shù)據(jù)庫定期進(jìn)行備份,起到了雙保險的作用。這樣,一旦發(fā)生數(shù)據(jù)丟失,能在最短時間內(nèi)恢復(fù)網(wǎng)站運行,使損失降到最低。下面就具體介紹一下我們的搭建過程。
主從數(shù)據(jù)庫服務(wù)器的網(wǎng)絡(luò)拓?fù)淝闆r如圖1 。
1)服務(wù)器配置
游戲數(shù)據(jù)庫主服務(wù)器:至強3.0 雙處理器 內(nèi)存8G RAID10;游戲數(shù)據(jù)庫從服務(wù)器:至強3.0 雙處理器 內(nèi)存8G RAID10。2)軟件環(huán)境
運行操作系統(tǒng):Ubuntu 7.10;
數(shù)據(jù)庫管理系統(tǒng):Mysql 5.0。
Mysql主服務(wù)器可以通過發(fā)送操作日志給從服務(wù)器的方式,讓兩臺數(shù)據(jù)庫機器保持同步更新,當(dāng)主服務(wù)器出現(xiàn)故障時,可以將從服務(wù)器升級為主服務(wù)器,提高服務(wù)的可靠性,但因為操作數(shù)據(jù)量較大,必須保證主服務(wù)器和從服務(wù)器之間的流量足夠(如在同一個局域網(wǎng)內(nèi)),可以從全新服務(wù)器安裝主從服務(wù)器,也可以在主服務(wù)器運行一段時間后再添加從服務(wù)器,這里主服務(wù)器已經(jīng)配置完成,并運行過一段時間。
1)添加從服務(wù)器:首先安裝并配置好從Mysql服務(wù)器, 配置兩臺Mysql的server-id不同,如主Mysql server-id=1,從服務(wù)器Mysql server-id=2;
2)理論上可以進(jìn)行熱操作,但為了提高速度和可靠性,只進(jìn)行了停機操作。
首先關(guān)掉所有訪問數(shù)據(jù)庫的客戶程序,并用以下命令重啟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,這個過程確保沒有其它程序在操作數(shù)據(jù)庫;
4)關(guān)閉mysql, 并打包數(shù)據(jù)庫文件
$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)啟動從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)啟動從服務(wù)器線程
mysql> START SLAVE;
10)到這一步從服務(wù)器就已經(jīng)配置完成了。改變主服務(wù)器上的數(shù)據(jù),觀察從服務(wù)器數(shù)據(jù)已經(jīng)對應(yīng)被更新,可以確認(rèn)主從服務(wù)器安裝成功。
盡管我們已經(jīng)配置了主從服務(wù)器,數(shù)據(jù)庫的安全性大大提高,但對于人為的誤操作造成的數(shù)據(jù)丟失卻還是無能為力,因為你的所有操作都被完整復(fù)制到從服務(wù)器,所以我們還是需要定時做全庫備份。
備份數(shù)據(jù)庫服務(wù)器 IP:192.168.0.3
1)創(chuàng)建全庫備份工作腳本
$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)容,注意腳本實際存放位置
退出保存后運行
$sudo /etc/init.d/cron restart
使配置生效。系統(tǒng)將會在每天凌晨3點準(zhǔn)時執(zhí)行automysqldump.sh腳本,對整個mysql數(shù)據(jù)庫進(jìn)行備份
未搭建主/從數(shù)據(jù)庫服務(wù)器前對整個Mysql數(shù)據(jù)庫的備份是每隔一個小時進(jìn)行備份一次,在備份期間數(shù)據(jù)庫服務(wù)器無法處理更新,導(dǎo)致玩家無法登陸游戲或訪問游戲慢。通過主從數(shù)據(jù)庫服務(wù)器的搭建,我們的備份通過使用從數(shù)據(jù)庫服務(wù)器來執(zhí)行,解決了數(shù)據(jù)備份期間玩家無法登陸游戲問題。
通過這次主/從庫服務(wù)器的搭建也增加了游戲數(shù)據(jù)庫的健壯性,使從數(shù)據(jù)庫服務(wù)器能夠與主數(shù)據(jù)庫服務(wù)器保持?jǐn)?shù)據(jù)同步,主數(shù)據(jù)庫服務(wù)器出現(xiàn)問題時,可以切換到從數(shù)據(jù)庫服務(wù)器成為主數(shù)據(jù)庫服務(wù)器投入使用,避免了長時間的服務(wù)中斷。另一個好處是可以使用從數(shù)據(jù)庫服務(wù)器執(zhí)行備份,而不會干擾主數(shù)據(jù)庫服務(wù)器。在備份過程中,主數(shù)據(jù)庫服務(wù)器可以繼續(xù)處理更新。
[1]Leon.atkinson.Mysql核心編程[M].北京:清華大學(xué)出版社,2005,10.
[2]Beneorta.Mysql必知必會[M].北京:人民郵電出版社,2008,12.
[3]唐漢明.Mysql數(shù)據(jù)庫開發(fā)優(yōu)化與管理維護[M].北京:人民郵電出版社,2008,4.