MySql主從庫複製原理

MySql主從庫讀寫分離,幾年前就開始應用,但是說到主從庫複製原理,你有了解過嗎?主從複製有幾種模式呢?每種模式的優缺點有哪些?這些可都是面試官愛問的問題呀。

MySql主從庫複製主要有三種模式:異步複製、全同步複製、半同步複製。

一、異步複製

異步複製(Asynchronous replication),主庫執行完一次事務時,立刻將結果返回給客戶端,並不關心從庫是否讀取到數據並完成同步。異步複製是MySql默認的主從庫同步模式。

先回憶一下異步複製的授權流程。

首先,在Master主庫爲Slave從庫授權。

# 在master主庫上爲Slave從庫授權,用戶名、端口、密碼都是從庫的
grant replication slave on *.* to 'test'@'127.0.0.1' identified by '123456';
# 授權需要刷新後,才能生效;
flush privileges;

其次,在Slave從庫授權,指定Master主庫ip地址、賬號、密碼,從哪個文件開始請求binlog日誌及日誌偏移量。

#注意:從庫的幾個參數一定要和主庫 show master status查詢的結果 保持一致
change master to master_host='127.0.0.1',master_user='test',master_password='123456',master_log_file='mysql3306_bin.000004',master_log_pos=595;

最後,啓動從庫的Slave,啓動IO線程和SQL線程。

#啓動從庫的兩個複製線程
start slave; 
#查看狀態
show slave status \G

IO線程負責從Master拉取binlog日誌,並寫入relay-log中繼日誌,中繼日誌起到一個緩衝的作用。SQL線程負責將relay-log中繼日誌轉變成Sql語句,放在從庫中執行。

IO線程和SQL線程必須都爲Yes,複製操作才能正常進行。當Slave_IO_Running爲No的時候,也就是IO線程因爲某些原因停掉了,就無法繼續從Master的binlog二進制文件進行拉取數據了。當Slave_SQL_Running爲No的時候,也就是SQL線程因爲某些原因停掉了,就無法繼續從relay-log中繼日誌讀取二進制文件並轉變成SQL語句在從庫上執行。但是無論Slave從庫的哪一個線程停掉了,都不會對Master主庫產生影響。

梳理一下異步複製的流程:客戶端對主庫進行數據操作,新增修改或者刪除數據,主數據寫入binlog提交事務成功後,並且通知從服務器。從服務器通過IO線程讀取主庫的binlog二進制文件,並寫入緩存relay-log中繼文件,SQL線程則負責從relay-log中繼文件中讀取並轉換成SQL語句在從庫上執行,以此來保持主從庫的數據一致性。

Mysql主從複製原理圖

在這個過程中,Slave通過IO線程拉取binlog二進制日誌,Master無需關注是否有Slave需要同步,只做自己的事情,整個複製過程都是異步完成的。主庫通知從庫這一步可以忽略不計,因爲主庫纔不關心從庫是否能收得到。從庫當掉了,主庫照常使用,不受任何影響。主從複製不是完全實時地進行同步,而是異步實時。這中間存在主從服務之間的同步執行延時,如果主服務器的壓力很大,則可能導致從服務器的數據同步延時較長。

二、全同步複製

全同步複製(Fully synchronous replication),是指當主庫執行完一個事務時,並且所有的從庫都執行完該事務才返回給客戶端。全同步複製又稱組複製(Group Replication)。


全同步複製的流程爲:客戶端對主庫進行數據操作,新增修改或者刪除數據,並以廣播的形式通知從服務器,同時主數據寫入binlog並準備提交事務。

從服務器接收到主庫的通知後,需要全部將binlog通過IO線程寫入relay-log中繼文件,並且通過SQL線程讀取中繼文件並轉爲sql語句在從庫中執行並提交,主庫才能給客戶端操作成功的反饋。在組內的每一個從庫都需要提交事務並響應成功,數據纔算同步完成,因此比較耗時。

全同步複製保證數據的最終一致性,但因爲要求從庫全部提交才能返回給客戶端,因此在性能上有所降低。一般用於對數據安全性要求較高的業務場景。

三、半同步複製

半同步複製(Semisynchronous Replication),是介於全同步複製與異步複製之間的一種,主庫只需要等待至少一個從庫節點收到通知並且刷新Binlog到Relay-Log 文件即可,主庫不需要等待所有從庫給主庫反饋。



半同步複製的流程爲:客戶端對主庫進行數據操作,新增修改或者刪除數據,主數據寫入binlog時,以廣播的形式通知從服務器,從服務器接收到通知,把binlog寫入relay-log中繼文件,至少有一個給主庫ACK反饋,主庫就會提交事務並且給客戶端反饋。

相比較於異步複製,半同步複製需要依賴至少一個Slave將binlog寫入relay-log,在性能上有所降低,但是可以保證至少有一個從庫跟Master的數據是一致的,數據的安全性提高。

對於數據一致性要求高的場景,對性能也有一定要求的場景,可以採用半同步複製的同步策略,比如主庫掛掉時,準備接管的那一個從庫,對數據的一致性要求很比較高。

最後總結

MySql主從複製的三種模式,異步複製是MySql主從複製的默認模式。

從執行性能上排個序:異步複製 > 半同步複製 > 全同步複製。

從數據安全上排序:全同步複製 > 半同步複製 > 異步複製。這三種模式,只有異步模式在使用中,其他兩種模式還是初次接觸,理解不一定全面,還需要在應用中深入理解,放在一起也是爲了加深理解。希望本次的整理對你有幫助。

官網文檔:
https://dev.mysql.com/doc/refman/5.7/en/group-replication-primary-secondary-replication.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章