主從服務(wù)器利用MySQL的二進(jìn)制日志文件,實(shí)現(xiàn)數(shù)據(jù)同步。二進(jìn)制日志由主服務(wù)器產(chǎn)生,從服務(wù)器響應(yīng)獲取同步數(shù)據(jù)庫。
1.1 mysql支持的復(fù)制類型:
(1):基于語句的復(fù)制: 在主服務(wù)器上執(zhí)行的SQL語句,在從服務(wù)器上執(zhí)行同樣的語句。MySQL默認(rèn)采用基于語句的復(fù)制,效率比較高。 一旦發(fā)現(xiàn)沒法精確復(fù)制時(shí), 會(huì)自動(dòng)選著基于行的復(fù)制。
(2):基于行的復(fù)制:把改變的內(nèi)容復(fù)制過去,而不是把命令在從服務(wù)器上執(zhí)行一遍. 從mysql5.0開始支持 ‘’
(3):混合類型的復(fù)制: 默認(rèn)采用基于語句的復(fù)制,一旦發(fā)現(xiàn)基于語句的無法精確的復(fù)制時(shí),就會(huì)采用基于行的復(fù)制。
1.2 . 復(fù)制解決的問題
MySQL復(fù)制技術(shù)有以下一些特點(diǎn):
(1) 數(shù)據(jù)分布 (Data distribution )
(2) 負(fù)載平衡(load balancing)
(3) 備份(Backups)
(4) 高可用性和容錯(cuò)行 High availability and failover
復(fù)制如何工作
(1) master將改變記錄到二進(jìn)制日志(binary log)中(這些記錄叫做二進(jìn)制日志事件,binary log events);
(2) slave將master的binary log events拷貝到它的中繼日志(relay log);
(3) slave重做中繼日志中的事件,將改變反映它自己的數(shù)據(jù)。
‘’
基于記錄的復(fù)制(Row-Based Replication)
MySQL增加基于記錄的復(fù)制,在二進(jìn)制日志中記錄下實(shí)際數(shù)據(jù)的改變,這與其它一些DBMS的實(shí)現(xiàn)方式類似。這種方式有優(yōu)點(diǎn),也有缺點(diǎn)。優(yōu)點(diǎn)就是可以對任何語句都能正確工作,一些語句的效率更高。主要的缺點(diǎn)就是二進(jìn)制日志可能會(huì)很大,而且不直觀,所以,你不能使用mysqlbinlog來查看二進(jìn)制日志。
對于一些語句,基于記錄的復(fù)制能夠更有效的工作,如:
mysql> INSERT INTO summary_table(col1, col2, sum_col3)
-> SELECT col1, col2, sum(col3)
-> FROM enormous_table
-> GROUP BY col1, col2;
假設(shè),只有三種唯一的col1和col2的組合,但是,該查詢會(huì)掃描原表的許多行,卻僅返回三條記錄。此時(shí),基于記錄的復(fù)制效率更高。
4、復(fù)制的常用拓?fù)浣Y(jié)構(gòu)
復(fù)制的體系結(jié)構(gòu)有以下一些基本原則:
(1) 每個(gè)slave只能有一個(gè)master;
(2) 每個(gè)slave只能有一個(gè)唯一的服務(wù)器ID;
(3) 每個(gè)master可以有很多slave;
(4) 如果你設(shè)置log_slave_updates,slave可以是其它slave的master,從而擴(kuò)散master的更新。
4.1、單一master和多slave
如果寫操作較少,而讀操作很時(shí),可以采取這種結(jié)構(gòu)。你可以將讀操作分布到其它的slave,從而減小master的壓力。但是,當(dāng)slave增加到一定數(shù)量時(shí),slave對master的負(fù)載以及網(wǎng)絡(luò)帶寬都會(huì)成為一個(gè)嚴(yán)重的問題。
這種結(jié)構(gòu)雖然簡單,但是,它卻非常靈活,足夠滿足大多數(shù)應(yīng)用需求。一些建議:
(1) 不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存儲引擎);
(2) 用一個(gè)slave作為備用master,只進(jìn)行復(fù)制;
(3) 用一個(gè)遠(yuǎn)程的slave,用于災(zāi)難恢復(fù);
4.2、主動(dòng)模式的Master-Master(Master-Master in Active-Active Mode)
Master-Master復(fù)制的兩臺服務(wù)器,既是master,又是另一臺服務(wù)器的slave。這樣,任何一方所做的變更,都會(huì)通過復(fù)制應(yīng)用到另外一方的數(shù)據(jù)庫中。
主動(dòng)的Master-Master復(fù)制有一些特殊的用處。例如,地理上分布的兩個(gè)部分都需要自己的可寫的數(shù)據(jù)副本。這種結(jié)構(gòu)最大的問題就是更新沖突。假設(shè)一個(gè)表只有一行(一列)的數(shù)據(jù),其值為1,如果兩個(gè)服務(wù)器分別同時(shí)執(zhí)行如下語句:
在第一個(gè)服務(wù)器上執(zhí)行:
mysql> UPDATE tbl SET col=col + 1;
在第二個(gè)服務(wù)器上執(zhí)行:
mysql> UPDATE tbl SET col=col * 2;
那么結(jié)果是多少呢?一臺服務(wù)器是4,另一個(gè)服務(wù)器是3,但是,這并不會(huì)產(chǎn)生錯(cuò)誤。
實(shí)際上,MySQL并不支持其它一些DBMS支持的多主服務(wù)器復(fù)制(Multimaster Replication),這是MySQL的復(fù)制功能很大的一個(gè)限制(多主服務(wù)器的難點(diǎn)在于解決更新沖突),但是,如果你實(shí)在有這種需求,你可以采用MySQL Cluster,以及將Cluster和Replication結(jié)合起來,可以建立強(qiáng)大的高性能的數(shù)據(jù)庫平臺。但是,可以通過其它一些方式來模擬這種多主服務(wù)器的復(fù)制。