MySQL主主複製結構區別於主從複製結構。在主主複製結構中,兩臺服務器的任何一臺上面的數據庫存發生了改變都會同步到另一臺服務器上,這樣兩臺服務器互爲主從,並且都能向外提供服務。
下面是配置步驟
需要兩臺MySQL主機做服務器:
Server-1:192.168.0.1
Server-2:192.168.0.2
一、創建並授權用戶
這一步在每一臺(主)服務器上創建一個用戶,併爲之授權,使它們可以互相訪問彼此的數據庫
在Server-1上:
創建一個充許Server-1來訪問的用戶server2,密碼爲:server2
mysql> GRANT REPLICATION SLAVE ON *.*
> TO 'server2'@'192.168.0.2' IDENTIFIED BY 'server2';
在Server-2上:
創建一個充許Server-1來訪問的用戶server1,密碼爲:server1
mysql> GRANT REPLICATION SLAVE ON *.*
> TO 'server1'@'192.168.0.1' IDENTIFIED BY 'server1';
二、修改MySQL主配置文件
在MySQL的主配置文件中修改/添加如下內容:
Server-1上:
[mysqld]
server-id = 10
log-bin = mysql-bin
replicate-do-db = mydb
auto-increment-increment = 2
auto-increment-offset = 1
# service mysqld restart
Server-2上:
[mysqld]
server-id = 20
log-bin = mysql-bin
replicate-do-db = mydb
auto-increment-increment = 2
auto-increment-offset = 2
# service mysqld restart
注:二都只有server-id不同和 auto-increment- offset不同
auto-increment-offset是用來設定數據庫中自動增長的起點的,回爲這兩能服務器都設定了一次自動增長值2,所以它們的起點必須得不同,這樣才能避免兩臺服務器數據同步時出現主鍵衝突
replicate-do-db 指定同步的數據庫,我們只在兩臺服務器間同步mydb數據庫
另:auto-increment-increment的值應設爲整個結構中服務器的總數,本案例用到兩臺服務器,所以值設爲2
三、複製其中一臺服務器的數據庫到別外一臺服務器
這一步中誰做爲源數據不重要,重要的是在正式的複製(Replication)開始之前兩臺服務都能準備的反應彼此的數據。
我們可以先從源數據庫中導出數據到備份文件,這裏我們使用mysqldump命令
以Server-1上數據庫爲源數據庫
備份數據前先鎖表,保證數據一致性
mysql> FLUSH TABLES WITH READ LOCK;
> SHOW MASTER STATUS;
+-----------------+------------+----------------+--------------------+
|File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+------------+----------------+--------------------+
|mysql-bin.000006 | 213 | | |
+-----------------+------------+----------------+--------------------+
1 row in set (0.01 sec)
該結果顯示,源服務器現在處於6號二進制文件的213位置
開始備份數據庫
# mysqldump --user=root -p mydb > /tmp/mydb.sql
備份完畢,現在可以解鎖數據庫表
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
四、將備份數據導入Server-2
先在Server-2上創建一個與mydb同名的空數據庫
# mysql
> CREATE DATABASE mydb;
>\q
# scp 192.168.0.1:/tmp/mydb.sql ./
# mysql -uroot -p mydb < /tmp/mydb.sql
此時,我們需要注意當前服務器的二進制日誌的位置
# mysql
> LOCK TALBES WITH READ LOCK;
> SHOW MASTER STATUS;
+-----------------+------------+----------------+--------------------+
|File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+------------+----------------+--------------------+
|mysql-bin.000001 | 106 | | |
+-----------------+------------+----------------+--------------------+
1 row in set (0.00 sec)
> UNLOCK TABLES;
> \q
五、互相通告二進制日誌位置
在Server-1上:
# mysql
> CHANGE MASTER TO
> MASTER_HOST='192.168.0.2',
> MASTER_USER='master1',
> MASTER_PASSWORD='master1',
> MASTER_LOG_FILE='mysql-bin.000001',
> MASTER_LOG_POS=106;
在Server-2上:
# mysql
> CHANGE MASTER TO
> MASTER_HOST='192.168.0.1',
> MASTER_USER='master2',
> MASTER_PASSWORD='master2',
> MASTER_LOG_FILE='mysql-bin.000006',
> MASTER_LOG_POS=213;
六、啓動複製(Replication)功能
在兩臺主機上分別執行
# mysql
> START SLAVE;
配置到此完成!
測試:
在任意一臺服務器上創建一個數據庫
# mysql
> CREATE DATABASE repltest;
> USE repltest;
> CREATE TABLE test(
> name char(30));
> \q
#
在另一臺服務器上查看數據庫信息:
# mysql
> SHOW DATABASES;
結果中將顯示有一個名爲replrtest的數據庫
現在趕快動手試試吧~~~