《MySQL系列連載之主從復制原理》要點:
本文介紹了MySQL系列連載之主從復制原理,希望對您有用。如果有疑問,可以聯系我們。
如果您在本文遇到任何問題或疑問請到QQ群中與我們交流.也可在下方進行評論.我將在第一時間和您進行交流,共同學習.
QQ群:201777608、526871767、1689067(加群時注明:運維派)
負載平衡(load balancing)
備份
高可用性(high availability)和容錯
主要有三步(如下圖):
master將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events);
slave將master的binary log events拷貝到它的中繼日志(relay log);
slave重做中繼日志中的事件,將改變它自己的數據.
具體說明:
該過程的第一部分就是master記錄二進制日志.在每個事務更新數據完成之前,master在二進制日志記錄這些改變.MySQL將事務串行的寫入二進制日志,即使事務中的語句都是交叉執行的.在事件寫入二進制日志完成后,master通知存儲引擎提交事務.
下一步就是slave將master的binary log拷貝到它自己的中繼日志. 首先,slave開始一個工作線程——I/O線程.I/O線程在master上打開一個普通的連接,然后開始binlog dump process. Binlog dump process從master的二進制日志中讀取事件,如果已經跟上master,它會休眠并等待master產生新的事件.I/O線程將這些事件寫入中繼日志.
SQL slave thread處理該過程的最后一步.SQL線程從中繼日志讀取事件,更新slave的數據,使其與master中的數據一致.只要該線程與I/O線程保持一致,中繼日志通常會位于OS的緩存中,所以中繼日志的開銷很小.
此外,在master中也有一個工作線程:和其它MySQL的連接一樣,slave在master中打開一個連接也會使得master開始一個線程.復制過程有一個很重要的限制——復制在slave上是串行化的,也就是說master上的并行更新操作不能在slave上并行操作.所以slave上數據一般要慢于master上數據.即master與slave之間的數據在一定時間內會不同步.
注,由一個master和一個slave組成復制系統是最簡單的情況.Slave之間并不相互通信,只能與master進行通信.
具體說明:
如果寫操作較少,而讀操作很多時,可以采取這種架構.你可以將讀操作分布到其它的slave,從而減小master的壓力.
但是,當slave增加到一定數量時,slave對master的負載以及網絡帶寬都會成為一個嚴重的問題.
這種架構雖然簡單,但是,它卻非常靈活,足夠滿足大多數應用需求.
一些建議:
不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存儲引擎)
用一個slave作為備用master,只進行復制
用一個遠程的slave,用于災難恢復
發送復制事件到其它slave,當設置log_slave_updates時,你可以讓slave扮演其它slave的master.
此時,slave把SQL線程執行的事件寫進自己的二進制日志(binary log),然后,它的slave可以獲取這些事件并執行它
MySQL級聯復制(A->B->C)log_slave_updates
MySQL主從結構實際中是用到最多的一種架構.
新上的兩臺服務器B和C,要替換掉之前舊的服務器A,同時,B和C是新的主從關系.因此,配置成級聯復制,來遷移數據,也方便切換.
架構圖如下:
master A ——> slave B ——> slave C
有這么情況發生了,服務器B可以正常復制服務器A的數據,服務器B和C主從狀態Slave_IO_Running和Slave_SQL_Running都是yes的,但是服務器C卻無法復制新的數據.
原因分析:
1. 檢查服務器B有沒有開啟二進制日志log_bin
2. log_slave_updates是否啟用
log_slave_updates是將從服務器從主服務器收到的更新記入到從服務器自己的二進制日志文件中.
上面的問題是由于沒有啟用log_slave_updates?。健。睂е碌?
總結:
因此,對于mysql級聯復制,上游的從服務器不僅僅要開啟log_bin還要開啟log_slave_updates,否則將導致下游的從服務器無法更新復制.
注,Master-Master復制的兩臺服務器,既是master,又是另一臺服務器的slave.
具體說明:
主的Master-Master復制有一些特殊的用處.例如,地理上分布的兩個部分都需要自己的可寫的數據副本.
這種結構最大的問題就是更新沖突.假設一個表只有一行(一列)的數據,其值為1,如果兩個服務器分別同時執行如下語句:
在第一個服務器上執行:
mysql> UPDATE tbl SET col=col + 1;
在第二個服務器上執行:
mysql> UPDATE tbl SET col=col * 2;
那么結果是多少呢?一臺服務器是4,另一個服務器是3,但是,這并不會產生錯誤.
實際上,MySQL并不支持其它一些DBMS支持的多主服務器復制(Multimaster Replication),
這是MySQL的復制功能很大的一個限制(多主服務器的難點在于解決更新沖突),但是,如果你實在有這種需求,
你可以采用MySQL Cluster,以及將Cluster和Replication結合起來,可以建立強大的高性能的數據庫平臺.
但是,可以通過其它一些方式來模擬這種多主服務器的復制.
注,這是master-master結構變化而來的,它避免了M-M的缺點,實際上,這是一種具有容錯和高可用性的系統.
注,這種結構的優點就是提供了冗余.在地理上分布的復制結構,它不存在單一節點故障問題,而且還可以將讀密集型的請求放到slave上.
總結:一般常用的兩種復制類型一種是主從模式,另一種是一主多從模式.在這我們主要講解主從模式復制.
第一篇 MySQL系列連載 之日志類型(1)
第二篇 MySQL系列連載 之主從復制原理(2)
第三篇 MySQL系列連載 之多實例主從(異步)復制實踐(3)
第四篇 Mysql系列連載 之多實例主從復制(半同步)復制實踐(4)
第五篇 MySQL系列連載 之復制工具(percona-toolkit)實踐(5)
感謝您的閱讀.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4253.html