mysql master-slave搭建測試,附帶雙master FailOver導致資料結果不一致的一些想法
阿新 • • 發佈:2019-01-25
mysql主從複製:
首先修改master,slave中的配置檔案,my.ini或my.conf,都加在[mysqld]域中;
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
首先修改master,slave中的配置檔案,my.ini或my.conf,都加在[mysqld]域中;
master中的配置:
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 - 儘量減少複製延遲。