Linux服务器配置Mysql双向同步


        集群服务器追求高可用性,而数据库又是任何一个系统的基石,所以往往大型系统对数据库层是做了备份或者故障转移方案的,以应对突发情况。如果你使用的数据库是Mysql,很幸运,它能通过修改配置文件达到实时备份和故障转移的目的。

我们先来看看Mysql双向同步的作用:
Linux服务器配置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同样具有同步功能。   

 

你可能感兴趣的:(sql,sql,应用服务器,linux,mysql,server)