集群服务器追求高可用性,而数据库又是任何一个系统的基石,所以往往大型系统对数据库层是做了备份或者故障转移方案的,以应对突发情况。如果你使用的数据库是Mysql,很幸运,它能通过修改配置文件达到实时备份和故障转移的目的。
我们先来看看Mysql双向同步的作用:
图分析:应用程序通过jdbc配置的两个数据库通道跟数据库交互,正常情况下hostA通道工作,当hostA通道出现故障时jdbc连接会自动转到hostB通道,而databaseA跟databaseB是双向实时同步且备份的关系,因此数据是一样的。有了这种机制就不怕其中任何一台数据库服务器宕机。两台同时出现故障的可能性比较小。
很完美的方案,下面我们来看看搭建Mysql双向同步机制的步骤。
1 在同一网域内的A,B(以Linux为例)两台服务器各装上mysql(建议版本相同)。
rpm -ivh mysql-server.rpm
rpm -ivh mysql-client.rpm
或者
apt-get install mysql
2 新增A,B两台服务器能相互访问的mysql用户,为同步做准备。
mysql> GRANT ALL PRIVILEGES ON *.* TO sync@"%" IDENTIFIED BY sync WITH GRANT OPTION; // "%"表示同一网域内的任意ip,你也可以指定A服务器或者B服务器的ip。
mysql> GRANT ALL PRIVILEGES ON *.* TO sync@"localhost" IDENTIFIED BY
sync WITH GRANT OPTION; // 为了避免sync用户无法拥有在本机的同步数据库的全部权限的尴尬局面,建议上述两条命令结合使用。它们都是指向同一个用户即sync。(查看user表里面的root用户权限分配你就会明白意思了)
3 各用Mysql用户root创建好需要要同步的数据库(只建库就好了,同步之后再建表)。
mysql> create database SyncTest;
4 准备好mysql双向同步必须的配置文件即my.cnf。此文件一般位于/etc/或者/etc/mysql/目录下。如果不存在,你可以将mysql安装目录下的my-medium.cnf复制到/etc/下,重命名成my.cnf。
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
5 进行同步配置。下面这些配置信息是Mysql双向同步配置必不可少的,必须写进my.cnf文件且要写在正确的位置上。(my.cnf文件有同步配置预留的注释位置)。
bind-address = 0.0.0.0
master-host = A服务器ip //同步主机ip
master-user = sync //用户
master-password = sync //口令
master-port = 3306
master-connect-retry = 2 //重复连接master 2次
replicate-do-db = SyncTest //要同步的数据库,如需配置多个同步数据库见#例子
#replicate-do-db = database1
#replicate-do-db = database2 ...
replicate-ignore-db = mysql //mysql为系统数据库,不需要同步
skip-federated
log-bin = mysql-bin //同步的日志文件
6 my.cnf文件配置好后重启mysql服务/etc/init.d/mysql restart。不要期望仅仅通过修改配置文件就能成功实现mysql同步,当然也不排除这种可能!下面的步骤也很重要。
7 使用命令检查双向同步配置是否成功!用Mysql的root用户登陆mysql,通过下列命令查看同步信息。(这里我们暂且把A数据库当从数据库(slave),B数据库当主数据库(master)即A(slave)-->B(master)模式。同步成功后,我们还需要按照A(master)-->B(slave)模式进行同样的操作,这样才能构成mysql的双向同步即A(master)<-->B(master)模式)。
一,查看A服务器的从数据库角色信息。
mysql> show slave status\G
*************************** 1. row ***************************
Master_Host----------: A服务器ip //主服务器
Master_User----------: sync //用户名
Master_Port----------: 3306 //mysql端口
Connect_Retry--------: 2 //尝试连接次数
Master_Log_File------: mysql-bin.000013 //主服务器日志文件
Read_Master_Log_Pos--: 252 //主服务器日志文件的标识
Relay_Log_File-------: SyncTest03-relay-bin.000018
Relay_Log_Pos--------: 251
Relay_Master_Log_File: mysql-bin.000013
Slave_IO_Running-----: No //日志是否同步
Slave_SQL_Running----: No //sql是否同步
Replicate_Do_DB------: SyncTest //处于同步状态的数据库
Replicate_Ignore_DB--: mysql //没有处于同步状态的数据库
二,查看B服务器的主数据库角色信息。
mysql> show master status\G
*************************** 1. row ***************************
File------------: mysql-bin.000016
Position--------: 364
Binlog_Do_DB----:
Binlog_Ignore_DB:
信息解读:
Slave_IO_Running和Slave_SQL_Running是双向同步是否成功的两项标志性的配置,都为Yes则同步配置成功,同为No或其中一个为No则为失败!可以看出上面的配置是失败的。但是失败的原因显而易见,原因是slave的Master_Log_File,Relay_Master_Log_File,没有跟master的FILE保持一致,而且Read_Master_Log_Pos没有跟master的Postion保持一致。我们需要修改slave的配置,将几项配置同master保持一致,想方设法把Slave_IO_Running和Slave_SQL_Running的状态显示为Yes!
8 使用命令改变数据库同步不成功的状态。
一,停止slave:
mysql> slave stop;
二,改变配置:
mysql> change master to master_host='A服务器ip',master_user='sync',
master_password=sync,master_port=3306,master_log_file='mysql-bin.000016',
master_log_pos=364;
此命令实际更改的是master.info文件,需要注意的是master的配置是随着对数据库的操作而变化的,要确保show master status\G的信息是最新信息,以便同步。
三,启动slave:
mysql> slave start;
四,再次查看A服务器的从数据库角色的配置信息:
mysql> show slave status\G
*************************** 1. row ***************************
Master_Host----------: A服务器ip
Master_User----------: sync
Master_Port----------: 3306
Connect_Retry--------: 2
Master_Log_File------: mysql-bin.000016
Read_Master_Log_Pos--: 364
Relay_Log_File-------: SyncTest03-relay-bin.000018
Relay_Log_Pos--------: 251
Relay_Master_Log_File: mysql-bin.000016
Slave_IO_Running-----: Yes
Slave_SQL_Running----: Yes
Replicate_Do_DB------: SyncTest
Replicate_Ignore_DB--: mysql
信息解读:
Master_Log_File,Relay_Master_Log_File,Read_Master_Log_Pos三项配置改变了,也与主数据库的master配置相一致了。Slave_IO_Running,Slave_SQL_Running两项标志性配置同显示为Yes,是的,A数据库同步于B数据库成功了。我们再来看看下面的master.info文件,果不其然,刚刚change master改变的就是它。
[root@SyncTest04 ~]# cat /var/lib/mysql/master.info
15
mysql-bin.000016
364
A服务器
sync
sync
3306
2
0
9 换个姿势再来一次,成功就在眼前!
A(slave)-->B(master)A同步于B成功了,要想实现A(master)<-->B(master)双向同步还需要按照A(master)-->B(slave)的模式重走7、8步骤。
10 测试就不用说了,需要指出的是mysql超级用户root对同步数据库SyncTest同样具有同步功能。