1. 程式人生 > >MySQL系列連載之主從複製原理

MySQL系列連載之主從複製原理

導讀

如果您在本文遇到任何問題或疑問請到QQ群中與我們交流。也可在下方進行評論。我將在第一時間和您進行交流,共同學習。
QQ群:201777608、526871767、1689067(加群時註明:運維派)

Mysql 複製(Replication)

1、Mysql 複製作用

負載平衡(load balancing)

備份

高可用性(high availability)和容錯

2、Mysql 複製原理

主要有三步(如下圖):

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之間的資料在一定時間內會不同步。

Mysql 複製(Replication)型別

1、一主多從模式

注,由一個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 = 1導致的。

總結:

因此,對於mysql級聯複製,上游的從伺服器不僅僅要開啟log_bin還要開啟log_slave_updates,否則將導致下游的從伺服器無法更新複製。

2、雙主模式

注,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結合起來,可以建立強大的高效能的資料庫平臺。

但是,可以通過其它一些方式來模擬這種多主伺服器的複製。

3、主從模式

注,這是master-master結構變化而來的,它避免了M-M的缺點,實際上,這是一種具有容錯和高可用性的系統。

4、帶從伺服器的Master-Master結構(Master-Master with Slaves)

注,這種結構的優點就是提供了冗餘。在地理上分佈的複製結構,它不存在單一節點故障問題,而且還可以將讀密集型的請求放到slave上。

總結:一般常用的兩種複製型別一種是主從模式,另一種是一主多從模式。在這我們主要講解主從模式複製。

後記

第一篇 MySQL系列連載 之日誌型別(1)

第二篇 MySQL系列連載 之主從複製原理(2)

第三篇 MySQL系列連載 之多例項主從(非同步)複製實踐(3)

第四篇 Mysql系列連載 之多例項主從複製(半同步)複製實踐(4)

第五篇 MySQL系列連載 之複製工具(percona-toolkit)實踐(5)

感謝您的閱讀。