mysql主主複制結構差別于主從複制結構。在主主複制結構中,兩台伺服器的任何一台上面的資料庫存發生了改變都會同步到另一台伺服器上,這樣兩台伺服器互為主從,并且都能向外提供服務。
有了上一節的主從複制,那麼主主複制就很容易了。
一、先修改配置檔案
伺服器a(192.168.1.254)配置如下
log-bin = mysql-bin
server-id = 1
expire-logs-days = 100
replicate-do-db = test
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
auto-increment-increment = 2
auto-increment-offset = 1
伺服器b(192.168.1.252)配置
server-id = 2
expire-logs-days = 100
auto-increment-increment = 2
auto-increment-offset = 2
兩台伺服器都重新開機
mysql> service mysqld restart
注:二都隻有server-id不同和 auto-increment- offset不同
auto-increment-offset是用來設定資料庫中自動增長的起點的,回為這兩能伺服器都設定了一次自動增長值2,是以它們的起點必須得不同,這樣才能避免兩台伺服器資料同步時出現主鍵沖突
replicate-do-db 指定同步的資料庫,我們隻在兩台伺服器間同步test資料庫
另:auto-increment-increment的值應設為整個結構中伺服器的總數,本案例用到兩台伺服器,是以值設為2
二、同步資料
本文是用test做的實驗,導出将test.sql檔案從254伺服器拷貝到252伺服器
備份資料前先鎖表,保證資料一緻性
mysql> flush tables with read lock;
# mysqldump -uroot -p123456 test> /tmp/test.sql;
mysql> unlock tables;
scp /tmp/test.sql [email protected]:/tmp
三、互相授權使用者(在a伺服器授權一個允許b通路的使用者,反之亦然)
在伺服器a(192.168.1.254)上
mysql> grant replication slave on *.* to 'mysync'@'192.168.1.252' identified by password '123456';
mysql> flush privileges;
在伺服器b(192.168.1.252)上
mysql> grant replication slave on *.* to 'mysync'@'192.168.1.254' identified by password '123456';
四、互告bin-log資訊
在伺服器a(192.168.1.254)
mysql> show master status;
+------------------+----------+--------------+--------------------------+
| file | position | binlog_do_db | binlog_ignore_db |
| mysql-bin.000006 | 106 | | mysql,information_schema |
在伺服器a(192.168.1.252)
| mysql-bin.000008 | 192 | | mysql,information_schema |
在a伺服器(192.168.1.254)上執行
mysql> change master to master_host='192.168.1.252',master_user='mysync',master_password='123456',master_log_file='mysql-bin.000008',master_log_pos=192;
在b伺服器(192.168.1.252)上執行
mysql> change master to master_host='192.168.1.254',master_user='mysync',master_password='123456',master_log_file='mysql-bin.000006',master_log_pos=106;
五、在兩伺服器都執行以下指令
mysql> start slave;
六、檢視狀态
mysql> show slave status\g
a伺服器(192.168.1.254)狀态如下:
slave_io_state: waiting for master to send event
master_host: 192.168.1.252
master_user: mysync
master_port: 3306
connect_retry: 60
master_log_file: mysql-bin.000008
read_master_log_pos: 192
relay_log_file: mysqld-relay-bin.000009
relay_log_pos: 337
relay_master_log_file: mysql-bin.000008
slave_io_running: yes
slave_sql_running: yes
replicate_do_db: test
b伺服器(192.168.1.252)狀态如下:
slave_io_state: waiting for master to send event
master_host: 192.168.1.254
master_log_file: mysql-bin.000006
read_master_log_pos: 106
relay_log_file: mysqld-relay-bin.000014
relay_log_pos: 251
relay_master_log_file: mysql-bin.000006
當看到了兩個yes,即:
slave_io_running: yes
slave_sql_running: yes
說明已經配置成功了
接下來看可以做一下實驗,測試一下是否同步
ps:
在測試的過程當中,我也遇到一些問題主要是兩台機器互相通信的問題
請注意,一定要保持兩台的伺服器的mysql端口都向對方打開,要不然是不能成功同步的。