实验前说明:
其实,MySQL主主复制的本质,就是MySQL的双向主从,没有我们想的那么复杂。配置也很简单。明白了这点,我们下来开始实践!
实验前提:已经做好主从关系的master与slave两台机器(当然,多实例也可以)
master 192.168.0.102 hostname:master
slave 192.168.0.103 hostname:slave
OK,如果上述环境已经完成,接下来开始做主主。
步骤一:修改master,与slave的my.cnf配置文件(当然了,此步最好提前.)
关键核心代码:
1
2
3
4
5
6
7
|
master数据库的my.cnf核心:
relay-log = /application/mysql/data/relay-bin
relay-log-info- file
= /application/mysql/data/relay-log .info
log-bin = /application/mysql/data/mysql-bin
log-slave-updates
auto_increment_increment = 2 #自增为2
auto_increment_offset = 1 #起始为1
|
……
1
2
3
4
5
6
7
|
slave数据库的my.cnf核心:
relay-log = /application/mysql/data/relay-bin
relay-log-info- file
= /application/mysql/data/relay-log .info
log-bin = /application/mysql/data/mysql-bin
log-slave-updates
auto_increment_increment = 2 #自增为2
auto_increment_offset = 2 #起始位2
|
代码解说:主从都开启binlog和relay-log就不用说了吧?同步的核心...
为了防止主主结构的数据库架构在写入时发生冲突故障,因此需要对主主数据库写入数据进行特殊编号,按照上边我发的代码来看,master的起始是1,每次自增2,那么下次记录数据编号就是3,以此类推,主数据库中的记录编号依次为 1,3,5,7……
同理,slave起始位2,每次自增2,那么从数据库中的记录依次是2,4,6,8……这样避免了同事写入记录时的冲突问题.
步骤二:重启master,slave数据库
步骤三:在slave数据库上边锁表,记录postion信息,记录之后解锁。
1
2
3
4
5
6
7
8
9
10
|
mysql> flush tables with read
lock;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+--------------------------+
| mysql-bin.000004 | 347 | | mysql,information_schema |
+------------------+----------+--------------+--------------------------+
1 row in
set
(0.00 sec)
mysql> unlock tables;
|
步骤四:在slave数据库授权主数据库同步用户
1
2
|
mysql> grant replication slave on *.* to 'slave' @ '192.168.0.102'
identified by '123456' ;
Query OK, 0 rows affected (0.00 sec)
|
步骤五:在master数据库执行change操作
1
2
|
mysql> CHANGE MASTER TO MASTER_HOST= '192.168.0.103' , MASTER_PORT=3306, MASTER_USER= 'slave' , MASTER_PASSWORD= '123456' , MASTER_LOG_FILE= 'mysql-bin.000004' , MASTER_LOG_POS=347;
Query OK, 0 rows affected (0.01 sec)
|
步骤六:开启master数据库slave同步,并且查看同步状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for
master to send event
Master_Host: 192.168.0.103
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 347
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
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: 347
Relay_Log_Space: 403
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: 2883
1 row in
set
(0.00 sec)
ERROR:
No query specified
|
步骤七:测试工作,测试原始的主从是否正常。
测试工作2,在slave端写入,是否可以同步到master。
至此,MySQL主主模式搭建完成.