MySQL高可用改造之數據庫開發規范(大事務與數據一致性篇)

文章目錄

    • 一、前言
    • 二、延遲的原因
    • 三、大事務處理規范
      • 3.1. 刪除類操作優化設計
      • 3.2. 大事務通用拆分原則
    • 四、數據一致性核對規范
      • 4.1. 主從變更記錄識別方法
    • 五、小結

一、前言

MySQL 高可用架構中最基礎、最為核心的內容:MySQL 復制(Replication),數據庫復制本質上就是數據同步。MySQL 數據庫是基于二進制日志(binary log)進行數據增量同步,而二進制日志記錄了所有對于MySQL 數據庫的修改操作。

很多時候我們會發現,MySQL 的主從復制會存在主從數據延遲的問題,甚至會導致讀寫分離架構設計在業務層出現較為嚴重的問題,比如遲遲無法讀取到主庫已經插入的數據。

所以本文,我們就如何從數據庫設計避免這個令人頭疼的問題。

二、延遲的原因

MySQL 復制基于的二進制日志是一種邏輯日志,其寫入的是每個事務中已變更的每條記錄的前項、后項。有了每條記錄的變化內容,用戶可以方便地通過分析 MySQL 的二進制日志內容。邏輯日志簡單易懂,方便數據之間的同步,但它的缺點是:事務不能太大,否則會導致二進制日志非常大,一個大事務的提交會非常慢。

假設有個 DELETE 刪除操作,刪除當月數據,由于數據量可能有 1 億條記錄,可能會產生 100G 的二進制日志,則這條 SQL 在提交時需要等待 100G 的二進制日志寫入磁盤,如果二進制日志磁盤每秒寫入速度為 100M/秒,至少要等待 1000 秒才能完成這個事務的提交。

三、大事務處理規范

核心原則:避免大事務(單次操作涉及大量數據或長時間持有鎖),以降低提交延遲、減少主從復制延遲風險,并提升系統整體并發能力。

3.1. 刪除類操作優化設計

(1)優先采用物理拆分替代邏輯刪除

  • 適用場景:針對流水表、日志表等歷史數據定期清理需求。
  • 規范要求:
    • 設計階段將此類表按時間維度分表(如按月分表)或分區(如按天/月分區),例如:
    -- 分表示例:按月分表(logs_202401、logs_202402...)CREATE TABLE logs_202401 (...); CREATE TABLE logs_202402 (...);-- 分區表示例:按月份范圍分區CREATE TABLE logs (id INT,log_time DATETIME,...) PARTITION BY RANGE (YEAR(log_time)*100 + MONTH(log_time)) (PARTITION p202401 VALUES LESS THAN (202402),PARTITION p202402 VALUES LESS THAN (202403),...);
  • 刪除操作直接通過 DROP TABLE(分表)或 ALTER TABLE … DROP PARTITION(分區)實現,二進制日志(binlog)僅記錄一條元數據操作,寫入速度快且不占用大量日志空間。

      -- 分表刪除:直接刪除整月表(瞬時完成)DROP TABLE logs_202312;-- 分區刪除:移除指定月份分區(高效且可快速回收空間)ALTER TABLE logs DROP PARTITION p202312;
    

(2)未分表/分區時的拆分策略(應急方案)

  • 若因歷史原因無法分表/分區,需通過小事務分批刪除替代單條大事務 DELETE:

    • 拆分方法:添加 LIMIT 子句限制單次刪除條數(如每次1000條),結合時間范圍條件逐步清理。
      -- 示例:每次刪除2024年1月內1000條記錄,循環執行直至完成DELETE FROM logs WHERE log_time BETWEEN '2024-01-01 00:00:00' AND '2024-01-31 23:59:59'LIMIT 1000;
  • 優勢:

    • 單次事務量小,減少鎖持有時間(避免長時間阻塞其他會話)。
    • 降低二進制日志(binlog)體積,避免因大事務日志過大導致主從同步延遲。
    • 支持并發執行:可通過多線程/多連接分片刪除不同時間范圍或ID段的數據(需確保無重疊),提升清理效率。

3.2. 大事務通用拆分原則

  • 核心要求:單次事務操作的數據量需控制在合理范圍內(建議單事務影響行數≤1萬條,具體根據業務負載調整)。

  • 典型場景:

    • 批量數據插入/更新/刪除時,通過循環或分片拆分為多個小事務(如每次處理1000~5000條)。
    • 避免在事務中執行耗時操作(如網絡請求、復雜計算),減少鎖持有時間。
  • 示例(批量更新拆分):

    -- 原始大事務(風險高):一次性更新10萬條記錄
    -- UPDATE orders SET status = 'completed' WHERE create_time < '2024-01-01';-- 拆分后小事務(推薦):每次更新5000條
    UPDATE orders 
    SET status = 'completed' 
    WHERE create_time < '2024-01-01' 
    LIMIT 5000;-- 循環執行直至受影響行數為0(可通過程序控制)
    

四、數據一致性核對規范

4.1. 主從變更記錄識別方法

  • 設計要求:所有業務表必須包含 last_modify_date 字段(或類似的時間戳字段,如 update_time),用于記錄每條數據的最后修改時間(建議默認值為 CURRENT_TIMESTAMP,并通過觸發器或應用邏輯保證更新時自動維護)。
  CREATE TABLE example (id INT PRIMARY KEY,data VARCHAR(255),last_modify_date DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
  • 核對流程:

    1. 定位變更記錄:通過 last_modify_date 過濾出主庫上最近一段時間內(如最近1小時/1天)被修改的數據。
    -- 示例:查詢主庫上2024-06-01 00:00:00后更新的所有記錄SELECT * FROM example WHERE last_modify_date >= '2024-06-01 00:00:00';
  1. 逐條比對:將主庫查詢結果與從庫對應表的數據進行字段級比對(可通過程序腳本實現),確認關鍵字段(如業務狀態、金額等)是否一致。
  2. 異常處理:若發現不一致,需記錄差異詳情并觸發告警,由運維或開發人員排查原因(如主從延遲、業務邏輯錯誤等)。

五、小結

通過以上規范,可有效控制大事務風險,保障MySQL數據庫高可用架構的性能、可用性與數據一致性。

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

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

相關文章

第9節 大模型分布式推理核心挑戰與解決方案

文章目錄 # 前言 一、通信瓶頸突破:讓數據“跑”得更快 1. 問題:通信為什么會成為瓶頸? 2. 解決方案:從硬件到算法的全鏈路優化 (1)硬件層:升級“高速公路” (2)算法層:給數據“瘦身”并“錯峰出行” (3)架構層:讓數據“少跑路” 3. 效果評估:如何判斷通信瓶頸已…

ESP32開發板接4陣腳屏幕教程(含介紹和針腳編號對應)

“4針屏幕” 一般有兩種常見類型&#xff1a;IC 屏幕&#xff08;如 0.96" OLED、SSD1306 等&#xff09; 4 個針腳通常是&#xff1a;VCC → 接 ESP32 的 3.3V&#xff08;有的屏幕支持 5V&#xff09;GND → 接 ESP32 的 GNDSCL&#xff08;時鐘&#xff09;→ 接 ESP32…

2025 年國內可用 Docker 鏡像加速器地址

文章目錄一、加速器地址搭建 Docker 鏡像源二、使用一、加速器地址 docker.1ms.rundocker.domys.ccdocker.imgdb.dedocker-0.unsee.techdocker.hlmirror.comcjie.eu.orgdocker.m.daocloud.iohub.rat.devdocker.1panel.livedocker.rainbond.cc 搭建 Docker 鏡像源 以上鏡像源…

[Robotics_py] 路徑規劃算法 | 啟發式函數 | A*算法

第五章&#xff1a;路徑規劃算法 歡迎回來&#xff0c;未來的機器人專家&#xff0d;&#xff1d;≡(?ω?) 在之前的章節中&#xff0c;我們已為機器人配備了核心知識&#xff1a;它能夠跟蹤自身的機器人狀態/位姿&#xff0c;利用環境表示&#xff08;柵格地圖&#xff09;理…

解決 HTTP 請求 RequestBody 只能被讀取一次的問題

簡介 HTTP 請求 RequestBody 只能被讀取一次&#xff1a;HttpServletRequest 的輸入流 (InputStream) 在被讀取后會被關閉&#xff0c;導致后續無法再次讀取。本文將介紹如何通過 請求包裝類 (RequestWrapper) 來解決這個問題。問題背景 當我們需要在以下場景中多次讀取 Reques…

(LeetCode 面試經典 150 題) 226. 翻轉二叉樹 (深度優先搜索dfs )

題目&#xff1a;226. 翻轉二叉樹 思路:深度優先搜索dfs&#xff0c;時間復雜度0(n)。 C版本&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr)…

2025牛客暑期多校訓練營3(FDJAEHB)

題目鏈接&#xff1a;牛客競賽_ACM/NOI/CSP/CCPC/ICPC算法編程高難度練習賽_牛客競賽OJ F Flower 思路 可知當n<a時無論怎么操作她都會離開 n%(ab&#xff09;是指進行完若干輪之后剩下的不足ab個&#xff0c;如果是>a的話那么最后一輪必然不在a中&#xff0c;否則就…

【KO】 Android基礎

以下是對這些 Android 相關問題的解答: 1. Activity 與 Fragment 之間常見的幾種通信方式 接口回調:Fragment 定義接口,Activity 實現該接口,Fragment 通過接口實例調用方法傳遞數據 。 使用 Bundle:Fragment 可通過 setArguments(Bundle) 傳數據給自身,Activity 可在創…

Gradle構建工具教程:由來與發展史(版本演進與未來優勢)

一、Gradle簡介Gradle是一個基于Apache Ant和Apache Maven概念的項目自動化構建開源工具&#xff0c;使用基于Groovy的領域特定語言&#xff08;DSL&#xff09;聲明項目設置。相較于傳統XML配置&#xff0c;這種DSL使構建腳本更簡潔易讀。Gradle支持Java、Groovy、Kotlin、Sca…

@Rancher簡介部署使用 - Docker Compose

Rancher 安裝和使用介紹 - Docker Compose 文章目錄Rancher 安裝和使用介紹 - Docker Compose1. Rancher 簡介1.1 什么是 Rancher1.2 Rancher 核心功能1.3 Rancher 架構2. 安裝前準備2.1 系統要求2.2 環境準備3. 使用 Docker Compose 安裝 Rancher3.1 創建 Docker Compose 文件…

程序員接私活的一些平臺和建議,千萬要注意,別掉坑里!

關于程序員接私活&#xff0c;社會各界說法不一&#xff0c;如果你確實急用錢&#xff0c;價格又合適&#xff0c;那就去做。 不過&#xff0c;私活也沒有那么好做&#xff0c;一般私活的性價比遠比上班拿工資的低。但是作為一個額外的收益渠道&#xff0c;一部分生活窘迫的程序…

多輪問答與指代消解

目錄引言一、LangChain是怎么實現的多輪問答1、記憶模塊&#xff08;Memory&#xff09;管理對話歷史?2、對話鏈&#xff08;Conversational Chain&#xff09;架構?3、智能體&#xff08;Agent&#xff09;決策機制?4、上下文感知的Prompt工程?5、RAG&#xff08;檢索增強…

文件IO、文件IO與標準IO的區別

一、文件IO --->fd&#xff08;文件描述符&#xff09;打開文件open讀、寫文件read/write關閉文件close#include <sys/types.h>#include <sys/stat.h>#include<fcntl.h>文件描述符&#xff1a;操作系統中已打開文件的標識符。小的、非負的整形數據范圍&am…

【模型剪枝2】不同剪枝方法實現對 yolov5n 剪枝測試及對比

目錄 一、背景 二、剪枝 1. Network Slimming 1.0 代碼準備 1.1 稀疏化訓練 1.2 剪枝 1.3 微調 1.4 測試總結 2. Torch Pruning&#xff08;TP&#xff09; 2.1 MagnitudePruner 2.1.1 剪枝 2.1.2 retrain 2.1.3 測試總結 2.2 SlimmingPruner 2.2.1 定義重要性評…

AI入門學習--AI模型評測

一、AI模型評測目標傳統質量主要關注功能、性能、安全、兼容性等。 AI模型評測在此基礎上,引入了全新的、更復雜的評估維度: 1.性能/準確性:這是基礎,在一系列復雜的評測基準上評價個性能指標。 2.安全性:模型是否可能被用于惡意目的?是否會生成有害、違法或有毒的內容?是否容…

nt!MmCreatePeb函數分析之peb中OSMajorVersion的由來

第一部分&#xff1a;NTSTATUS MmCreatePeb (IN PEPROCESS TargetProcess,IN PINITIAL_PEB InitialPeb,OUT PPEB *Base) {PPEB PebBase;PebBase->OSMajorVersion NtMajorVersion;PebBase->OSMinorVersion NtMinorVersion;PebBase->OSBuildNumber (USHORT)(NtBuildN…

Unity TimeLine使用教程

1.概述 Timeline 是一個基于時間軸的序列化編輯工具&#xff0c;主要用于控制游戲或動畫中的 過場動畫&#xff08;Cutscenes&#xff09;、劇情事件、角色動畫混合、音頻控制 等。它類似于視頻編輯軟件&#xff08;如 Adobe Premiere&#xff09;的時間線&#xff0c;但專門針…

數據分析基本內容(第二十節課內容總結)

1.pd.read_csv(一個文件.csv)&#xff1a;從本地文件加載數據&#xff0c;返回一個 DataFrame 對象&#xff0c;這是 pandas 中用于存儲表格數據的主要數據結構2.df.head()&#xff1a;查看數據的前五行&#xff0c;幫助快速了解數據的基本結構和內容3.df.info()&#xff1a;查…

2025年最新原創多目標算法:多目標酶作用優化算法(MOEAO)求解MaF1-MaF15及工程應用---盤式制動器設計,提供完整MATLAB代碼

一、酶作用優化算法 酶作用優化&#xff08;Enzyme Action Optimizer, EAO&#xff09;算法是一種2025年提出的新型仿生優化算法&#xff0c;靈感源于生物系統中酶的催化機制&#xff0c;發表于JCR 2區期刊《The Journal of Supercomputing》。其核心思想是模擬酶與底物的特異性…

用 COLMAP GUI 在 Windows 下一步步完成 相機位姿估計(SfM) 和 稀疏點云重建的詳細步驟:

使用 COLMAP GUI 進行 SfM 和稀疏點云重建的步驟1. 打開 COLMAP GUI運行 colmap.bat&#xff0c;會彈出圖形界面。2. 新建項目&#xff08;或打開已有項目&#xff09;點擊菜單欄的 File > New Project&#xff0c;選擇一個空文件夾作為項目目錄&#xff08;建議新建一個空目…