一、A、B双主模型的实现条件:

1. 开启二进制日志

2. 开启中继日志

3. 解决自动增长列的问题

如果A服务器上自动增长的列编号有一个35,此时还没有同步到B服务器上,在B服务器上插入一条数据,编号也是35。当同步A的35到B服务器上来的话,必然产生数据丢失。

解决办法:

让在A上插入的行的自动增长都为奇数,让B服务器上的自动增长都为偶数。这样就解决了自动增长的问题。

假设A是一台生产环境中的数据库,现在想添加B服务器,实现双主模型。

二、步骤:

1. 在A、B服务器上创建具有复制权限的帐号

2. 在A、B服务器上修改配置文件(开启二进制日志、中继日志等)

3. 将A服务器上存在的数据文件导入到B服务器中

注意:导入数据的时候,先关闭B服务器的二进制日志。

4. 让B先成为slave,再让A成为slave

5. 测试

三、开始配置

1. 创建授权用户

mysql> grant replication slave on *.* to 'slave'@'192.168.2.96' identified by '12345';Query OK, 0 rows affected (0.00 sec)#A服务器mysql> grant replication slave on *.* to 'slave'@'192.168.2.93' identified by '12345';Query OK, 0 rows affected (0.00 sec)#B服务器

2. 编辑配置文件

[root@oracle ~]# vim /etc/my.cnflog-bin=mysql-bin                 #开启二进制日志server-id=1relay-log=mysql-relay-bin         #开启中继日志log_slave_updates = on            #从服务器将时间记录到二进制日志中auto_increment_increment=2        #自动增长的步长auto_increment_offset=1           #自动增长的起始数值#A服务器的配置
[root@node2 ~]# vim /etc/my.cnfserver-id=2#log-bin=mysql-bin#log_slave_updates = onauto_increment_increment=2auto_increment_offset=2#B服务器的配置,先关闭二进制日志

重启服务

[root@oracle ~]# service mysqld restartShutting down MySQL..                                      [  OK  ]Starting MySQL.                                            [  OK  ]

创建测试用的表

mysql> select * from info;+-----+-------+-----+| sid | name  | age |+-----+-------+-----+|   1 | zhang |  23 ||   2 | li    |  12 ||   3 | cheng |  34 ||   4 | wang  |  22 ||   5 | chen  |  44 |+-----+-------+-----+5 rows in set (0.00 sec)#在A服务器上创建测试用的表

3. 将表导入到B服务器上

[root@oracle ~]# mysqldump --databases data --lock-all-tables --master-data=2 > /root/dump.sql[root@oracle ~]# scp /root/dump.sql root@192.168.2.96:/root/#A服务器上dump+拷贝[root@node2 ~]# mysql < dump.sql     #B服务器上执行

4. 让B服务器先成为slave

mysql> change master to master_host='192.168.2.93',master_user='slave',master_password='12345',master_port=3306,MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=1068;#MASTER_LOG_FILE和MASTER_LOG_POS在dump.sql中有记录
[root@node2 ~]# vim /etc/my.cnf#将刚刚注释掉的参数生效log-bin=mysql-binlog_slave_updates = on
[root@node2 ~]# service mysqld restartShutting down MySQL..                                      [确定]Starting MySQL.                                            [确定]

  再让A服务器成为slave

mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 |      120 |              |                  |                   |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)#在B上查看二进制日志信息mysql> change master to master_host='192.168.2.96',master_user='slave',master_password='12345',master_port=3306,MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=120;mysql> start slave;

查看A、B服务器的状态:

mysql> show slave status\G;*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 192.168.2.96                  Master_User: slave                  Master_Port: 3306                Connect_Retry: 60              Master_Log_File: mysql-bin.000001          Read_Master_Log_Pos: 120               Relay_Log_File: mysql-relay-bin.000002                Relay_Log_Pos: 283        Relay_Master_Log_File: mysql-bin.000001             Slave_IO_Running: Yes            Slave_SQL_Running: Yes#A服务器上的状态
mysql> show slave status\G;*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 192.168.2.93                  Master_User: slave                  Master_Port: 3306                Connect_Retry: 60              Master_Log_File: mysql-bin.000008          Read_Master_Log_Pos: 120               Relay_Log_File: mysql-relay-bin.000003                Relay_Log_Pos: 283        Relay_Master_Log_File: mysql-bin.000008             Slave_IO_Running: Yes            Slave_SQL_Running: Yes#在B服务器上查看状态

5. 测试:

mysql> insert into info(name,age) values('sun',25),('ding',29);#在A服务器上插入2行数据mysql> select * from info;+-----+-------+-----+| sid | name  | age |+-----+-------+-----+|   1 | zhang |  23 ||   2 | li    |  12 ||   3 | cheng |  34 ||   4 | wang  |  22 ||   5 | chen  |  44 ||   7 | sun   |  25 ||   9 | ding  |  29 |+-----+-------+-----+7 rows in set (0.00 sec)#在B服务器上查看的结果

mysql> insert into info(name,age) values('BB',33),('BC',21);#在B服务器上插入2行数据mysql> select * from info;+-----+-------+-----+| sid | name  | age |+-----+-------+-----+|   1 | zhang |  23 ||   2 | li    |  12 ||   3 | cheng |  34 ||   4 | wang  |  22 ||   5 | chen  |  44 ||   7 | sun   |  25 ||   9 | ding  |  29 ||  10 | BB    |  33 ||  12 | BC    |  21 |+-----+-------+-----+9 rows in set (0.00 sec)#在A服务器上查看

这样双主模型就已经实现了。