mysql系列之複製1----原理篇

來源:互聯網
上載者:User

標籤:mysql   主從   主主   複製   

MySQL 複製介紹:

       MySQL支援單向、非同步複製,複製過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。

       MySQL主伺服器將更新寫入二進位記錄檔,並維護檔案的一個索引以追蹤記錄檔迴圈。這些日誌可以記錄發送到從伺服器的更新。當一個從伺服器串連主伺服器時,它通知主伺服器從伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖並等待主伺服器通知新的更新。

       在當前的生產工作中,大多數應用的 MySQL 主從同步都是非同步複製方式,即不是嚴格即時的資料同步。

       如果你想要設定鏈式複製伺服器,從伺服器本身也可以充當主伺服器。

       需要注意的是,當你在進行複製時,所有對複製中的表的更新必須在主伺服器上進行,這樣做的目的是為了避免使用者對主伺服器上的表進行的更新與對從伺服器上的表所進行的更新之間產生衝突。



MySQL複製架構介紹

       MySQL的複製架構除了上面說的主從複製(同步)之外,還有主主複製(同步)以及多主環狀複製(同步)。

       假設,我們使用了環狀或者鏈式級聯複製,那麼我們的從(Slave)伺服器本身除了充當從伺服器之外,還需要同時充當其下面從伺服器的主伺服器。

       相關主從複製架構,主主複製架構以及環狀、鏈式級聯複製架構圖,我們可以看下面的圖例:

1、單向主從同步邏輯架構圖

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/41/01/wKiom1PP5duCZvPUAAD_TqGT-V0938.jpg" title="單向主~1.png" alt="wKiom1PP5duCZvPUAAD_TqGT-V0938.jpg" />

2、雙向主主同步邏輯架構圖

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/41/01/wKiom1PP5ePg3n7hAADHqj0fu24557.jpg" title="雙向主~1.png" alt="wKiom1PP5ePg3n7hAADHqj0fu24557.jpg" />

3、線性級聯單向雙主同步邏輯架構圖

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/41/01/wKioL1PP5weBmc2AAAEGGx-UnBI747.jpg" title="線性級~1.png" alt="wKioL1PP5weBmc2AAAEGGx-UnBI747.jpg" />

4、環狀級聯單向多主同步邏輯架構圖

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/41/01/wKioL1PP5xORuzmaAAFEC8hKDXU777.jpg" title="clipboard.png" alt="wKioL1PP5xORuzmaAAFEC8hKDXU777.jpg" />

5、環狀級聯單向多主多從同步邏輯架構圖

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/41/01/wKioL1PP5zayhZvqAAIke6ejkwQ489.jpg" title="clipboard2.png" alt="wKioL1PP5zayhZvqAAIke6ejkwQ489.jpg" />




MySQL 複製的優勢:

這裡主要以 主從複製 的為例:

MySQL 主從複製有利於增加整個資料庫的健壯性、提升訪問速度,並且易於維護管理。

1、增加健壯性

      主伺服器/從伺服器設定增加了健壯性。主伺服器出現問題時,你可以切換到從伺服器作為備份。

2、提升訪問速度

       通過在主伺服器和從伺服器之間切分處理客戶查詢的負荷,可以得到更好的客戶回應時間。SELECT 查詢可以發送到從伺服器以降低主伺服器的查詢處理負荷。但修改資料的語句仍然應發送到主伺服器,以便主伺服器和從伺服器保持同步。如果非更新查詢為主,該負載平衡策略很有效,但一般是更新查詢。這也正是我們生產常用的讀寫分離。

3、易於維護管理

       公司內部開發和維護人員,可以在一台從伺服器上做後台訪問、資料分析和指令碼操作,特別是使用一個從伺服器執行備份,這樣就不會干擾主伺服器的運行效能。在備份過程中,主伺服器可以繼續處理更新操作。



MySQL 複製的應用情境:

這裡還是主要以 主從複製 的生產應用情境為例:

1)主從伺服器互為備份

       主從伺服器架構的設定,可以大大的加強資料庫結構描述的健壯性。例如:當主伺服器出現問題時,我們可以人工或自動切換到從伺服器繼續提供服務。

 2)主從伺服器讀寫分離,分擔網站壓力

       主從伺服器架構可通過程式或代理軟體對使用者(用戶端)的請求實現讀寫分離,即通過在從伺服器上僅僅處理使用者的select查詢請求,降低使用者查詢回應時間及讀寫同時在主伺服器帶來的壓力。對於更新的資料(update,insert,delete)仍然交給主伺服器處理,確保主伺服器和從伺服器保持即時同步。

       如果網站是以非更新(以瀏覽為主)為主的業務,如部落格或者首頁展示等業務,查詢請求比較多,此時從伺服器的讀寫分離、負載平衡策略就會非常有效,這就是讀寫分離資料庫結構了。

3)根據伺服器拆分業務獨立並分擔壓力

       生產中可以把幾個不同的從伺服器,根據公司的業務進行拆分。例如:有為外部使用者提供查詢服務的從伺服器,有DBA用來備份的從伺服器,還有提供公司內部人員訪問的後台、指令碼,日誌分析及開發人員服務的從伺服器。這樣的拆分不僅會減輕主伺服器的壓力,而且使對外使用者瀏覽、對內處理公司內部使用者業務以及 DBA 備份業務互不影響。

請看如下主從架構生產環境從伺服器分業務拆分使用案例:

master ┌ --> Slave1 --> 對外部使用者提供服務(瀏覽文章、遊覽部落格、瀏覽文章)            ├ --> Slave2 --> 對外部使用者提供服務(瀏覽文章、遊覽部落格、瀏覽文章)            ├ --> Slave3 --> 對外部使用者提供服務(瀏覽文章、遊覽部落格、瀏覽文章)            ├ --> Slave4 --> 對內部管理員提供服務(後台訪問、指令碼任務、資料分析、開發人員瀏覽)            └ --> Slave5 --> 開啟從伺服器 binlog 功能,可實現增量備份及恢複


MySQL 資料複製的原理

       MySQL 複製基於主伺服器在二進位日誌中跟蹤所有對資料庫的更改(更新、刪除等等)。因此,要進行複製,必須在主伺服器上啟用二進位日誌。

       每個從伺服器從主伺服器接收主伺服器已經記錄到其二進位日誌的儲存的更新,以便從伺服器可以對其資料拷貝執行相同的更新。

       認識到二進位日誌只是一個從啟用二進位日誌的固定時間點開始的記錄非常重要。任何設定的從伺服器需要主伺服器上的(在主伺服器上啟用二進位日誌時的)資料庫拷貝。如果啟動從伺服器時,其資料庫與主伺服器上的啟動二進位日誌時的狀態不相同,從伺服器很可能失敗。

       將主伺服器的資料拷貝到從伺服器的常用途徑是,使用mysqldump對主伺服器上的SQL進行轉儲,然後在從伺服器上進行恢複。需要注意的是,在主伺服器使用mysqldump進行SQL轉儲之前,需要進行鎖表操作,並記錄當時的binlog日誌及位置點!

       MySQL資料複製的原理圖大致如下:(此圖來自於高效能MySQL這本書)

650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/41/01/wKiom1PP5nygaXkgAAF12FAKWY0875.jpg" title="clipboar4d.png" alt="wKiom1PP5nygaXkgAAF12FAKWY0875.jpg" />

從,我們可以看出 MySQL 資料庫的複製需要啟動三個線程來實現:

       其中一個在主伺服器上,另兩個在從伺服器上。

1、當從伺服器執行 START SLAVE 時,就表示開啟主從複製開關

2、此時,從伺服器本身會建立一個 I/O 線程,通過主伺服器上授權的複製使用者權限請求串連主伺服器,並請求從指定 Binlog 記錄檔的指定位置點(記錄檔名和位置點資訊就是在配置主從複製服務時,執行change master命令時給定的)之後發送 binlog 日誌(即SQL語句);

3、主伺服器接收到來自從伺服器的I/O線程請求之後,主伺服器會建立一個 Binlog dump 線程,該線程會根據從伺服器I/O線程請求的資訊去讀取指定Binlog 記錄檔中指定位置點之後的 Binlog 日誌資訊,然後返回給從伺服器的 I/O 線程。返回的資訊中,除了 Binlog 日誌內容之外,還有包括主伺服器上最新的 Binlog 檔案名稱以及在該 Binlog 中的最新的指定更新位置點(即下一次從伺服器請求的Binlog檔案名稱和位置點資訊)。

4、當從伺服器的 I/O 線程擷取到主伺服器上 Binlog dump 線程發送過來的日誌內容及最新的記錄檔名及位置點之後,它會將 Binlog 日誌內容依次寫入到從伺服器本身的Relay Log(即中繼日誌)檔案(Mysql-relay-bin.xxxx)的最末端,並將新的 Binlog 檔案名稱和位置點資訊記錄到 master-info 檔案中,以便下一次讀取主伺服器的最新 Binlog 日誌時,能夠告訴主伺服器需要從最新 Binlog 日誌的哪個檔案的哪個位置點開始請求新的 Binlog 日誌內容。

5、從伺服器的 SQL 線程會即時的檢測本地 Relay Log 中是否有新增加的日誌內容,如果有它會就及時的把 Relay Log 檔案中的內容解析成在主伺服器曾經執行過的 SQL 陳述式內容,並在從伺服器自身按語句的順序執行對應的這些 SQL 陳述式,應用完畢後會自動清理應用過的日誌。

     這樣一來,在從伺服器上讀取和執行語句被分成兩個獨立的任務。如果語句執行較慢則語句讀取任務沒有慢下來。例如,如果從伺服器有一段時間沒有運行了,當從伺服器啟動時,其I/O線程可以很快地從主伺服器索取所有二進位日誌內容,即使 SQL 線程遠遠滯後。如果從伺服器在 SQL 線程執行完所有索取的語句前停止,I/O 線程至少已經索取了所有內容,以便語句的安全拷貝儲存到本地從伺服器的中繼日誌中,供從伺服器下次啟動時執行。這樣就允許清空主伺服器上的二進位日誌,因為不再需要等候從伺服器來索取其內容。

6、經過了上面的一系列過程,Mysql就能夠確保在主伺服器和從伺服器上都執行了同樣的 SQL 陳述式。在複製狀態正常的情況下,主伺服器和從伺服器的資料是完全一樣的。雖然 Mysql 的同步機制會有一些特殊的情況,但大多數情況都有解決方案,因此無須擔心。至於更多的詳細資料和更權威的資訊,請參考官方手冊的說明。

     


本文出自 “Not Only Linux” 部落格,請務必保留此出處http://nolinux.blog.51cto.com/4824967/1528519

mysql系列之複製1----原理篇

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.