MySQL 主從讀寫分離架構

我們首先來詳細、清晰地講解 MySQL 主從讀寫分離架構,然后逐一解答你提出的以及補充的高頻面試問題。


第一部分:MySQL 主從讀寫分離架構詳解

1. 什么是主從復制與讀寫分離?

你可以把它想象成一個?“團隊作戰”?的模式。

  • 主數據庫 (Master): 團隊的?“領導”。所有重要的“寫”操作(INSERT,?UPDATE,?DELETE,?ALTER TABLE?等)都必須交給它來處理。它是數據的唯一權威來源。

  • 從數據庫 (Slave): 團隊的?“員工”。它們從“領導”那里同步所有數據變更(這個過程叫復制)。它們主要負責“讀”操作(SELECT),比如處理報表生成、數據分析、用戶查詢等大量且耗時的讀請求。

讀寫分離就是在應用程序層面,配置兩個數據源:一個指向主庫(用于寫),一個或多個指向從庫(用于讀)。應用程序在執行 SQL 時,會根據語句是讀還是寫,自動選擇正確的數據源。

2. 架構圖與數據流

text

+----------------+     +-----------------+     +-----------------+
|                |     |                 |     |                 |
|  Application   +----->   Master Node   +----->   Slave Node 1  |
|   (App Server) |     |   (Read/Write)  |     |    (Read Only)  |
|                |     |                 |     |                 |
+----------------+     +-----------------+     +-----------------+| 讀請求 (SELECT)  ^                         |+-----------------+                         ||                 |                         |v                 |                         |
+-----------------+     |                 |     +-----------------+
|                 |     |                 |     |                 |
|   Slave Node 2  <-----+                 +----->   Slave Node N  |
|    (Read Only)  |                       |     |    (Read Only)  |
|                 |                       |     |                 |
+-----------------+                       +-----------------+
  • 寫請求路徑:?App -> Master

  • 讀請求路徑:?App -> (Slave 1 | Slave 2 | ... | Slave N)

  • 數據同步路徑:?Master -> (Slave 1, Slave 2, ..., Slave N)

3. 核心組件與復制流程

主從復制的本質是:主庫將數據的變更以“事件”的形式記錄到二進制日志中,從庫讀取這些日志并在自身重放一遍。

這個過程涉及三個線程:

  1. Binlog Dump Thread (主庫上)

    • 當有從庫連接上來時,主庫會創建一個Binlog Dump線程。

    • 它的職責是:監聽數據庫的變更,一旦有新的二進制日志事件(binlog event)產生,就將其發送給連接的從庫。

  2. I/O Thread (從庫上)

    • 從庫使用CHANGE MASTER TO命令連接到主庫。

    • 從庫會啟動一個I/O Thread,這個線程會跟主庫的Binlog Dump Thread建立TCP連接。

    • I/O Thread的職責是:請求主庫的二進制日志,并將接收到的事件數據寫入到從庫本地的中繼日志 (Relay Log)?中。

  3. SQL Thread (從庫上)

    • 從庫會啟動一個SQL Thread

    • 它的職責是:讀取本地的中繼日志 (Relay Log),解析并執行其中包含的SQL事件,從而讓從庫的數據和主庫保持一致。

簡單總結流程
主庫數據變更 -> 寫入主庫Binlog -> 主庫Binlog Dump線程發送 -> 從庫I/O線程接收 -> 寫入從庫Relay Log -> 從庫SQL線程執行 -> 從庫數據更新


第二部分:面試高頻問題詳細解答

1. 為什么使用 MySQL 主從分離?

這是一個考察動機的問題,要從?性能可靠性運維?三個維度回答。

  • 提升讀性能 (Performance)

    • 主庫專注于寫,從庫專注于讀,有效地分攤了數據庫的負載

    • 可以通過增加多個從庫來輕松應對極高的讀并發場景(如電商大促、熱門文章查詢)。

  • 提高數據可靠性與災難恢復 (Reliability & Backup)

    • 從庫相當于主庫的?“實時備份”。主庫宕機后,從庫可以切換成新的主庫,快速恢復服務。

    • 可以在從庫上執行備份操作(mysqldump),而不會影響主庫的性能。

  • 便于數據分析與運維 (Operability)

    • 可以在從庫上運行一些重型、耗時的查詢和報表任務,這些操作即使鎖表或者消耗大量資源,也不會影響主庫的線上業務。

    • 可以進行灰度發布或版本測試:在從庫上測試新的數據庫版本或SQL語句,確保安全。

2. 主從復制的原理是什么?

這就是上面詳解的“核心組件與復制流程”部分。面試時,要言簡意賅地概括出來。

參考答案
“MySQL主從復制是基于二進制日志(binlog)的異步復制。主要流程是:

  1. 主庫上的事務提交后,會將數據變更事件記錄到binlog中。

  2. 主庫有一個Binlog Dump線程,負責將binlog事件發送給連接的從庫。

  3. 從庫的I/O Thread負責接收這些事件,并將其寫入本地的中繼日志(Relay Log)。

  4. 從庫的SQL Thread再讀取Relay Log中的事件,并應用執行,從而使從庫數據與主庫保持一致。
    整個過程是異步的。”

3. 如何保證主從一致性?

這是一個深入的問題,考察你對復制過程中潛在風險的認識。

  • 根本原因:由于復制是異步的,主庫提交事務成功后,并不會等待從庫應用完成。如果在數據還未同步到從庫時主庫就宕機,就會導致數據丟失和不一致。

  • 解決方案

    1. 半同步復制 (Semi-Synchronous Replication)

      • 原理:主庫在提交事務時,會至少等待一個從庫接收并寫入Relay Log后(不需要完全執行),才返回成功給客戶端。

      • 效果:極大地降低了數據丟失的風險(不是100%),因為至少有一個從庫擁有了這份數據的日志。這是生產環境常用的方案。

    2. 全同步復制 (Fully Synchronous Replication)

      • 等待所有從庫都執行完事務后才返回。這會嚴重犧牲性能,MySQL官方并未提供此方案,通常通過Galera Cluster等第三方方案實現。

    3. 使用 GTID (Global Transaction Identifier)

      • GTID為每個事務分配一個全局唯一的ID。它可以避免因為binlog文件名和位點(Position)的混亂而導致的數據錯位,使得主從切換和數據一致性校驗變得更加簡單和可靠。

    4. 定期校驗

      • 使用?pt-table-checksum?等工具定期檢查主從數據是否一致,如果發現不一致,再用?pt-table-sync?工具進行修復。

4. 主從不一致,主從延時,什么場景遇到的?

這個問題考察你的實戰經驗。即使沒遇到過,也要說出常見的場景。

  • 主從延遲 (Replication Lag):指從庫的數據落后于主庫,Seconds_Behind_Master?值大于0。

    • 場景1:主庫上執行了大事務

      • 例如:主庫一次性DELETEUPDATE了幾十萬條數據,這個事務產生的binlog量非常大,從庫的SQL Thread需要同樣長的時間來執行,導致延遲。

    • 場景2:從庫機器性能差

      • 主庫使用SSD硬盤,而從庫使用機械硬盤。從庫的SQL Thread應用日志的速度遠慢于主庫提交的速度。

    • 場景3:主庫并發高,從庫無法跟上

      • 主庫的寫并發非常高,而從庫是單線程(SQL Thread)應用(在MySQL 5.6之前),很容易造成堆積。即使5.7+的并行復制(DATABASELOGICAL_CLOCK)也不能完全解決所有場景下的延遲問題。

    • 場景4:從庫上有大的查詢

      • 在從庫上運行了一個需要執行幾十秒的報表查詢,可能會阻塞SQL Thread的執行,導致更大的延遲。

  • 主從不一致

    • 場景:人為誤操作

      • 例如:某個運維同學“為了省事”,直接在從庫上執行了一個UPDATE語句來修改數據。這會導致從庫數據與主庫永久不一致,除非重建從庫。

5. 主從延遲怎么解決的?

根據原因,給出解決方案。

  1. 硬件/架構優化

    • 保證主從機器的硬件配置一致(特別是CPU和磁盤IO能力)。

    • 使用更高性能的SSD硬盤

  2. 數據庫配置與優化

    • 開啟并行復制(MySQL 5.7+):設置?slave_parallel_workers?> 1,讓從庫用多個線程來應用日志,大幅提升效率。

    • 避免大事務:將大事務拆分成多個小事務。例如,刪除大量數據時,使用循環分批刪除。

  3. 業務架構優化 (最常用)

    • 強制走主庫:對于剛寫完立刻就要讀的場景(如用戶注冊后登錄),可以在寫操作后,后續的讀請求強制指定從主庫讀取(在代碼中標記)。這是互聯網公司最普遍的解決方案。

    • 分庫分表:降低單主庫的寫壓力,從根本上緩解延遲。

6. 主節點發生故障,怎么切換?

這就是?“故障轉移” (Failover)?流程。

  1. 手動切換 (經典步驟)

    1. 確認主庫故障:通過監控系統確認主庫確實無法恢復。

    2. 選擇一個數據最超前的從庫作為新主庫:比較各個從庫的?Master_Log_File?和?Read_Master_Log_Pos(或GTID),選擇復制進度最新的一個。

    3. 確保老主庫的binlog全部被應用:如果老主庫服務器還能訪問,要將其上未傳輸的binlog備份并應用到新主庫。

    4. 提升從庫為新主庫

      • 在選中的從庫上執行?STOP SLAVE;?RESET SLAVE ALL;?(清除從庫信息)。

      • 執行?SHOW MASTER STATUS;?記錄新主庫的binlog位置。

    5. 將其它從庫指向新主庫

      • 在其它從庫上執行?CHANGE MASTER TO MASTER_HOST='new_master_ip', ...,指向新的主庫。

    6. 修改應用程序配置:將應用的寫數據源地址修改為新的主庫IP,然后重啟應用或使配置生效。

    7. 恢復老主庫:老主庫修復后,可以將其作為新主庫的一個從庫重新加入集群。

  2. 自動切換 (使用高可用工具)

    • 手動切換繁瑣且容易出錯,生產環境通常使用高可用工具自動完成,如?MHA (Master High Availability)Orchestrator?或?InnoDB Cluster

    • 這些工具能自動監控主庫狀態,自動選舉最優從庫,自動完成切換和重新配置其他從庫,大大提升恢復速度。


第三部分:補充高頻面試問題

7. 主從復制有哪幾種模式?有什么區別?
  • 基于語句的復制 (SBR - Statement-Based Replication)

    • 記錄的是執行的SQL語句本身

    • 優點:日志量小,節省帶寬。

    • 缺點:可能不安全,對于NOW(),?RAND(),?UUID()等非確定性函數,容易導致主從不一致。

  • 基于行的復制 (RBR - Row-Based Replication)

    • 記錄的是每一行數據是如何被修改的(例如,UPDATE操作會記錄修改前和修改后的整行數據)。

    • 優點:非常安全,絕對一致。

    • 缺點:日志量巨大(例如一個UPDATE語句更新了100萬行,RBR會記錄100萬條日志,而SBR只記錄1條SQL語句)。

  • 混合模式復制 (MBR - Mixed-Based Replication)

    • MySQL的默認模式。它自動選擇使用SBR還是RBR。絕大多數情況下使用SBR,只有當SQL可能引發不一致時(如使用了UUID()函數),才自動切換為RBR。

    • 優點:兼顧了安全和性能。

8. GTID 是什么?它有什么好處?
  • 是什么:GTID (Global Transaction Identifier) 是事務的全局唯一標識符,格式為?server_uuid:transaction_id

  • 好處

    1. 簡化復制:搭建主從時,不再需要指定復雜的?binlog文件名Position,只需要指定?MASTER_AUTO_POSITION=1

    2. 故障切換更方便:GTID清晰地標識了每個事務在所有服務器上的執行情況,可以輕松知道哪些事務已經被執行,哪些還沒有,避免了因為位點錯誤導致的數據不一致。

    3. 故障恢復更強大:即使主庫的binlog丟失,GTID也能幫助更好地構建復制關系。

9. 如何監控主從復制狀態?
  • 主要通過執行?SHOW SLAVE STATUS\G?命令查看關鍵指標:

    • Slave_IO_Running: I/O線程是否正常運行(Yes/No/Connecting)。

    • Slave_SQL_Running: SQL線程是否正常運行(Yes/No)。

    • Seconds_Behind_Master: 從庫延遲秒數,最重要的監控指標

    • Last_IO_Error?/?Last_SQL_Error: 最后的錯誤信息。

    • Master_Log_File?&?Read_Master_Log_Pos: I/O線程讀取到的主庫binlog位置。

    • Relay_Master_Log_File?&?Exec_Master_Log_Pos: SQL線程執行到的主庫binlog位置。

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

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

相關文章

HTML 中的 CSS 使用說明

CSS 使用說明 1. CSS 概述 CSS (Cascading Style Sheets) 是一種用于描述 HTML 或 XML&#xff08;包括如 SVG、MathML 等 XML 方言&#xff09;文檔呈現的樣式表語言。CSS 描述了元素應該如何在屏幕、紙張或其他媒體上顯示。 2. CSS 的基本語法 CSS 規則由兩個主要部分組成…

gitlab推送失敗,內存不足的處理

git提交時報錯&#xff1a; 2025-09-03 20:03:32.583 [info] > git push origin master:master [4866ms]2025-09-03 20:03:32.583 [info] fatal: Out of memory, malloc failed (tried to allocate 1048576000 bytes)看了下服務器內存&#xff0c;空余的只有幾百M了。 用hto…

【FastDDS】Discovery ( 05-Discovery Server Settings)

發現服務器設置 這種機制基于客戶端-服務器發現模式,即元流量(域參與者之間用于識別彼此的消息交換)由一個或多個服務器域參與者管理(左圖),而在簡單發現(右圖)中,元流量通過IP多播協議等消息廣播機制進行交換。有一款發現服務器工具可簡化發現服務器的設置和測試。 …

Xilinx ZYNQ 開發環境中搭建Qt環境

在 Xilinx ZYNQ 開發環境中搭建 Qt 環境,意味著你要開發運行在 ZYNQ 嵌入式 Linux 系統上的 GUI 應用程序。這比在 PC 上搭建 Qt 要復雜一些,因為它涉及交叉編譯:在你的 PC(主機)上編譯出能在 ZYNQ 芯片(目標機)的 ARM Cortex-A9 核心上運行的程序。 整個過程可以分為以…

【數學建模】用代碼搞定無人機煙幕:怎么擋導彈最久?

前言&#xff1a;歡迎各位光臨本博客&#xff0c;這里小編帶你直接手撕**&#xff0c;文章并不復雜&#xff0c;愿諸君耐其心性&#xff0c;忘卻雜塵&#xff0c;道有所長&#xff01;&#xff01;&#xff01;&#xff01; **&#x1f525;個人主頁&#xff1a;IF’Maxue-CSDN…

linux Kbuild詳解關于fixdep、Q、quiet、escsq

linux Kbuild詳解關于if_changed_rule的any-prereq和arg-check原理及info調試關于fixdep沒有展開&#xff0c;這里說下。 文章目錄1. escsq2. Q、quiet2. 1 make V(0、1、2&#xff09;2. 2 make V(0、1)來控制Q、quiet3. fixdep3. 1 fixdep是什么3. 2 fixdep為什么3.2.1 .conf…

notepad++ 正則表達式

在 Notepad 中&#xff0c;正則表達式&#xff08;Regular Expressions, Regex&#xff09; 是一個強大的搜索和替換工具&#xff0c;可以高效地處理文本。以下是 Notepad 正則表達式 的指南&#xff1a;1. 如何在 Notepad 中使用正則表達式打開搜索窗口&#xff1a;快捷鍵 Ctr…

MySQL Cluster核心優缺點

MySQL Cluster 是 MySQL 官方提供的 分布式、內存優先、高可用 的數據庫解決方案&#xff08;基于 NDB 存儲引擎&#xff09;。它采用 Share-Nothing 架構&#xff0c;數據自動分片&#xff08;Sharding&#xff09;并分布在多個節點上&#xff0c;適用于需要極高可用性和實時性…

訓練+評估流程

訓練評估流程1、要求2、訓練評估&#xff08;PyTorch TensorBoard &#xff09;完整代碼&#xff08;單文件示例&#xff09;運行方法功能對應表3、pytorch自定義評估要繼承哪個類&#xff1f;4、HF Trainer和SB35、 匯總1. PyTorch Lightning TensorBoard ModelCheckpoint …

【開題答辯全過程】以 基于Android的點餐系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

【音視頻】Http-FLV 介紹

一、Http-FLV 原理 HTTP-FLV 是基于 HTTP 協議的 FLV&#xff08;Flash Video&#xff09;流媒體傳輸方式。它使用 HTTP 協議而不是傳統的 RTMP 協議來傳輸 FLV 格式的視頻流。HTTP-FLV 在 Web 視頻直播場景中得到了廣泛應用&#xff0c;尤其是在不支持或不希望使用 RTMP 協議的…

uniapp vue頁面傳參到webview.nvue頁面的html或者另一vue中

在app內部使用 uni.$emit(collectiones, { data: gx });傳到webview.nvue頁面 在webview.nvue頁面接受 uni.$on(collectiones, (data) > {console.log(接收到的數據:, data.data);});使用evalJS方法 nvue webview通信示例 這塊使用receiveMessageFromNvue方法這樣傳入的 u…

美團大模型“龍貓”登場,能否重塑本地生活新戰局?

美團大模型“龍貓”登場&#xff0c;能否重塑本地生活新戰局&#xff1f; 美團大模型登場&#xff1a;行業投下重磅炸彈 在大模型技術迅猛發展的當下&#xff0c;每一次新模型的發布都如投入湖面的石子&#xff0c;激起層層漣漪。美團推出的龍貓大模型 LongCat-Flash&#xff0…

shell(十三)參數代換

shell參數代換xargs. 產生命令的參數1. cut -d : -f 1 /etc/passwd | head -n 3 | xargs finger2. 執行前詢問用戶cut -d : -f 1 /etc/passwd | head -n 3 | xargs -p finger如果直接按回車就退出3. 指定查閱參數個數cut -d : -f 1 /etc/passwd | xargs -p -n 5 finger4. 指定遇…

Proteus 仿真 + STM32CubeMX 協同開發全教程:從配置到仿真一步到位

為幫助你精準掌握「Proteus 仿真 STM32CubeMXSTM32F103R6」的協同開發流程&#xff0c;本文將聚焦該芯片的特性&#xff0c;從工具適配、分步實操到進階案例&#xff0c;用富文本格式清晰呈現細節&#xff0c;尤其適合新手入門 32 位單片機開發&#xff1a;ProteusSTM32CubeMX…

WIN10+ubuntu22.04.05雙系統裝機教程

最近DIY了一臺5070TI顯卡主機&#xff0c;目的是跑IsaacSim5.0仿真&#xff0c;記錄雙系統裝機過程。 1.Ubuntu22.04.05系統盤制作 參考教程&#xff1a;01_【U盤制作ubuntu22.04啟動盤并為電腦安裝系統記錄】_制作ubuntu22.04安裝u盤-CSDN博客 U盤因為是64G的&#xff0c;而…

構建高可用二級緩存系統

二級緩存機制原理詳解1. 整體架構MyBatis-Plus二級緩存采用裝飾器模式實現&#xff0c;核心組件包括&#xff1a;?Cache接口?&#xff1a;定義緩存基本操作?PerpetualCache?&#xff1a;基礎緩存實現&#xff08;HashMap&#xff09;?裝飾器?&#xff1a;如LruCache、Fif…

MacOS微信雙開,親測有效

本機配置打開終端運行以下命令 第一步&#xff1a;sudo cp -R /Applications/WeChat.app /Applications/WeChat2.app第二步&#xff1a;sudo /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.tencent.xinWeChat2" /Applications/WeChat2.app/Contents/Info…

Drupal XSS漏洞復現:原理詳解+環境搭建+滲透實踐(CVE-2019-6341)

目錄 一、Drupal XSS漏洞 二、環境搭建 1、確保系統已安裝 Docker 和 Docker-Compose 2、下載 Vulhub 3、進入漏洞環境 4、啟動漏洞環境 5、查看環境狀態 6、初始化Drupal環境 &#xff08;1&#xff09;訪問 Drupal 安裝頁面 &#xff08;2&#xff09;完成圖形化安…

Redis復制延遲全解析:從毫秒到秒級的優化實戰指南

Redis主從延遲飆升導致數據不一致&#xff1f;訂單丟失、緩存穿透頻發&#xff1f;本文深入剖析8大復制延遲元兇&#xff0c;并提供解決方案&#xff0c;讓你的復制延遲從秒級降到毫秒級&#xff01; 一、復制延遲:分布式系統的隱形殺手 ?? 什么是復制延遲&#xff1f; 當主…