MySQL主從復(fù)制最全詳解
MySQL主從復(fù)制
MySQL主從復(fù)制是一種數(shù)據(jù)庫復(fù)制技術(shù),在主從復(fù)制中,一個數(shù)據(jù)庫服務(wù)器(主節(jié)點,Master)充當(dāng)主服務(wù)器,而其他一個或多個數(shù)據(jù)庫服務(wù)器(從節(jié)點,Slave)充當(dāng)從服務(wù)器。
如下圖所示:
圖片
主節(jié)點上的數(shù)據(jù)庫更改,會被同步到從服務(wù)器上,從而保持從節(jié)點與主節(jié)點數(shù)據(jù)的一致性。
MySQL主從復(fù)制模式
MySQL主從復(fù)制模式主要會包含:異步復(fù)制、半同步、以及全同步復(fù)制三種復(fù)制模式。
圖片
1.異步復(fù)制
MySQL默認(rèn)的復(fù)制是異步的,也就是主節(jié)點執(zhí)行寫操作后,不等待從節(jié)點確認(rèn),直接返回給客戶端。
這種模式下,主節(jié)點與從節(jié)點之間的數(shù)據(jù)同步是異步進行的,主節(jié)點執(zhí)行寫操作后即刻返回給客戶端,而從節(jié)點在后續(xù)時間里異步地復(fù)制主節(jié)點上的變更。
注意:由于從節(jié)點的復(fù)制過程是異步的,可能導(dǎo)致從節(jié)點上的數(shù)據(jù)相對于主節(jié)點存在一定的延遲。
這意味著在某個時間點從節(jié)點上的數(shù)據(jù)可能不是最新的,這一點需要注意,很重要。
2.半同步復(fù)制
半同步復(fù)制,就是主節(jié)點執(zhí)行寫操作后,等待至少一個從節(jié)點確認(rèn)收到數(shù)據(jù)后再返回給客戶端,這就是半同步復(fù)制。
如下圖所示:
圖片
在半同步復(fù)制中,主節(jié)點(Master)上的寫操作在返回給客戶端之前,需要等待至少一個從節(jié)點(Slave)確認(rèn)接收到了這些寫操作。
相對于全同步復(fù)制,半同步復(fù)制在主節(jié)點的性能上有所提高,因為主節(jié)點無需等待所有從節(jié)點的確認(rèn)。
但是,相對于異步復(fù)制,半同步復(fù)制提高了數(shù)據(jù)的安全性。
所以,各自都有優(yōu)缺點,需要根據(jù)自己的實際情況來定,究竟哪個適合半同步,還是異步等。
3.全同步復(fù)制
全同步復(fù)制,很容易理解了,就是子節(jié)點全部同步完后,才返回給主服務(wù)器。
所以,全同步復(fù)制提供了最高級別的數(shù)據(jù)一致性,確保主節(jié)點和所有從節(jié)點上的數(shù)據(jù)保持完全一致。
當(dāng)然,相較于異步復(fù)制和半同步復(fù)制,全同步復(fù)制對主節(jié)點的性能影響更為顯著。
因為原因很簡單,主節(jié)點必須等待所有從節(jié)點的確認(rèn),才返回。
總之,全同步復(fù)制提供了最高級別的數(shù)據(jù)一致性,適用于對數(shù)據(jù)一致性要求極高的場景,但不適合性能要求極高的場景。
所以,上面的3種方案,需要權(quán)衡這種一致性與性能之間的犧牲,來最終選擇。
MySQL主從復(fù)制原理
MySQL主從復(fù)制的實現(xiàn)原理基于:主節(jié)點的二進制日志(Binary Log)和從節(jié)點的復(fù)制線程。
如下圖所示:
圖片
首先,在主節(jié)點上,開啟二進制日志記錄功能。
[mysqld]
log-bin = /var/log/mysql/mysql-bin.log
然后,主節(jié)點上的寫操作(INSERT、UPDATE、DELETE等),將會被記錄到這個二進制日志文件中。
最后,從節(jié)點開始連接到主節(jié)點,獲取主節(jié)點的二進制日志文件,并通過復(fù)制線程將這些日志應(yīng)用到從節(jié)點的數(shù)據(jù)庫中。
MySQL主從復(fù)制中的關(guān)鍵組成部分,這里會涉及到三個線程:I/O 線程、Log Dump 線程、SQL 線程。
1.I/O 線程(I/O Thread)
該線程負(fù)責(zé)連接到主節(jié)點(Master),獲取二進制日志(binlog),并將這些日志寫入從節(jié)點的中繼日志。
2.Log Dump 線程
Master 節(jié)點上,有一個 log dump 線程,是用來發(fā)送日志文件( binlog) 給 slave 的。
3.SQL 線程
該線程負(fù)責(zé)讀取中繼日志(Relay Log),解析其中的二進制日志,并在從節(jié)點上執(zhí)行相應(yīng)的SQL語句。
這三個線程協(xié)同工作,使得從節(jié)點能夠與主節(jié)點保持同步,實現(xiàn)主從復(fù)制。
通過這些步驟,MySQL主從復(fù)制實現(xiàn)了數(shù)據(jù)的同步。
主節(jié)點記錄變更,從節(jié)點連接主節(jié)點并獲取變更,然后在從節(jié)點上應(yīng)用這些變更,最終實現(xiàn)了數(shù)據(jù)的一致性。