双主互备的操作与主从互备基本相同,只是重复了一次而已

 

双主互备的ID冲突处理:

        

        Mysql双主自增长冲突处理

多主互备和主从复制有一些区别,因为多主中都可以对服务器有写权限,所以设计到自增长重复问题

 

出现的问题(多主自增长ID重复)

        1:首先我们通过A,B的test表结构

        2:掉A,在B上对数据表test(存在自增长ID)执行插入操作,返回插入ID为1

        3:后停掉B,在A上对数据表test(存在自增长ID)执行插入操作,返回的插入ID也是1

        4:然后 我们同时启动A,B,就会出现主键ID重复

 

解决方法:

        我们只要保证两台服务器上插入的自增长数据不同就可以了

        如:A查奇数ID,B插偶数ID,当然如果服务器多的话,你可以定义算法,只要不同就可以了

 

        在这里我们在A,B上加入参数,以实现奇偶插入

A:my.cnf上加入参数            auto_increment_offset = 1
            auto_increment_increment = 2
            这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了
 
        B:my.cnf上加入参数            auto_increment_offset = 2
            auto_increment_increment = 2
            这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了

        可以看出,你的auto_increment字段在不同的服务器之间绝对不会重复,所以Master-Master结构就没有任何问题了。当 然,你还可以 使用3台,4台,或者N台服务器,只要保证auto_increment_increment = N 再设置一下auto_increment_offset为适当的初始值就可以了,那样,我们的MySQL可以同时有几十台主服务器,而不会出现自增长ID 重复。

 

 

1、配置文件修改

主服务器1修改(master)

修改mysql配置

找到主数据库的配置文件my.cnf(或者my.ini),开启二进制日志,和server-id        vi  my.cnf        [mysqld]
        log-bin=mysql-bin              #记录二进制日志
        server-id = 1
         auto_increment_increment=2
        expire_logs_days = 3              #binlog过期时间,超过三天未修改的清楚
        binlog-do-db=kvdata             #master需要记录日志的同步库,多个写多行
        binlog-ignore-db=mysql        #master不需要记录日志的同步库
        replicate-ignore-db=mysql     #复制时需要排除的数据库
        replicate-ignore-db=information_schema
        replicate-ignore-db=performance_schema
        实际操作设置:
        33061端口的
            主server-id  1      从server-id 101
        33062端口的
            主server-id  2      从server-id 102
        33063端口的
            主server-id  3      从server-id 103
        33064端口的
            主server-id  4      从server-id 104

主服务器2修改(master)

 

找到主数据库的配置文件my.cnf(或者my.ini),开启二进制日志,和server-id

vi  my.cnf        [mysqld]
        log-bin=mysql-bin              #记录二进制日志
        server-id = 2
        auto_increment_increment=2
        expire_logs_days = 3              #binlog过期时间,超过三天未修改的清楚
        binlog-do-db=kvdata             #master需要记录日志的同步库,多个写多行
        binlog-ignore-db=mysql        #master不需要记录日志的同步库
        replicate-ignore-db=mysql     #复制时需要排除的数据库
        replicate-ignore-db=information_schema
        replicate-ignore-db=performance_schema

2、启动mysql

 

修改mysql启动密码:
        vi  /lsl/cluster/mysql/33061/log/mysqld_safe.log
        在该文件中找到数据库第一次启动时创建的密码
            A temporary password is generated for root@localhost:xxxxxx
        使用该密码登录数据库:
            /opt/JMKVCloud/MessageSoft/Mysql/bin/mysql  -uroot  -P33061 -S /lsl/cluster/mysql/33061/mysql.sock   -p
            >alter user 'root'@'localhost' identified by 'jmuser';
            >flush privileges;
            >grant all privileges on *.* to 'root'@'%' identified by 'jmuser';
            >flush privileges;

 

3、在两台服务器上各自创建主从同步账户和权限

以下操作,在两个mysql都执行
            >create user jm@192.168.10.56 identified by 'jmuser';
            >GRANT  REPLICATION SLAVE ON *.* TO jm@192.168.10.56 identified by 'jmuser';
            > flush privileges;

4、各自配置对方的同步信息

   

33061mysql
             mysql> change master to master_host='192.168.10.56',master_port=33062, master_user='jm', master_password='jmuser',master_log_file='mysql-bin.000004',master_log_pos=852;
 
    33062mysql
             mysql> change master to master_host='192.168.10.56',master_port=33061, master_user='jm', master_password='jmuser',master_log_file='mysql-bin.000004',master_log_pos=899;

5、各自打开同步

        以下操作,在两个mysql都执行

        > start slave;

 

6、查看slave状态

以下操作,在两个mysql都执行
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.10.56                              master的相关信息,出问题了,可以从这里查看分析
                  Master_User: jm
                  Master_Port: 33061
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 92397
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 91865
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes           #此处两个yes,表示主从同步成功
            Slave_SQL_Running: Yes
              Replicate_Do_DB: kvdata
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0                #出问题了,可以从这里找参考信息
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 92397
              Relay_Log_Space: 92076
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: 572d771a-0f6a-11ea-96c4-484d7ec7da58
             Master_Info_File: /home/mysql/33061/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)