一、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. 创建授权用户
1
2
3
4
5
6
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. 编辑配置文件
1
2
3
4
5
6
7
8
[root@oracle ~]# vim /etc/my.cnf
log-bin=mysql-bin #开启二进制日志
server-id=1
relay-log=mysql-relay-bin #开启中继日志
log_slave_updates = on #从服务器将时间记录到二进制日志中
auto_increment_increment=2 #自动增长的步长
auto_increment_offset=1 #自动增长的起始数值
#A服务器的配置
1
2
3
4
5
6
7
[root@node2 ~]# vim /etc/my.cnf
server-id=2
#log-bin=mysql-bin
#log_slave_updates = on
auto_increment_increment=2
auto_increment_offset=2
#B服务器的配置,先关闭二进制日志
重启服务
1
2
3
[root@oracle ~]# service mysqld restart
Shutting down MySQL.. [ OK ]
Starting MySQL. [ OK ]
创建测试用的表
1
2
3
4
5
6
7
8
9
10
11
12
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服务器上
1
2
3
4
[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
1
2
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中有记录
1
2
3
4
[root@node2 ~]# vim /etc/my.cnf
#将刚刚注释掉的参数生效
log-bin=mysql-bin
log_slave_updates = on
1
2
3
[root@node2 ~]# service mysqld restart
Shutting down MySQL.. [确定]
Starting MySQL. [确定]
再让A服务器成为slave
1
2
3
4
5
6
7
8
9
10
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服务器的状态:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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服务器上的状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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. 测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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服务器上查看的结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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服务器上查看
这样双主模型就已经实现了。
阅读(4808) | 评论(0) | 转发(0) |