從異步到半同步:全面解讀MySQL復制的數據一致性保障方案

MySQL 主從復制(Replication)是其最核心的高可用性和擴展性功能之一。它的原理是將一個 MySQL 實例(稱為主庫 Master)的數據變更,自動同步到另一個或多個 MySQL 實例(稱為從庫 Slave)的過程。

下面我將詳細解析其工作原理、核心組件和流程。

一、 核心架構與組件

MySQL 主從復制是一個 “異步” 的、基于日志的復制系統,主要涉及三個線程和兩種日志:

角色

組件

說明

主庫 (Master)

Binary Log (binlog)

核心。記錄所有對數據庫結構和內容進行修改的 SQL 語句(或實際數據行變更)。

Binlog Dump Thread

主庫上的一個線程,負責讀取 binlog 并將其發送給從庫的 I/O 線程。

從庫 (Slave)

I/O Thread

從庫上的線程,負責連接主庫,請求和接收 binlog 數據,并將其寫入本地的中繼日志。

Relay Log

從庫上的一個日志文件,作為主庫 binlog 的臨時中轉站和緩沖區。

SQL Thread

從庫上的線程,負責讀取中繼日志中的內容,并解析執行其中的 SQL 語句,最終使從庫數據與主庫保持一致。

二、 主從復制的工作原理(三步流程)

整個過程可以清晰地分為三個步驟,下圖直觀地展示了這一流程:

flowchart TD
A[Client Write Request] --> B[Master Database]subgraph Master[Master Server]B --> C[Write Data<br>Update/Insert/Delete]C --> D[Write Binary Log<br>[binlog]]D --> E[Binlog Dump Thread]
endE -- "Binlog Events" --> F[I/O Thread]subgraph Slave[Slave Server]F --> G[Write Relay Log<br>[relay log]]G --> H[SQL Thread]H --> I[Replay Events]I --> J[Slave Data Updated]
end

步驟一:主庫記錄二進制日志 (Binary Log)

  1. 應用程序向主庫發起數據變更請求(如 ??INSERT??, ??UPDATE??, ??DELETE??)。
  2. 主庫執行完這些事務后,并不會立即返回,而是將這些更改事件按照一定的格式(??STATEMENT??, ??ROW??, ??MIXED??)寫入到自己的 Binary Log 文件中。
  • 注意:只有寫操作會被記錄,讀操作不會。

步驟二:從庫請求并接收日志 (I/O Thread)

  1. 從庫的 I/O 線程會啟動一個到主庫的客戶端連接。
  2. I/O 線程向主庫的 Binlog Dump 線程發送一個請求,指定從哪個 binlog 文件的哪個位置開始同步。
  3. 主庫的 Binlog Dump 線程讀取 binlog 內容,并通過之前建立的連接發送給從庫。
  4. 從庫的 I/O 線程接收到這些 binlog 事件后,會將其順序地寫入到本地的 Relay Log 文件中。

步驟三:從庫重放中繼日志 (SQL Thread)

  1. 從庫的 SQL 線程會不斷地讀取 Relay Log 文件中的事件。
  2. SQL 線程會解析并執行這些事件中的 SQL 語句(或者在 ??ROW?? 格式下,直接應用數據行的變化),從而在從庫上重現主庫上的操作。
  3. 一旦 SQL 線程執行完一個事件,它就會更新自己的 ??master.info?? 和 ??relay-log.info?? 文件,記錄當前讀取到的主庫 binlog 位置,以便中斷后能從正確的位置繼續復制。

總結來說,從庫通過兩個線程實現了“接收日志”和“執行日志”的解耦:I/O 線程負責從主庫拉取數據,SQL 線程負責消費這些數據。Relay Log 作為中間的緩沖區,使得兩個線程可以獨立工作,提高了復制的效率和穩定性。

三、 復制的格式 (Binlog Format)

這是理解復制行為和排查問題的關鍵。主庫記錄 binlog 有三種格式:

格式

原理

優點

缺點

STATEMENT (SBR)

記錄原始的 SQL 語句。

日志文件小,節省磁盤和網絡 I/O。

可能因上下文信息(如系統變量、觸發器)導致主從數據不一致。

ROW (RBR)

記錄每行數據如何被修改(修改前鏡像/修改后鏡像)。

安全可靠,幾乎可以保證主從數據絕對一致。這是默認推薦的格式。

日志文件大(例如一條 ??UPDATE?? 更新了100萬行,會記錄100萬條日志)。

MIXED (MBR)

混合模式。一般情況下使用 STATEMENT,但在可能造成不一致的場景下(如使用 ??UUID()?? 函數),自動切換為 ROW 格式。

兼顧了安全性和性能。

仍存在極小的不確定性。

四、 半同步復制 (Semi-Synchronous Replication)

上述默認的復制是完全異步的。這意味著:

  1. 主庫提交事務并寫入binlog后,立即返回給客戶端成功。
  2. binlog 通過異步的方式發送給從庫。

風險:如果主庫在返回成功后、binlog還未發送到任何從庫時就宕機了,雖然客戶端認為成功了,但這個事務實際上丟失了。

半同步復制 為了解決這個問題而誕生:

  1. 主庫在提交事務時,會等待至少一個從庫的 I/O 線程確認已經接收到了這個事件的 binlog。
  2. 只有在收到確認后,主庫才會返回成功給客戶端。
  3. 如果超時(可配置)還未收到確認,復制會降級為異步模式,之后一旦有從庫恢復,又會自動升級回半同步。

這就在性能和數據一致性之間提供了一個很好的折衷,確保了數據的冗余性。

五、 主從復制的應用場景

  1. 讀寫分離:主庫處理寫操作和實時性要求高的讀操作,從庫處理大量的分析報表類讀操作,顯著提升系統整體性能。
  2. 數據備份:在從庫上進行備份,不會對主庫造成任何壓力。
  3. 高可用性和故障切換:主庫宕機后,可以快速將一個從庫提升為新的主庫,減少系統停機時間。
  4. 地理分布:將數據同步到不同地理位置的從庫,供當地用戶訪問,提升訪問速度。

六、 總結與核心要點

  • 基礎原理:基于 Binlog,采用 “拉” 的異步模式。
  • 三個線程:主庫的 Binlog Dump,從庫的 I/O 和 SQL。
  • 兩個日志:主庫的 Binary Log,從庫的 Relay Log。
  • 核心流程:主庫寫Binlog -> 從庫I/O線程拉取并寫Relay Log -> 從庫SQL線程重放Relay Log。
  • 格式選擇:推薦使用 ROW 格式,以保證數據一致性。
  • 數據安全:對數據可靠性要求極高的場景,可使用半同步復制。

另外搭配便捷的MYSQL備份工具,可定時備份、異地備份,MYSQL導出導入。可本地連接LINUX里的MYSQL,簡單便捷。可以大大地提高工作效率喔。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/97026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/97026.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/97026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PostgreSQL GIN 索引揭秘

文章目錄什么是GIN Index?示例場景GIN Index的原理GIN Index結構MetapageEntriesLeaf PagesEntry page 和 Leaf page 的關系Posting list 和posting tree待處理列表&#xff08;Pending List&#xff09;進階解讀GIN index索引結構總結什么是GIN Index? GIN (Generalized In…

開源多模態OpenFlamingo橫空出世,基于Flamingo架構實現圖像文本自由對話,重塑人機交互未來

注&#xff1a;此文章內容均節選自充電了么創始人&#xff0c;CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》&#xff08;跟我一起學人工智能&#xff09;【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

電子衍射模擬:基于GPU加速的MATLAB/Julia實現

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;電子衍射模擬的重要性與計算挑戰 電子…

easyExcel動態應用案例

代碼鏈接&#xff1a;https://download.csdn.net/download/ly1h1/919402991.案例說明&#xff1a;1.1.導入功能導入數據實現轉換成 List<List<String>> headers和 List<List<String>> datas&#xff0c;后續補充可以與數據模型注解結合&#xff0c;形…

【數據結構入門】排序算法(5):計數排序

目錄 1. 比較排序和非比較排序 2. 計數排序的原理 2.1 計數排序的弊端 3.代碼復現 3.1 代碼分析 3.2 排序核心 3.3 時間、空間復雜度 1. 比較排序和非比較排序 比較排序是根據排序元素的具體數值比較來進行排序&#xff1b;非比較排序則相反&#xff0c;非比較排序例如&…

輸入3.8V~32V 輸出2A 的DCDC降壓芯片SCT9320

同志們&#xff0c;今天來個降壓芯片SCT9320。輸入3.8V~32V&#xff0c;輸出最高可以達到2A。0.8V的參考電壓。500k的開關頻率。一共八個引腳&#xff0c;兩個NC&#xff08;為什么不做成六個引腳呢&#xff1f;&#xff09;。EN引腳懸空或者接到VIN都可以直接啟動&#xff0c;…

C++類和對象詳解(2);初識類的默認成員函數

1.類的默認成員函數默認成員函數就是用戶沒有顯示實現&#xff0c;編譯器會自動生成的成員函數稱為默認成員函數。一個類我們不寫的情況下編譯器會默認生成以下的6個默認成員函數。&#xff08;1&#xff09;構造函數&#xff1a;主要完成初始化的工作&#xff08;2&#xff09…

PLC通信 Tpc客戶端Socket

1.PLC通信 namespace _2.PLC通信 {public partial class Form1 : Form{public Form1(){InitializeComponent();}//連接//1.型號: 跟PLC溝通 使用哪個型號的PLC//2.IP 同上//3.機臺號:同上//4.插槽號:同上Plc plc new Plc(CpuType.S71200, "192.168.25.80", 0, 1);pr…

Android 開發實戰:從零到一集成 espeak-ng 實現中文離線 TTS(無需賬號開箱即用)

簡介 在移動應用開發中,語音合成(TTS)技術是提升用戶體驗的重要工具。然而,許多開發者在集成 TTS 時面臨依賴網絡、需注冊賬號、功能受限等問題。本文將帶你從零開始,通過開源項目 espeak-ng,實現無需賬號、開箱即用的中文離線語音播報。 文章將覆蓋以下核心內容: esp…

直播APP集成美顏SDK詳解:智能美妝功能的開發實戰

在這個“顏值即正義”的時代&#xff0c;用戶對直播APP的第一印象&#xff0c;往往來自主播的畫面質量。高清的視頻固然重要&#xff0c;但如果缺少自然美顏和智能美妝功能&#xff0c;觀眾體驗就會大打折扣。于是&#xff0c;美顏SDK成了直播行業的“標配”。今天&#xff0c;…

C++內存管理:new與delete的深層解析

1. 引言在C的世界里&#xff0c;動態內存管理是一個核心話題。對于從C語言過渡到C的開發者來說&#xff0c;一個常見的困惑是&#xff1a;既然C語言的malloc和free依然可以在C中使用&#xff0c;為什么C還要引入new和delete這兩個操作符&#xff1f;本文將深入探討這兩對內存管…

【AI開發】【前后端全棧】[特殊字符] AI 時代的快速開發思維

&#x1f680; AI 時代的快速開發思維 —— 以 Django Vue3 為例的前后端分離快捷開發流程 一、AI 時代的開發新思路 在 AI 的加持下&#xff0c;軟件開發不再是“純體力活”&#xff0c;而是 思維工具自動化 的協作。 過去&#xff1a;需求 → 設計 → 開發 → 測試 → 上…

Day24_【深度學習(3)—PyTorch使用—張量的創建和類型轉換】

一、創建張量1.張量基本創建方式torch.tensor 根據指定數據創建張量 &#xff08;最重要&#xff09;torch.Tensor 根據形狀創建張量, 其也可用來創建指定數據的張量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 創建指定類型的張量1.1 torch.tensor# 方式一&…

3-12〔OSCP ? 研記〕? WEB應用攻擊?利用XSS提權

鄭重聲明&#xff1a; 本文所有安全知識與技術&#xff0c;僅用于探討、研究及學習&#xff0c;嚴禁用于違反國家法律法規的非法活動。對于因不當使用相關內容造成的任何損失或法律責任&#xff0c;本人不承擔任何責任。 如需轉載&#xff0c;請注明出處且不得用于商業盈利。 …

AI 大模型賦能智慧礦山:從政策到落地的全棧解決方案

礦山行業作為能源與工業原料的核心供給端&#xff0c;長期面臨 “安全生產壓力大、人工效率低、技術落地難” 等痛點。隨著 AI 大模型與工業互聯網技術的深度融合&#xff0c;智慧礦山已從 “政策引導” 邁入 “規模化落地” 階段。本文基于 AI 大模型智慧礦山行業解決方案&…

Node.js 項目依賴包管理

h5打開以查看 一、核心理念&#xff1a;從“能用就行”到“精細化管理” 一個規范的依賴管理體系的目標是&#xff1a; 可復現&#xff1a;在任何機器、任何時間都能安裝完全一致的依賴&#xff0c;保證構建結果一致。 清晰可控&#xff1a;明確知道每個依賴為何存在&#x…

洛谷P1835素數密度 詳解

題目如下&#xff1a;這里面有部分代碼比較有意思&#xff1a;1&#xff0c;為何開始先遍歷&#xff0c;最終值小于50000&#xff1f;因為題目要求的右邊與左邊差小于 10^6 &#xff0c;所以最多有10^3個素數&#xff0c;所以保存里面的素數數量大于1000&#xff0c;而50000的化…

突破限制:FileCodeBox遠程文件分享新體驗

文章目錄【視頻教程】1.Docker部署2.簡單使用演示3. 安裝cpolar內網穿透4. 配置公網地址5. 配置固定公網地址在隱私日益重要的今天&#xff0c;FileCodeBox與cpolar的協同為文件傳輸提供了安全高效的解決方案。通過消除公網IP限制和隱私顧慮&#xff0c;讓每個人都能掌控自己的…

以太網鏈路聚合實驗

一、實驗目的掌握使用手動模式配置鏈路聚合的方法掌握使用靜態 LACP 模式配置鏈路聚合的方法掌握控制靜態 LACP 模式下活動鏈路的方法掌握靜態 LACP 的部分特性的配置二、實驗環境安裝有eNSP模擬器的PC一臺&#xff0c;要求PC能聯網。三、實驗拓撲LSW1與LSW2均為S3700交換機。L…

autMan安裝教程

一、安裝命令 如果你系統沒安裝docker&#xff0c;請看往期教程 以下為通用命令 docker run -d --name autman --restart always -p 8080:8080 -p 8081:8081 -v /root/autman:/autMan --log-opt max-size10m --log-opt max-file3 hdbjlizhe/autman:latest解釋一下以上命令&…