本文是基于MySQL-5.7.7-rc版本,未來(lái)可能 還會(huì)發(fā)生更多變化。
這對(duì)采用分庫(kù)分表的同學(xué)絕對(duì)是個(gè)超級(jí)重磅福音。可以把多個(gè)MASTER的數(shù)據(jù)歸并到一個(gè)實(shí)例上,?有助于提高SLAVE服務(wù)器的利用率。不過(guò)如果是同一個(gè)表的話,會(huì)存在主鍵和唯一索引沖突的風(fēng)險(xiǎn),需要提前做好規(guī)劃。
MySQL 5.7的多源復(fù)制采用多通道的模式,例如用以下方法可以創(chuàng)建多個(gè)復(fù)制通道,將多個(gè)MASTER上的數(shù)據(jù)復(fù)制到同一個(gè)SLAVE節(jié)點(diǎn)中去:
-- 需要先把 MASTER_INFO_REPOSITORY 和 RELAY_LOG_INFO_REPOSITORY 改成 TABLE 模式
[yejr@imysql.com]> SET GLOBAL MASTER_INFO_REPOSITORY = "TABLE";
Query OK, 0 rows affected (0.00 sec)
[yejr@imysql.com]> SET GLOBAL RELAY_LOG_INFO_REPOSITORY = "TABLE";
Query OK, 0 rows affected (0.00 sec)
-- 創(chuàng)建第一個(gè)復(fù)制通道
[yejr@imysql.com]> CHANGE MASTER TO MASTER_HOST='1.2.3.4', MASTER_USER='user', MASTER_PASSWORD='repl' FOR CHANNEL 'MASTER-01';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
-- 創(chuàng)建第二個(gè)復(fù)制通道
[yejr@imysql.com]> CHANGE MASTER TO MASTER_HOST='2.3.4.5', MASTER_USER='user', MASTER_PASSWORD='repl' FOR CHANNEL 'MASTER-02';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
-- 查看第二個(gè)復(fù)制通道的狀態(tài)
[yejr@imysql.com]> SHOW SLAVE STATUS FOR CHANNEL 'MASTER-02';
*************************** 1\. row ***************************
Slave_IO_State:
Master_Host: 2.3.4.5
Master_User: user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: yejr-relay-bin-master@002d02.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 0
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set: f0df162a-1a39-11e5-883a-782bcb65f419:1-11025782
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name: master-02
1 row in set (0.00 sec)
其他和復(fù)制相關(guān)的SQL指令和以往也基本一樣,只需在加上?FOR CHANNEL ‘CHANNEL-NAME’?子句即可。
此外,還支持在線修改replication filter規(guī)則,不過(guò)不是太建議使用filter規(guī)則,因此不重點(diǎn)介紹了。執(zhí)行下面的SQL命令可以完成filter規(guī)則修改:
[yejr@imysql.com]>?CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (d1), REPLICATE_IGNORE_DB = (d2);
在5.6版本中實(shí)現(xiàn)了SCHEMA級(jí)別的并行復(fù)制,不過(guò)意義不大,因?yàn)槲覀兙€上大部分實(shí)例的讀寫(xiě)壓力基本集中在某幾個(gè)數(shù)據(jù)表,基本無(wú)助于緩解復(fù)制延遲問(wèn)題。倒是MariaDB的多線程并行復(fù)制大放異彩,有不少人因?yàn)檫@個(gè)特性選擇MariaDB(比如我也是其一,呵呵)。
MySQL 5.7 MTS支持兩種模式,一種是和5.6一樣,另一種則是基于binlog group commit實(shí)現(xiàn)的多線程復(fù)制,也就是MASTER上同時(shí)提交的binlog在SLAVE端也可以同時(shí)被apply,實(shí)現(xiàn)并行復(fù)制。關(guān)于MTS的更多詳細(xì)介紹可以查看姜承堯的分享?MySQL 5.7 并行復(fù)制實(shí)現(xiàn)原理與調(diào)優(yōu),我這里就不重復(fù)說(shuō)了。
值得一提的是,經(jīng)過(guò)對(duì)比測(cè)試,5.7采用新的并行復(fù)制后,仍然會(huì)存在一定程度的延遲,只不過(guò)相比5.6版本減少了86%,相比MariaDB的并行復(fù)制延遲也小不少。
下一期,我們繼續(xù)講講5.7的其他新特性。
更多建議: