主從服務器利用MySQL的二進制日志文件佛玄,實現(xiàn)數(shù)據(jù)同步硼一。二進制日志由主服務器產(chǎn)生,從服務器響應獲取同步數(shù)據(jù)庫梦抢。
1.1 mysql支持的復制類型:
(1):基于語句的復制: 在主服務器上執(zhí)行的SQL語句般贼,在從服務器上執(zhí)行同樣的語句。MySQL默認采用基于語句的復制惑申,效率比較高具伍。 一旦發(fā)現(xiàn)沒法精確復制時, 會自動選著基于行的復制圈驼。
(2):基于行的復制:把改變的內(nèi)容復制過去,而不是把命令在從服務器上執(zhí)行一遍. 從mysql5.0開始支持 ‘’
(3):混合類型的復制: 默認采用基于語句的復制望几,一旦發(fā)現(xiàn)基于語句的無法精確的復制時绩脆,就會采用基于行的復制。
1.2 . 復制解決的問題
MySQL復制技術有以下一些特點:
(1) 數(shù)據(jù)分布 (Data distribution )
(2) 負載平衡(load balancing)
(3) 備份(Backups)
(4) 高可用性和容錯行 High availability and failover
復制如何工作
(1) master將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件橄抹,binary log events)靴迫;
(2) slave將master的binary log events拷貝到它的中繼日志(relay log);
(3) slave重做中繼日志中的事件楼誓,將改變反映它自己的數(shù)據(jù)玉锌。
‘’
基于記錄的復制(Row-Based Replication)
MySQL增加基于記錄的復制,在二進制日志中記錄下實際數(shù)據(jù)的改變疟羹,這與其它一些DBMS的實現(xiàn)方式類似主守。這種方式有優(yōu)點禀倔,也有缺點。優(yōu)點就是可以對任何語句都能正確工作参淫,一些語句的效率更高救湖。主要的缺點就是二進制日志可能會很大,而且不直觀涎才,所以鞋既,你不能使用mysqlbinlog來查看二進制日志。
對于一些語句耍铜,基于記錄的復制能夠更有效的工作邑闺,如:
mysql> INSERT INTO summary_table(col1, col2, sum_col3)
-> SELECT col1, col2, sum(col3)
-> FROM enormous_table
-> GROUP BY col1, col2;
假設,只有三種唯一的col1和col2的組合棕兼,但是检吆,該查詢會掃描原表的許多行,卻僅返回三條記錄程储。此時蹭沛,基于記錄的復制效率更高。
4章鲤、復制的常用拓撲結(jié)構(gòu)
復制的體系結(jié)構(gòu)有以下一些基本原則:
(1) 每個slave只能有一個master摊灭;
(2) 每個slave只能有一個唯一的服務器ID;
(3) 每個master可以有很多slave败徊;
(4) 如果你設置log_slave_updates帚呼,slave可以是其它slave的master,從而擴散master的更新皱蹦。
4.1煤杀、單一master和多slave
如果寫操作較少,而讀操作很時沪哺,可以采取這種結(jié)構(gòu)沈自。你可以將讀操作分布到其它的slave,從而減小master的壓力辜妓。但是枯途,當slave增加到一定數(shù)量時,slave對master的負載以及網(wǎng)絡帶寬都會成為一個嚴重的問題籍滴。
這種結(jié)構(gòu)雖然簡單酪夷,但是,它卻非常靈活孽惰,足夠滿足大多數(shù)應用需求晚岭。一些建議:
(1) 不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存儲引擎)勋功;
(2) 用一個slave作為備用master坦报,只進行復制库说;
(3) 用一個遠程的slave,用于災難恢復燎竖;
4.2璃弄、主動模式的Master-Master(Master-Master in Active-Active Mode)
Master-Master復制的兩臺服務器,既是master构回,又是另一臺服務器的slave夏块。這樣,任何一方所做的變更纤掸,都會通過復制應用到另外一方的數(shù)據(jù)庫中脐供。
主動的Master-Master復制有一些特殊的用處。例如借跪,地理上分布的兩個部分都需要自己的可寫的數(shù)據(jù)副本政己。這種結(jié)構(gòu)最大的問題就是更新沖突。假設一個表只有一行(一列)的數(shù)據(jù)掏愁,其值為1歇由,如果兩個服務器分別同時執(zhí)行如下語句:
在第一個服務器上執(zhí)行:
mysql> UPDATE tbl SET col=col + 1;
在第二個服務器上執(zhí)行:
mysql> UPDATE tbl SET col=col * 2;
那么結(jié)果是多少呢?一臺服務器是4果港,另一個服務器是3沦泌,但是,這并不會產(chǎn)生錯誤辛掠。
實際上谢谦,MySQL并不支持其它一些DBMS支持的多主服務器復制(Multimaster Replication),這是MySQL的復制功能很大的一個限制(多主服務器的難點在于解決更新沖突)萝衩,但是回挽,如果你實在有這種需求,你可以采用MySQL Cluster猩谊,以及將Cluster和Replication結(jié)合起來千劈,可以建立強大的高性能的數(shù)據(jù)庫平臺。但是预柒,可以通過其它一些方式來模擬這種多主服務器的復制队塘。