![](https://news.xinpengboligang.com/upload/keji/39fac695a6275aeba00eb76e7effbc09.jpeg)
大傢好,我是mikechen。
MySQL主從復制是提升MySQL性能的重要技術,而且大廠面試也特別喜歡考察,下面我就重點來詳解MySQL主從復制的實現原理@mikechen
本篇已經收納於mikechen創作的《阿裡架構師進階專題合集》裡面。
![](https://news.xinpengboligang.com/upload/keji/b0f7780931b93b58a8b667fae765268e.jpeg)
MySQL主從復制
MySQL主從復制:是指把數據從一個MySQL主服務器(主節點)復制到一個或多個MySQL從服務器(從節點),這就是MySQL主從復制。
MySQL主從復制會把主服務器中的所有數據庫實例、特定數據庫實例或特定表等,全部復制到從服務器。
MySQL主從復制模式
MySQL主從復制模式主要會包含:異步復制、半同步、以及全同步復制三種復制模式。
1.異步復制
MySQL默認的復制是異步的,主庫在執行完客戶端提交的事務後會立即將結果返給給客戶端。
MySQL異步復制並不關心從庫是否已經接收並處理,這樣就會有一個問題,主如果crash掉了,此時主上已經提交的事務可能並沒有傳到從庫上。
所以,後面又出來了一個半同步復制。
2.半同步復制
半同步復制介於異步復制和全同步復制之間,主庫在執行完客戶端提交的事務後不是立刻返回給客戶端,而是等待至少一個從庫接收到並寫到relaylog中才返回給客戶端。
如下圖所示:
![](https://news.xinpengboligang.com/upload/keji/b4f0fc3e52393156fcab627b2da214c6.jpeg)
相對於異步復制,半同步復制提高了數據的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。
所以,半同步復制最好在低延時的網絡中使用。
3.全同步復制
全同步復制:是指當主庫執行完一個事務,然後所有的從庫都復制了該事務並成功執行完才返回成功信息給客戶端。
因為需要等待所有從庫執行完該事務才能返回成功信息,所以全同步復制的性能必然會收到嚴重的影響。
MySQL主從復制原理
MySQL 主從復制是基於主服務器在二進制日志跟蹤所有對數據庫的更改,因此要進行復制,必須在主服務器上啟用二進制日志。
每個從服務器從主服務器接收已經記錄到日志的數據,主從復制原理如下圖所示:
![](https://news.xinpengboligang.com/upload/keji/7b32933efac88b244bbf5ad461ece932.jpeg)
首先:主服務器更新語句會記錄 binlog,它是一種邏輯日志,有了這個 binlog 從服務器會獲取主服務器的 binlog 文件;
然後:解析裡面的 SQL 語句,在從服務器上面執行一遍,保持主從的數據一致;
這裡面涉及到三個線程:
- 連接到 master 獲取 binlog,並且解析 binlog 寫入中繼日 志,這個線程叫做 I/O 線程;
- Master 節點上有一個 log dump 線程,是用來發送 binlog 給 slave 的;
- 從庫的 SQL 線程,是用來讀取 relay log,把數據寫入到數據庫的。
做了主從復制的方案之後,我們隻把數據寫入 master 節點,而讀的請求可以分擔到 slave 節點。
如下圖所示:
![](https://news.xinpengboligang.com/upload/keji/39488c3ba43d482d25397069339b06a8.jpeg)
簡單來說:就是一臺服務器中的mysql數據庫根據另一臺服務器中的mysql數據庫的日志文件進行分析,然後執行sql語句進行數據復制。
在實際的生產中,為了解決Mysql的單點故障,以及提升MySQL的讀寫效率,一般都會采用MySQL主從復制。
本篇已經收納於mikechen創作的《阿裡架構師進階專題合集》裡面。
![](https://news.xinpengboligang.com/upload/keji/472325f2c5abfcdfad1ba564037d735f.jpeg)