王 锐
中国铁通锦州分公司营收中心,辽宁锦州 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.