1. 程式人生 > >mysql master-slave搭建測試,附帶雙master FailOver導致資料結果不一致的一些想法

mysql master-slave搭建測試,附帶雙master FailOver導致資料結果不一致的一些想法

mysql主從複製:

首先修改master,slave中的配置檔案,my.ini或my.conf,都加在[mysqld]域中;

master中的配置:

#replication option
server-id=1
log-bin=mysql-bin.log

slave中的配置:
#log-bin path slave option
server-id=2
log-bin="G:/MySQLbinlog/mysql-bin"
log-bin-index="G:/MySQLbinlog/mysql-bin.index"
log-slave-updates=1
relay-log="G:/MySQLbinlog/mysql-relay-bin"
relay-log-index="G:/MySQLbinlog/mysql-relay-bin.index"
max-binlog-size=200m
#這個是資料庫啟動的時候slave執行緒不自動啟動,而是需要自己手動設定,給予自己一個修復的時間。如果在配置檔案中把change master to的資訊設死,則每次啟動的時候可以
skip-slave-start=1
自動開啟複製執行緒
read-only=1 
slave-skip-errors=1062,1053
#replicate-do-db=rep_test_db   這些複製過濾條件有時候不起作用,請慎用
#replicate-do-table=rep_test_db.user
#replicate-wild-do-table=rep_testdb.%
#replicate_ignore_table
#replicate_wild_ignore_table


然後開始下面操作:

進入master住進鎖表:flush tables with read lock;

然後在沒有寫的情況下到處資料庫邏輯備份(全部的話就是--all-databases)
D:\MySQLDATA\data>mysqldump --master-data --single-transaction -uroot -ptsixi rep_test_db > d:/dbbackup.sql

將該備份中的change master部分登出。


在slave端匯入使兩邊資料同步
mysql -uroot -plumi rep_test_db < G:\update\dbbackup2.sql


做change master命令將slave指向master
mysql> change master to
    -> master_host='220.167.54.227',
    -> master_user='repl',
    -> master_password='tsixi',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=2179,
    -> master_port=32230;
Query OK, 0 rows affected (0.20 sec)


啟動複製程序
mysql> start slave(要停止這兩個執行緒就用start stop)
Query OK, 0 rows affected (0.00 sec)


然後進入master解鎖:
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)


slave端:
mysql> show processlist\G
*************************** 3. row ***************************
     Id: 4
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 122
  State: Waiting for master to send event
   Info: NULL
*************************** 4. row ***************************
     Id: 5
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 117
  State: Has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL
4 rows in set (0.00 sec)


master端:
mysql> show processlist\G;
*************************** 5. row ***************************
     Id: 25
   User: repl
   Host: 118.113.221.173:55464
     db: NULL
Command: Binlog Dump
   Time: 166
  State: Has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL

*************************** 6. row ***************************

測試一切OK,如果想嘗試雙master搭建的話,在上面的基礎上簡單的修改就可以了~!

雙master主要是為了一個寫庫的時候可以快速的採用一個從庫來替代。當然不能兩邊同時寫,因為複製是非同步的,可能造成資料非一致性問題。

如果採用簡單的HA方案,兩個master。master1,master2。1掛了的話,自動切換到2,1好了又切換回1。

但始終感覺這個中間有問題。比如1掛的時候你切到了2,在2中執行update table1 set name="2" ,這句話執行完後,還沒有複製到1中,這時候1好了

,又一句sql執行update table1 set name="1ok了",當這句話執行完後,master1的複製才過來,執行了update table1 set name="2" ,。這時候master2

的name就變成了"2"了。這樣明顯跟我們的期望是不相符的。

目前只想出來兩種方法減少這種情況的發生:

1 -   就是切過去了,就不要再自動切回來了。。。目前有這種簡單的HA現成解決方案麼?試了amoeba和cobarClient,都給自動切回來了。。。。

2  - 切回來的時候,先鎖住寫庫,確保複製全部完成之後,再切回來,放開鎖。這種相當於停機了,不大可取。

3 -  儘量減少複製延遲。