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