MySQL主從同步如何保證數據一致性?
MySQL 主從同步是 MySQL 集群方案中的一種,也是實現難度最低的一種。
然而,現在的面試都不問 MySQL 主從同步原理了,而是開始問主從同步怎么保證數據一致性問題了。
所以,今天就給大家安排上了。
1.什么是數據一致性?
數據一致性是指在一個系統中,數據在不同的部分、不同的時間點,以及不同的操作之間保持一致的狀態。
數據一致性通常體現在以下幾點:
- 數據一致性:確保數據的完整性意味著數據在存儲和傳輸過程中沒有被損壞或丟失。這包括數據的準確性、完整性和有效性。例如,在一個電商系統中,商品的庫存數量應該是準確的。如果一個用戶購買了一件商品,庫存數量應該相應地減少。如果庫存數量顯示不正確,就會導致數據不一致。
- 事務一致性:在數據庫系統中,事務是一組操作的集合,這些操作要么全部成功執行,要么全部回滾。事務一致性確保在一個事務中對數據的修改在事務提交后對所有用戶都是可見的,并且如果事務失敗,數據將恢復到事務開始之前的狀態。例如,在一個在線預訂系統中,用戶預訂了一個酒店房間,系統應該確保這個房間在預訂期間不能被其他用戶預訂。如果出現多個用戶同時預訂同一個房間的情況,就會導致數據不一致。
- 多副本一致性:在分布式系統中,數據通常會存儲在多個副本中,以提高系統的可用性和性能。多副本一致性確保不同副本之間的數據保持一致。例如,在一個云存儲服務中,用戶上傳了一個文件,這個文件會被存儲在多個數據中心的服務器上。如果用戶對文件進行了修改,云存儲服務應該確保所有副本都被更新,以保證用戶在任何地方訪問文件時都能看到最新的版本。
- 時間一致性:時間一致性要求數據在不同的時間點上保持一致,這包括數據的時效性和順序性。例如,在一個股票交易系統中,交易訂單的處理應該按照時間順序進行。如果訂單的處理順序出現錯誤,就會導致交易數據不一致。
PS:我們本文主要討論的是多副本在同一時間上的數據一致性問題。
2.主從復制
MySQL 主從復制是一種將 MySQL 主數據庫的數據,同步到其他的數據庫的一種機制,從而實現數據的冗余備份和負載均衡,平行擴展了數據庫的查詢能力。
主從數據庫基本概念:
- 主數據庫(Master):主數據庫是數據的主要來源,負責接收和處理所有的寫操作(INSERT、UPDATE、DELETE 等)。主數據庫將所有的寫操作記錄到二進制日志(Binary Log)中,這些日志記錄了數據庫的變更歷史。
- 從數據庫(Slave):從數據庫通過復制主數據庫的二進制日志來同步數據。從數據庫可以處理讀操作(SELECT),從而分擔主數據庫的負載。
MySQL 主從復制流程如下:
圖片
它的主要執行流程如下:
- 主數據庫接收到一個寫操作(如 INSERT、UPDATE、DELETE)時,會將這個操作記錄到二進制日志(Binary Log)中,將數據修改的操作按順序記錄下來。
- 從數據庫 IO 線程會自動連接主服務,從二進制中讀取同步數據,記錄到中繼日志(Relay Log)中。
- 從數據庫的 SQL 線程會定期從中繼日志中獲取同步數據,寫入到從數據庫中。
3.MySQL主從同步類型
MySQL 主從同步方式有以下三種:
圖片
3.1 異步復制
異步復制默認的主從同步復制模式,在這種模式下,主服務器提交事務后立即返回客戶端,無需等待從服務器確認是否成功接收并應用了事務,從服務器會在后臺獨立地接收并應用事務日志。
異步同步流程如下(紅色部分為主要執行流程):
圖片
優點
- 性能:異步復制模式下,主服務器的寫操作不會因為等待從服務器的確認而被阻塞,因此可以提供更高的寫入吞吐量。
- 簡單:配置和管理相對簡單。
- 成本:不需要額外的硬件資源支持,因為不需要高速的網絡連接來保證同步。
缺點
數據丟失問題:在主服務器故障的情況下,可能存在數據未完全同步到從服務器的情況,導致數據丟失或不一致。
3.2 同步復制
同步復制是一種最為嚴格的復制模式,它要求主服務器在提交一個事務之前,必須等待所有從服務器確認確認接收到并應用了事務之后,主服務器才會向客戶端返回事務提交成功的消息。
同步復制執行流程如下:
圖片
優點
- 數據一致性:提供了更高的數據一致性保障,因為主服務器必須等待從服務器確認才能完成事務提交。
- 容錯性:即使主服務器發生故障,至少有一個從服務器擁有最新的數據,從而減少了數據丟失的風險。
缺點
- 性能開銷大:主庫需要等待所有從庫的響應,這會導致事務提交的延遲增加,尤其是在從庫數量較多或網絡狀況不佳時,性能下降明顯。
- 單點故障風險:如果一個從庫出現故障,可能會導致整個系統的阻塞,因為主庫需要等待所有從庫的確認。
3.3 半同步復制
半同步復制是一種折衷方案,它結合了異步復制的高性能和同步復制的高可靠性。在半同步復制模式下,主服務器在提交一個事務之前,需要等待至少一個從服務器確認接收到該事務的日志,但不需要等待從服務器完成應用。
半同步執行流程如下:
圖片
優點
- 數據一致性較好:相比異步復制,提供了更好的數據一致性保障。
- 性能影響較小:相比同步復制,半同步復制的性能開銷較小,因為只需要等待一個從庫的確認。
- 靈活性較高:可以根據需要調整等待的從服務器數量,以適應不同的性能和可靠性需求。
缺點
- 性能波動風險:在網絡延遲較高或從庫負載較大的情況下,可能會導致主庫等待從庫確認的時間過長,從而影響性能。
- 配置復雜:相比異步復制,配置和管理稍微復雜一些。
4.小結
因此,想要保證數據完全一致性需要使用同步復制,但這會犧牲一定的性能;因此在生產環境我們可以使用半同步保證較好的數據一致性即可;而默認的異步方式實現最簡單、性能最好,但可能存在數據不一致的風險,雖然發生的概率極低(生產環境也可以使用)。