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.mzph.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>…