文章目录

    • 一、前言
    • 二、延迟的原因
    • 三、大事务处理规范
      • 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;建议新建一个空目…