Mysql 主從同步原理簡析

王若伊_恩賜解脫發表於2021-08-26

在開始講述原理的情況下,我們先來做個知識彙總,
究竟什麼是主從,為什麼要搞主從,可以怎麼實現主從,mysql主從同步的原理
1、什麼是主從
其實主從這個概念非常簡單
主機就是我們平常主要用來讀寫的服務,我們稱之為master(主人、主宰)
從機就是主機進行的一個擴充套件,他一般不會主動用來讀寫,我們稱之為slave( [sleɪv] 奴隸)
從機上的資料是從主機通過某種形式獲取到而寫入從機的,理論上從機並不能直接獲取到來自外界的資料。

2、為什麼要搞主從呢?
最早搞主從是為了主備,也就是master是主機,salve是備機。因為早期軟體的資料量與併發性並不高。主機完全支撐得住日常的使用。
所以通過主備的形式,保證db高可用,當檢測到主db掛掉的時候,自動將服務的資料來源切換到備db。
隨著業務的發展,大家發現單master往往很難支撐的住業務的需要,因此對傳統的主從開始進行了擴充套件。


(1)一主一從
從機不僅僅作為備機,而且還作為讀資料來源的db,業務服務寫資料時,寫到主機,讀資料時,從從機上讀。從而降低主機的壓力
(2)一主多從
主寫從讀之後,我們發現單一的從節點在支撐業務查詢資料時,還是存在效能瓶頸,因此將從機進行水平擴充套件,實現多從。
(3)雙M
從機的身份提升為主機,兩個主機互為對方的從機,共同分擔讀寫壓力
(4)聯級複製
聯級複製和一主多從比較相像,區別是次級別的從機的資料來源是來自於從機而不再是主機。這樣主要是考慮到從機變多後,同步資料對主機效能的影響
(5)多主一從
多主應用在寫多讀少的場景,通過多主降低主機的壓力,同時通過1個從機,來完成讀操作和資料備份的能力。
3、如何實現主從同步呢?
大家不要把主從同步想的太難以理解,其實非常簡單,對於一個軟體工程師來說,你只要會寫程式碼,能從主庫中查出資料,然後連線到備庫裡,將資料寫進去,就可以了。這就是最易於理解的主從同步。
但是這種太粗糙了,效能也不好,所以mysql自身就已經提供了一套完整的主從同步機制,保證資料可以高效的從主機到從機的同步過去。
除去mysql 自身的主從同步,業界還有一些通過元件來支援的,比如阿里的canal,這個主要是為了更靈活的進行資料同步,比如對同步資料進行解析,同步的從機可以不再使用mysql,而是其他儲存服務等。(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )
4、mysql 主從同步的原理
mysql自身實現主從同步,主要是利用到binlog 日誌。
由於不是本文的重點,這裡簡單說下binlog日誌:
它是mysql用來記錄db改變的日誌,
比如某條資料的值從0改為1 (DML語句)
比如某張表被刪除了 (DDL語句)
binlog 有三種形式:(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )
(1)statement:記錄具體引起改動的操作語句,比如insert xxxxx....
(2)row:基於資料行的,原來資料行是xx值改為了yy 值,這種一般佔用空間比較大
(3)mixed:混合模式,由服務自己來決定此次變更採用哪種形式。
當sql操作寫入binlog,就已經算作sql執行成功了,而不是寫入到對應磁碟中(刷盤)。所以binlog中對應的值,我們可以理解為就是mysql的一個對映,同步mysql資料不同撈磁碟中的資料進行同步,而只需要同步binlog日誌就行。
具體的同步原理如下:
(1)主從同步設定好之後(進行相關的諸如ip,埠,服務id,等操作設定後)
(2)相關變動會寫入到binlog中
(3)maser會啟動一個執行緒:binlog dumplog 執行緒,這個執行緒會通知從機,當前存在SQL變更,並將binlog的變動傳送到從機上
(4)從機收到請求後,會啟動執行緒:i/o執行緒 ,該執行緒會將收到的binlog日誌載入到中繼日誌delay log中
(5)從機中的另外一個執行緒:SQL 執行緒會讀取relay日誌中的資訊,重新整理到從機中
具體可見下圖

根據CAP理論(不清楚這點這裡),這套架構很明顯無法保證實時的資料一致性,如:
1、寫入主機後,主機立刻掛掉,進行主備倒換,此時可能會丟失資料,
2、當主機發生寫操作,因為同步資料到從機的binlog中會存在延遲,所以立刻查詢從機時,可能會無法查詢到資料,針對這種情況
解決辦法:
1、啟用半同步複製,之前主從同步資訊是非同步同步,不影響主庫的邏輯,半同步複製則是主機等待binlog寫入到(至少一個)從機的中繼日誌中,主機才確定返回給客戶端。
2、強制敏感資料呼叫主機,但是這樣使讀寫分離的概念模糊化,不是很推薦
3、使用中介軟體(canal),大致原理是當寫請求發生時,記錄到cache中,並預估好同步到從機的時間。
此時寫入主庫資料,查詢從庫時,會根據寫入到cache的預估時間判定此時從機上的時間,判定是等待從庫,還是直接查詢從庫

相關文章