三五行教你搞定MySql MariaDB主从同步

首先说说我对MySql主从同步的一种理解。不一定正确,仅代表个人理解。

首先主设备上的数据库要开启该项功能,俗称Master,然后开启之后会将数据库相关的事务、语句等等通过log文件进行广播。

然后就是从属设备,要设置连接到主设备的账户及链接地址。然后开启同步事务“start slave”。

这样之后,主服务器上数据库发生的变化通过生成的log文件进行广播,所有从属服务器接收到该log文件,然后使用自身事务将数据同步到本机。

这个log文件应当是一种约定好的二进制文件。

现在开始通过配置开启主从同步:

1、主机设置。我们通过配置my.cnf文件设置好Master机的属性。

//设置索引id,通常主机设置为1
server-id=1
//定义广播日志的方式:mysql-bin
log-bin=mysql-bin
//需要同步的数据库,如果是全库同步,则无需填写,如果有一个数据库一行
binlog-do-db=auth
binlog-do-db=gplus

//不需要进行同步的数据,如果有,则一行一个
binlog-ignore-db=information_schema
binlog-ignore-db=mysql

通过上述my.cnf文件的配置,然后重启数据库就完成了主机配置。请找准自己的数据库配置文件,MySql和Mariadb使用的服务器配置文件是名称和位置可能有诧异。请将上边代码放到[mysqld]下面。

我们重启数据库之后,通过命令行登录数据库mysql -uroot -p,输入密码。然后查看一下主数据库的状态:

show master status;

可以看到如下提示,则表明主设备已经开启了数据广播,其中File和Position要记住。从机设置时候需要用到:

注意,上图中可以看到开启同步的数据库以及,无需同步的数据库:Binlog_Do_DB\Binlog_Ignore_DB

2、从属设置。同样需要通过my.cnf进行配置。配置完成之后,还需要在mysql命令行中进行连接设置和启用服务。先看配置代码:

//设置索引,不可重复,上边设置的1,这里就顺延为2,如果有其他设备可以以此类推,确保唯一
server-id=2
//从属同步日志,可以不填写,这里还省略了很多高级设置,有兴趣可以自行研究。
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
//需要同步的主数据库,以及从属对应的数据库。这里重点解决主从数据库命名不一致的问题。
replicate-rewrite-db = auth -> auth_eluna
replicate-rewrite-db = gplus -> gplus_eluna
replicate-rewrite-db = world -> world_eluna

设置完成之后,重启mysql服务器。重启之后,我们使用命令行登入mysql,开始配置从属同步的链接地址,账户等信息。此处需要提醒一下,如果有特殊需要,建议在主数据库上添加专用的数据库访问用户,方式混淆。

登入进mysql命令行之后,通过如下命令进行从属访问设置:

change master to master_host='wow.53in.cn',master_port=3306,master_user='root',master_password='璀璨星城',master_log_file='master-bin.000003',master_log_pos=342;

可以看到,我们需要设置:

1、连接主机地址。通过ip最佳。

2、连接主机的数据库端口。一般默认3306。

3、访问主机数据库的账户/密码。按自己设置的填写。

4、master_log_file的名字。这个就是在设置主机show master status; 中看到File名字。要保持一致。

5、master_log_pos的编号。这个就是在设置主机show master status; 中Position。要保持一致。

回车进行配置。然后开启同步:

start slave;

上边这个开启命令可能因为mysql版本不同略有差异。

开启之后,通过下方命令来查看同步状态:

show slave status \G;

停用命令:stop slave;主机刷新log名字和position使用:flush logs;

注意刷新过log之后,要对从属机器进行配置。配置之前,先要停用stop slave;然后在启用。

我们查看同步状态show slave status \G;看到的大概如下:

我们需要关注两个红框区域,第一个代表同步状态,双Yes为正常。第二个红框则是当前的状态描述。可以自行翻译一下。我这个截图中意思是说,从属同步正常,等待接收主机广播。

关于MySql主从同步还有很多高级设置和使用技巧。本文就不再一一赘述,有需要的朋友可以自行深入研究。

做这个主从同步的目的是为了解决魔兽模拟器的多分区信息同步问题。

我们大家都知道,魔兽模拟器会有两个进程:

1、worldserver(用于响应客户端,提供游戏数据交互,主要操作:world、characters两个数据库)

2、authserver(用户账户注册、认证、登录等服务,主要操作:auth、characters两个数据库)

在auth中realmlist中我们是可以定义多个分区的。如下图:

笔者所遇到的问题就是,国内一个分区,新西兰一个分区。这两个分区由两台相对独立的服务器提供服务。他们之间的延迟相差300-600ms。

我们为了优化用户体验,所以,将两台主机上都搭建对应的服务及数据库。此时会遇到一个问题:

统一的账户认证服务意味着公用一个auth表,两套独立的characters和world数据库。

其实我们还为服务器增加了一个plus表,用来存放一些个性化的设置,例如幻化、变身卡、会员积分等等。这种情况下,如果新西兰服务器通过远程访问主账户表和plus表,那延迟会非常高。而且如果两边相对独立,那么会有两个authserver进程,他们对账户生成的session也是完全不同的。无法做到一体化的登录和选区操作。

这里就用到了主从同步。我们把主服务器上的auth和plus表同步到从属服务器。在从属服务器上,只开启worldserver,所有人登录都通过主服务器上的authserver。这样保证了session的统一,也可以快速的进行区服务器的切换。

而从属服务器上的worldserver在进行游戏数据交换需要访问auth和plus表的时候,就可以直接访问本机数据库。无论是现在,还是将来。都可以把游戏的延迟体验做到最优。

最重要的是:

我们通过一个登录器,一个注册网站、可以服务两个跨州的大区。在后期进行维护更新的时候就非常方便了!