首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

後端分布式系列:分布式存儲-MySQL 數據庫事務與復制機制深度解析

     編輯:MySQL 綜合教學

分布式存儲架構圖

前言:為何要探討分布式存儲?

好久沒有發表技術文章,主要在思考「後端分布式」系列該如何切入才最貼近實戰。最近理清了脈絡:後端分布式核心包含「分布式存儲」與「分布式計算」兩大板塊。本系列將結合實際工作中遇到的問題,以「尋找答案」的視角剖析技術原理。我們大多數時候不是在造輪子,而是在用輪子;為了用好輪子,必須懂其內部結構與運作邏輯。本文將從使用者角度出發,以開源產品為參考實現,重點講清原理,細節點到即止。

核心議題:事務與復制

近期參與一個跨地域數據中心的多點寫入專案,要求在異地雙主架構下實現數據最終一致性。過去僅做讀寫分離,靠 MySQL 原生主從復制即可;如今雙主雙寫引入的短暫延遲與衝突解決,本質上仍是「如何在分布式環境下保證數據一致性」的問題。

單機數據庫如何保證一致性?

回到最基礎的單機 MySQL,一致性靠事務的 ACID 四大特性支撐:

  • Atomicity(原子性):事務要麼全做,要麼全不做
  • Consistency(一致性):事務前後數據庫從一個一致性狀態轉移到另一個
  • Isolation(隔離性):並發事務互不干擾
  • Durability(持久性):提交後的修改永久生效

ACID 細節不再贅述,重點在於:單機靠事務搞定一致性,那主從架構下,主從數據一致性靠什麼?

MySQL 主從復制的關鍵:Binlog

MySQL 引入 binlog(二進制日志)實現主從復制。Binlog 記錄所有引發數據變更的事件。從庫請求主庫發送 binlog,重放事件重構數據。因此,從庫數據來源即 binlog。只要主庫做到「binlog 與本地數據一致」,主從數據便一致(暫不考慮網絡傳輸異常)。

本地數據一致性靠存儲引擎事務保證,那事務是如何實現的?請看下圖:

事務實現原理圖

存儲引擎層面的事務實現:Redo Log 與 Undo Log

MySQL 本身不直接提供事務,而是開放存儲引擎接口,由 InnoDB 實現。通用做法基於兩類日志:

  • Redo Log(重做日志):記錄事務修改「後」的數據,用於崩潰恢復時「重做」
  • Undo Log(回滾日志):記錄事務修改「前」的原始數據,用於回滾

事務執行簡化流程:

  1. 先寫 undo/redo log,強制刷盤持久化
  2. 更新內存數據頁,異步刷盤
  3. 提交事務,在 redo log 中寫入 commit 標記

若中途故障,可用 redo log 重做或 undo log 回滾,保證一致性。

關鍵難點:Binlog 與 Redo Log 的一致性

上述機制在存儲引擎層完成,但 binlog 由 MySQL Server 層記錄,不在引擎管轄範圍。必須保證 binlog 與 redo log 內容一致,否則主從數據會出現分歧。

開啟 binlog 後,事務提交流程多一步:

  1. 寫 undo/redo log,刷盤
  2. 更新數據,異步刷盤
  3. 將事務日志持久化到 binlog
  4. 提交事務,redo log 寫入 commit 記錄

只要 binlog 未寫成功,事務回滾;binlog 寫成功後即便 Crash 也能恢復並提交。這要求 binlog 寫入嵌入事務引擎流程,以內部分布式事務(XA 事務,兩階段提交)方式完成。

總結與展望

本文從「分布式一致性」切入,分析 MySQL 單機如何通過「binlog 與事務數據一致」支撐復制機制。這為後續基於 binlog 實現主從復制、解決網絡因素引入的複雜性奠定基礎。後續文章將深入剖析主從復制中的網絡延遲、衝突檢測、GTID、半同步復制等進階主題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved