MySQL Dual-Master 雙向同步

 
本文介紹的Mysql Dual-Master 複製實施方法可能不是最完美、最強大的。但是在我的應用環境下能很好的滿足各項需求。

本文基於我們僅僅使用兩臺MySQL服務器的情況下,但是你會發現文章中介紹的方法可以很方便的應用於多臺服務器的環境下。同樣地,我們假設您將用於同步複製的數據庫已經在其中一臺MySQL服務器上建好了。最後,在開始所有工作之前,我們必須調整所有服務器的防火牆策略以保證彼此能訪問對方的3306端口。

環境:

操作系統:CentOS 5.4 x86

MySQL版本:5.0.77

主服務器IP:10.10.1.1

從服務器IP:10.10.1.2

實現目標:主從兩臺機器MySQL數據雙向同步

數據庫準備工作
分別在兩臺服務器上執行鎖表操作:
shell>mysql -u [user] -p  -e "FLUSH TABLES WITH READ LOCK"
將需要配置同步的數據庫Dump出來:
shell>mysqldump -u [user] -p -c [database name] > /tmp/dumpeddb.sql
將dump出來的文件拷貝到另外一臺服務器上,方法隨意。我用scp
shell>scp -P 22000 /tmp/dumpeddb.sql user@anothermaster:/tmp
如果這臺服務器已經建好庫了,那麼可以直接導數據:
shell>mysql -u [user] -p -D [database name] < /tmp/dumpeddb.sql
如果還沒有該庫,那麼再導數據之前我們需要先建庫。
shell>mysql -u [user] -p -e 'CREATE DATABASE "databasename"'
最後我們需要在兩臺服務器上別分創建一個賬號,用來同步數據。
shell>mysql -u root -p
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT, SUPER ON databasename.* To replicate IDENTIFIED BY 'replpassword';
mysql>FLUSH PRIVILEGES;
修改my.cnf
首先,我們需求修改bind-address選項。保證mysql監聽在一個可以被對方訪問到的網口上,當然如果你監聽在0.0.0.0上就不會有這個問題了,但是這麼做通常會帶來一些安全問題。我一般會讓它監聽內網地址
bind-address = 10.10.1.1(主服務器)
bind-address = 10.10.1.2(從服務器)
將以下內容加到主服務器的my.cnf裏
  1. server-id = 1
  2. auto-increment-increment = 2
  3. auto-increment-offset = 1
  4. log-bin = /var/log/mysql/log-bin.log
  5. binlog-do-db = databasename
  6. binlog-ignore-db = mysql
  7. binlog-ignore-db = test
server-id服務器標識,我們必須給兩臺機器分配不同的server-id.
log-bin,開啓mysql的binlog(二進制日誌).開啓後mysql會將所有的修改操作記錄到binlog中,可以用mysqlbinlog工具查看,裏面都是一條一條的sql語句。slave I/O會讀取主機的binlog,然後把讀取到的內容在slave上執行,這就是mysql主從同步的基本原理。
binlog-do-db,設置哪些數據庫寫binlog。
binlog-ingore-db,設置哪些數據庫不寫binlog。
通過這兩個選項我們就可以設置哪些庫同步哪些庫不同步。
auto-increment-incrment和auto-increment-offset這兩個選項的設置是爲了防止2臺服務器互相複製產生關鍵字段的衝突。如果他們用不同的便宜,比如一個按照1,3,5,7增加而另外一臺按照那個2,4,6,8增加。auto-incrment-increment=2自動增加的字段每次步進是2,auto-increment-offset=1自動增加的字段的初始值是1
將以下內容添加到從服務器
  1. server-id = 2
  2. auto-increment-increment = 2
  3. auto-increment-offset = 2
  4. log-bin = /var/log/mysql/log-bin.log
  5. binlog-do-db = databasename
  6. binlog-ignore-db = mysql
  7. binlog-ignore-db = test
注意這裏auto_increment_offset選項的值跟主服務器上不一樣。
分別重啓mysql服務
shell>/etc/init.d/mysql restart
或者
shell>mysql -u root -p -e "RESET MASTER"
配置主機到從機同步
記錄主機的master狀態
mysql> show master status\G
*************************** 1. row ***************************
            File: log-bin.log.000001
        Position: 98
    Binlog_Do_DB: databasename
Binlog_Ignore_DB: mysql,test
1 row in set (0.00 sec)
根據主機顯示結果在從機上配置master參數
mysql>CHANGE MASTER TO
    ->     MASTER_HOST='10.10.1.1',
    ->     MASTER_USER='replicate',
    ->     MASTER_PASSWORD='replpassword',
    ->     MASTER_LOG_FILE='log-bin.log.000001',
    ->     MASTER_LOG_POS=98;
其中MASTER_HOST、MASTER_USER、MASTER_PASSWORD這些參數可以在my.cnf裏。但是我個人更喜歡在mysql裏配置,一方面安全點,另一方面MASTER_LOG_FILE和MASTER_LOG_POS這些參數還是得在mysql裏面配置,不如一塊在myql裏配置來的方便。
配置從機到主機同步(上一節的步驟反過來執行一遍)。
記錄從機上的master狀態
mysql> show master status\G
*************************** 1. row ***************************
            File: log-bin.log.000001
        Position: 98
    Binlog_Do_DB: databasename
Binlog_Ignore_DB: mysql,test
1 row in set (0.00 sec)
根據從機顯示的結果在主機上配置master參數
mysql>CHANGE MASTER TO
    ->     MASTER_HOST='10.10.1.2',
    ->     MASTER_USER='replicate',
    ->     MASTER_PASSWORD='replpassword',
    ->     MASTER_LOG_FILE='log-bin.log.000001',
    ->     MASTER_LOG_POS=98
分別開啓slave線程
mysql>start slave;
解鎖
mysql>unlock tables;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章