Mysql 主從集群同步延遲問題怎么解決

主從復制工作原理類比

假設主庫是快遞總倉,從庫是各個分店的倉庫:

  1. 總倉每次發貨/退貨都會記錄快遞單(binlog)

  2. 分店派快遞員(I/O線程)去總倉取快遞單

  3. 總倉安排一個打包員(binlog dump線程)把快遞單復印件給分店

  4. 分店把收到的快遞單貼在分店的記事本上(relay log)

  5. 分店理貨員(SQL線程)按記事本的記錄更新庫存

延遲問題就像:分店收到快遞單復印件的時間晚,或者理貨員處理速度慢,導致分店庫存顯示「有貨」,實際貨物還沒到店。


解決方案及實際案例

1. 一主多從:分擔壓力

場景:電商網站有10萬用戶同時查詢商品庫存
問題:單個從庫處理不過來,導致查詢延遲
解決

主庫(總倉) ---> 從庫1(北京分店)  ---> 從庫2(上海分店)  ---> 從庫3(廣州分店)

用戶訪問時隨機選擇一個從庫查詢,壓力從1個變成3個分擔


2. 強制走主庫查詢:強一致性

場景:用戶剛支付完訂單,立即要查看訂單狀態
問題:從庫可能還沒同步支付成功的狀態
代碼示例(偽代碼):

def get_order_status(order_id):if 訂單操作發生在3秒內:  # 可能有延遲return query_master()  # 強制查主庫else:return query_slave()  # 查從庫

3. 監控延遲并等待

場景:財務系統導出報表需要最新數據
操作

SHOW SLAVE STATUS\G
-- 結果中的Seconds_Behind_Master: 5 表示延遲5秒

處理邏輯

while True:delay = get_slave_delay()  # 獲取從庫延遲if delay < 1:  # 延遲小于1秒breaksleep(delay)  # 等待延遲時間
execute_query()   # 執行查詢

4. 并行復制:提升處理效率

傳統方式
分店只有1個理貨員,必須按順序拆包裹(單線程執行SQL)

并行復制
分店雇了3個理貨員,分別處理不同貨架的包裹(多線程并行)
配置方法(MySQL5.7+):

# 在從庫配置
slave_parallel_workers = 4  # 啟動4個工作線程
slave_parallel_type = LOGICAL_CLOCK  # 按事務分組并行

極端情況解決方案

強一致性場景:銀行轉賬必須100%同步
替代方案

  • 使用Paxos/Raft協議(如TiDB、OceanBase等分布式數據庫)

  • 代價:犧牲部分寫入性能,增加網絡開銷


真實延遲案例模擬

主庫操作

-- 執行一個耗時操作(模擬大事務)
UPDATE huge_table SET price=price*1.1; -- 更新100萬條數據

從庫現象

SHOW SLAVE STATUS\G
Seconds_Behind_Master: 120  -- 延遲2分鐘

解決方案

  • 主庫拆分大事務:每次更新1萬條,分100次執行

  • 從庫開啟并行復制

  • 從庫升級CPU和SSD硬盤

Binlog(Binary Log)是 MySQL 數據庫中的一種二進制日志文件,它具有以下重要作用:

數據恢復

  • 當數據庫出現故障,如硬件故障、軟件錯誤、誤操作等導致數據丟失或損壞時,binlog 可以用于數據恢復。通過解析 binlog 文件,DBA 可以將數據庫從故障點恢復到某個特定的時間點或位置,從而最大程度地減少數據丟失。例如,若某個用戶誤刪了一張重要表,DBA 可以根據 binlog 中記錄的操作順序和內容,將數據庫恢復到刪除操作之前的狀態。

主從復制

  • 在 MySQL 主從復制架構中,binlog 起著核心作用。主服務器將數據庫的更改操作記錄在 binlog 中,從服務器通過讀取主服務器的 binlog,并在本地重放這些操作,從而實現與主服務器的數據同步。這樣可以實現數據的冗余備份,提高系統的可用性和數據的安全性,同時還可以分擔主服務器的讀壓力,提升系統的整體性能。比如,在一個高并發的電商系統中,通過主從復制可以將讀操作分發到從服務器上,減輕主服務器的負擔。

數據審計

  • binlog 記錄了數據庫所有的更改操作,包括對數據的插入、更新、刪除以及對表結構的修改等。這為數據庫的操作審計提供了詳細的信息,DBA 或安全管理員可以通過分析 binlog 來追蹤數據庫的操作歷史,檢查是否存在異常操作或違規行為,有助于維護數據庫的安全性和完整性。例如,當發現數據庫中的某些敏感數據被修改時,可以通過查看 binlog 來確定是誰在什么時間進行了操作。

分析數據庫操作

  • 開發人員和 DBA 可以通過分析 binlog 來了解數據庫的實際操作情況,包括哪些 SQL 語句被執行得最頻繁、數據的變化趨勢等。這有助于對數據庫的性能進行優化,例如可以根據 binlog 中記錄的查詢語句來優化索引,提高查詢效率,或者發現一些可能導致性能問題的復雜操作,進而進行調整和優化。

數據遷移與同步

  • 在數據庫遷移或不同系統之間的數據同步場景中,binlog 可以作為數據傳輸的一種有效方式。可以根據 binlog 中的數據變更記錄,將數據從一個數據庫系統遷移到另一個數據庫系統,或者在多個異構系統之間實現數據的實時同步。比如,將 MySQL 數據庫中的數據同步到 Hadoop 大數據平臺中進行數據分析,就可以利用 binlog 來捕獲數據的變化并進行相應的處理。

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

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

相關文章

ASP.NET Core 簡單文件上傳

使用異步 JavaScript 和 XML&#xff08;AJAX&#xff09;進行簡單的文件上傳&#xff1b;用 C# 編寫的服務器端代碼。 使用AJAX和ASP.NET Core MVC上傳文件再簡單不過了。這不依賴于jQuery。此代碼允許上傳多個文件&#xff0c;并與 .NET Core 3.1、.NET 6和.NET 8兼容。 如果…

iOS指紋歸因詳解

iOS 指紋歸因&#xff08;Fingerprint Attribution&#xff09;詳解 1. 指紋歸因的概念 指紋歸因&#xff08;Fingerprint Attribution&#xff09;是一種無 ID 歸因&#xff08;ID-less Attribution&#xff09;技術&#xff0c;主要用于廣告跟蹤、用戶識別或流量分析。它基…

GMII(Gigabit Media Independent Interface)詳解

一、GMII的定義與作用 GMII&#xff08;千兆介質無關接口&#xff09;是用于千兆以太網&#xff08;1Gbps&#xff09;的標準化接口&#xff0c;連接 MAC層&#xff08;數據鏈路層&#xff09;與 PHY芯片&#xff08;物理層&#xff09;。其核心目標是支持高速數據傳輸&#x…

C++對象模型之C++額外成本

1.介紹 C與C最大的區別&#xff0c;無疑在于面向對象&#xff0c;面向對象編程給C帶來了強大的特性和靈活性。但同時也帶來了一定的運行時和編譯時的開銷。下面介紹C對象模型的額外成本及其來源。 2.C的額外成本 &#xff08;1&#xff09;虛函數和動態多態的成本 虛函數表&am…

【Excel】【VBA】根據內容調整打印區域

Excel VBA&#xff1a;自動調整打印區域的實用代碼解析 在Excel中&#xff0c;我們經常需要調整打印區域。今天介紹一段VBA代碼&#xff0c;它可以根據C列的內容自動調整打印區域。 Dim ws As Worksheet Dim lastRow As Long Dim r As Long 設置當前工作表 Set ws ActiveSh…

【關于seisimic unix中使用suedit指令無法保存問題】

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、如何修改頭文件二、出現的問題嘗試解決使用ls顯示文件屬性使用chmod修改文件屬性 總結 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff…

微前端qiankun打包部署

官網&#xff1a;API 說明 - qiankun 前提&#xff1a;后臺項目&#xff0c;在主應用設置菜單&#xff0c;微應用渲染組件&#xff0c;沒有使用路由跳轉loadMicroApp 1.token需要使用setGlobalState&#xff0c;傳參或者方法用的setGlobalState 2.打包沒有使用Nginx 3.有需…

POST請求提交數據的三種方式及通過Postman實現

1、什么是POST請求&#xff1f; POST請求是HTPP協議中一種常用的請求方法&#xff0c;它的使用場景是向客戶端向服務器提交數據&#xff0c;比如登錄、注冊、添加等場景。另一種常用的請求方法是GET&#xff0c;它的使用場景是向服務器獲取數據。 2、POST請求提交數據的常見編…

【一起學Rust | 框架篇 | Tauri2.0框架】在Tauri應用中設置Http頭(Headers)

文章目錄 前言一、配置準備1. 檢查版本2. 使用條件3. 支持的請求頭&#xff08;并不是全部支持&#xff09; 二、使用步驟1. 如何配置header2. 框架集成1. 對于Vite系列、Nuxt、Next.js這種前端框架Vite系列框架Angular系列框架Nuxt系列框架Next.js系列框架 2. 對于Yew和Leptos…

Uniapp 開發中遇到的坑與注意事項:全面指南

文章目錄 1. 引言Uniapp 簡介開發中的常見問題本文的目標與結構 2. 環境配置與項目初始化環境配置問題解決方案 項目初始化注意事項解決方案 常見錯誤與解決方案 3. 頁面與組件開發頁面生命周期注意事項示例代碼 組件通信與復用注意事項示例代碼 樣式與布局問題注意事項示例代碼…

【藍橋杯集訓·每日一題2025】 AcWing 6135. 奶牛體檢 python

6135. 奶牛體檢 Week 1 2月21日 農夫約翰的 N N N 頭奶牛站成一行&#xff0c;奶牛 1 1 1 在隊伍的最前面&#xff0c;奶牛 N N N 在隊伍的最后面。 農夫約翰的奶牛也有許多不同的品種。 他用從 1 1 1 到 N N N 的整數來表示每一品種。 隊伍從前到后第 i i i 頭奶牛的…

算法系列之搜素算法-二分查找

在算法中&#xff0c;查找算法是處理數據集合的基礎操作之一。二分查找&#xff08;Binary Search&#xff09;是一種高效的查找算法&#xff0c;適用于有序數組或列表。本文將介紹二分查找的基本原理、Java實現。 二分查找介紹 二分查找是一種在有序數組中查找特定元素的算法…

JVM生產環境問題定位與解決實戰(三):揭秘Java飛行記錄器(JFR)的強大功能

提到飛行記錄器&#xff0c;或許你的腦海中并未立刻浮現出清晰的畫面&#xff0c;但一說起“黑匣子”&#xff0c;想必大多數人都能恍然大悟&#xff0c;知曉其重要性及用途。在航空領域&#xff0c;黑匣子作為不可或缺的設備&#xff0c;默默記錄著飛行過程中的每一項關鍵數據…

C#開發——ConcurrentDictionary集合

ConcurrentDictionary<TKey, TValue> 是 C# 中一個專為多線程場景設計的線程安全字典集合&#xff0c;位于 System.Collections.Concurrent 命名空間中。它允許多個線程同時對字典進行讀寫操作&#xff0c;而無需額外的同步措施。 一、集合特征 此集合有如下特征…

Unity百游修煉(2)——Brick_Breaker詳細制作全流程

一、項目簡介 Brick Breaker 是一款經典的打磚塊游戲&#xff0c;本次案例將使用 Unity 引擎來實現該游戲的核心功能。 游戲畫面如下&#xff1a; Brick_ breaker 二、項目結構概覽和前期準備 &#xff08;1&#xff09;在 Unity 項目視圖中&#xff0c;我們可以看到幾個重要…

KubeSphere平臺安裝

KubeSphere簡介 KubeSphere 是一款功能強大的容器管理平臺&#xff0c;以下是其簡介&#xff1a; 1&#xff09;基本信息 開源項目&#xff1a;基于 Apache-2.0 授權協議開源&#xff0c;由 Google Go、Groovy、HTML/CSS 和 Shell 等多種編程語言開發。基礎架構&#xff1a;…

UE5銷毀Actor,移動Actor,簡單的空氣墻的制作

1.銷毀Actor 1.Actor中存在Destory()函數和Destoryed()函數 Destory()函數是成員函數&#xff0c;它會立即標記 Actor 為銷毀狀態&#xff0c;并且會從場景中移除該 Actor。它會觸發生命周期中的銷毀過程&#xff0c;調用 Destroy() 后&#xff0c;Actor 立即進入銷毀過程。具體…

Hadoop 基礎原理

Hadoop 基礎原理 基本介紹Hadoop 的必要性Hadoop 核心組件Hadoop 生態系統中的附加組件 HDFSHDFS 集群架構HDFS 讀寫流程HDFS 寫流程HDFS 讀流程 NameNode 持久化機制 MapReduce底層原理示例 Hadoop 是一個由 Apache 基金會開發的分布式系統基礎架構&#xff0c;主要解決海量數…

Linux編輯器

1.三種模式 2.圖例 3.wq 4.光標的使用

2.24DFS和BFS刷題

洛谷P2895&#xff1a;用BFS走出危險區域&#xff0c;危險區域存在時間&#xff0c;我們用ma記錄最快變成危險區域的時間&#xff0c; 然后每次枚舉時間1然后跟ma數組比較看能不能走&#xff0c;然后時間復雜度為O(305^2)。 #include<iostream> #include<cstring>…