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

Mysql 複製(Replication)

一、Mysql 複製做用html

  • 負載平衡(load balancing)
  • 備份
  • 高可用性(high availability)和容錯

二、Mysql 複製原理mysql

主要有三步(以下圖):linux

master將改變記錄到二進制日誌(binary log)中(這些記錄叫作二進制日誌事件,binary log events);sql

slave將master的binary log events拷貝到它的中繼日誌(relay log);數據庫

slave重作中繼日誌中的事件,將改變它本身的數據。緩存

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

具體說明:服務器

該過程的第一部分就是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)類型

一、一主多從模式

注,由一個master和一個slave組成複製系統是最簡單的狀況。Slave之間並不相互通訊,只能與master進行通訊。

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

具體說明:

若是寫操做較少,而讀操做不少時,能夠採起這種架構。你能夠將讀操做分佈到其它的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,不然將致使下游的從服務器沒法更新複製。

二、雙主模式

注,Master-Master複製的兩臺服務器,既是master,又是另外一臺服務器的slave。
MySQL系列連載之主從複製原理MySQL系列連載之主從複製原理

具體說明:

主的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的缺點,實際上,這是一種具備容錯和高可用性的系統。

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

四、帶從服務器的Master-Master結構(Master-Master with Slaves)

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

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

總結:通常經常使用的兩種複製類型一種是主從模式,另外一種是一主多從模式。在這咱們主要講解主從模式複製。

本文地址:http://www.linuxprobe.com/mysql-replication-theory.html

相關文章
相關標籤/搜索