【MySQL】MySQL复制原理与主备一致性同步工作原理解析(原理篇)(MySQL专栏启动)

news2024/12/24 2:34:42

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

      

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

      

🏆 InfoQ签约作者、CSDN专家博主/后端领域优质创作者/内容合伙人、阿里云专家/签约博主、51CTO专家 🏆

     

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 

 

本文目录

本文目录

本文导读

一、MySQL 数据库复制原理

1、基于语句的复制

2、基于行的复制

3、两种复制方式的比较与生产环境使用

3.1、基于sql的复制优缺点

3.2、基于行的复制模式的优缺点

二、MySQL 主备一致性原理

1、主/备切换过程

2、MySQL 的sql语句同步内部工作原理

3、MySQL 循环复制问题

总结


本文导读

本文基于《MySQL复制与高可用水平扩展架构实战》扩展其复制的原理以及切换一致性问题。还没看基础的读者们请先行了解这篇基础的MySQL复制详解与实战。本文主要对 MySQL 复制原理与主备一致性同步工作原理解析。

一、MySQL 数据库复制原理

本文基于《MySQL复制与高可用水平扩展架构实战》扩展其复制的原理以及切换一致性问题。还没看基础的读者们请先行了解这篇基础的MySQL复制详解与实战。

1、基于语句的复制

MySQL 5.0和更早版本只支持基于语句的复制,也称为逻辑复制,这在数据库领域很少见。

在基于语句的复制模式中,主数据库记录导致数据更改的查询,当备用数据库读取并重放这些事件时,它实际上再次执行在主数据库上执行的SQL。

好处有很多,一是记录和执行这些语句可以保持活动和备用同步;二是二进制日志中的事件更紧凑,因此相对而言,基于语句的模式不会使用太多带宽。更新TB数据的语句在二进制日志中只能占用几十个字节。

不好的地方也有几点,一是主数据库上的数据更新可能取决于除执行语句之外的其他因素(例如时间戳);二是存在着一些无法被正确复制的 SQL(例如 MySQL中的CURRENT_USER()函数用于返回MySQL帐户的用户名和主机名,或者使用基于语句的复制模式时,存储过程和触发器也可能存在问题);

三是更新必须是串行化,这就需要更多的锁。

2、基于行的复制

基于行复制,该方法将实际数据记录在二进制日志中。

基于行复制,可以正确复制每一行,并且可以更有效地复制某些语句,因为不需要重放更新数据库数据的查询操作,所以可以使用基于行的复制模式来更有效地复制数据,并且重放查询可能会很昂贵。

-- 这时基于行的复制就会复制 SELECT 语句
INSERT INTO stable();
SELECT * FROM stable where id ='';

没有一种模式适合所有情况,所有MySQL可以在两种复制模式之间动态切换。

默认情况下,使用基于语句的复制模式,如果无法正确复制语句,会自动切换到基于行的复制模式。

MySQL 还可以将会话级别变量设置为 binlog_format(二进制格式),以控制二进制日志格式。

对于基于行的复制,时间点恢复很困难,但并非不可能。稍后第二节讲到日志服务器将有所帮助。

3、两种复制方式的比较与生产环境使用

在实际生产环境我们一般会使用基于行的复制,因为这种方法可以比较读多写少很多无效的sql,

但是如果数据库版本太低,就只有基于sql的复制方式。

3.1、基于sql的复制优缺点

优点:

1、当主备模式不同时逻辑复制可以在各种条件下工作,基于语句的复制更灵活。

2、基于语句的复制过程基本上是执行SQL语句,以易于理解的方式在跑步过程中发生的变化,当出现问题时,可以很好地定位

缺点:

MySQL一些情况下无法复制基于语句的模式。存储过程、触发器存在一些复制的错误。简单地说:如果有使用触发器或存储过程,不能使用基于语句的复制模式。

3.2、基于行的复制模式的优缺点

优点:

1、基于行的复制模式无法处理的场景几乎没有(包括SQL构造、触发器、存储过程等都可以执行)。

2、可以减少锁的使用,因为它不要求这串行化是可重复的

3、基于行的复制模式只会记录数据更改,因此二进制日志中记录的实际上是主数据库上已更改的数据。

此模式可以更清楚地知道服务器上发生了什么更改,并更好地记录数据更改。基于行的二进制日志还记录更改之前的数据,有利于某些数据恢复。

缺点:

由于执行过的 sql 语句未记录在日志中,因此无法确定执行了哪些SQL语句,只知道数据行中的更改。

二、MySQL 主备一致性原理

1、主/备切换过程

在的主/备切换过程,图1中,客户端读取和写入都直接访问 DB1,而 DB2 是 DB1 的备用数据库,并且仅同步 DB1 的更新并在本地执行它们,这样, DB2 和 DB1 的数据可以保持相同。虽然 DB2 未被直接访问,但我仍然建议您将 DB2 设置为只读模式

当需要切换时,将切换到图2。此时,客户端将读取和写入节点 DB2,而 DB1 是 DB2 的备用数据库。

2、MySQL 的sql语句同步内部工作原理

在从客户端接收到更新请求后,主库执行内部事务的更新逻辑并写入undo log、bin log、redo log。

备库和主库之间保持长连接,主数据库A内有一个线程 dump_thread,用于服务备库的长连接。

具体流程如下,在备用数据库上,使用 change-master (更改主机)命令设置主数据库 的IP、端口、用户名和密码,以及请求bin log的位置(此位置包括文件名和日志偏移量)。

在备用数据库上执行 start slave (启动从属设备)命令。此时,备用数据库将启动两个线程,即figure_Thread(图形线程)和sql_Thread(sql线程)中显示的 io 其中 io_Thread 负责与主库建立连接。

主库校验完用户名、密码后,开始按照备库传过来的位置,从本地读取 bin log,发给从库。

获取 bin log后,备用数据库将其写入本地文件,该文件称为 relay log (中继日志)。sql_Thread 读取传输日志,解析日志中的命令并执行。

3、MySQL 循环复制问题

双主结构(MM模式)中,客户端在 主库A 上更新了一条语句,然后再把生成的 bin log 发送到主库 B,节点 B 执行完这条更新语句后也会生成 bin log。这时主库 A,不知道这是 B库的同步当成新的执行操作就会发生循环复制问题。

如何解决呢?

首先设置两个数据库的服务器ID不同。如果相同,则不能设置为主/备用关系;

当备用数据库接收到 bin log 并重放它时,它会生成一个新的 bin log,其服务器ID与原始binlog相同;

每个数据库收到自己主数据库发送的日志后,首先判断服务器ID。如果与自己的ID相同,则表示bin log 日志是自己生成的,将直接丢弃。

总结

本文基于《MySQL复制与高可用水平扩展架构实战》扩展其复制的原理以及切换一致性问题。还没看基础的读者们请先行了解这篇基础的MySQL复制详解与实战。本文主要对 MySQL 复制原理与主备一致性同步工作原理解析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt之天气预报实现(一)预备篇

文章目录序章一、思路整理1.1 我的Qt版本信息1.2 我使用的API二、高德开放平台API的申请和使用2.1 API的申请步骤2.1.1 注册高德开放平台账号(若已有账号请无视)2.1.2 创建API_KEY2.2 API的使用2.2.1 天气查询文档和城市编码下载位置(必读&am…

node版本与node-sass版本不兼容时问题解决

在项目运行中会经常遇到node版本号与node-sass版本号不兼容的问题,这时可以有两种解决方案。 附图:node与node-sass的对应关系 1、改node版本号去对应node-sass 2、改node-sass版本号去对应node 一般情况下选择修改node-sass的版本号,这里…

[附源码]SSM计算机毕业设计茶园认养管理平台JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

PGL图学习之图神经网络GNN模型GCN、GAT[系列六]

PGL图学习之图神经网络GNN模型GCN、GAT[系列六] 项目链接:一键fork直接跑程序 https://aistudio.baidu.com/aistudio/projectdetail/5054122?contributionType1 0.前言-学术界业界论文发表情况 ICLR2023评审情况: ICLR2023的评审结果已经正式发布&a…

OPLSAA力场参数之快速建模—MS+Moltemplate

文章目录一、MS中画出分子结构二、根据OPLSAA力场文件设置原子力场1. OPLSAA力场2. 根据OPLSAA力场中的原子质量进行检查3. 在MS中设置为对应的原子编号三、转换为Lammps可以读取的Data文件四、采用Moltemplate自带工具生成Lt文件1. 生成LT文件2. LT文件结构五、引入OPLSAA力场…

Docker 【Nginx集群部署】

目录 1. nginx前置操作 2. 自定义容器 3. nginx常用命令 4. Error 4.1 502(无响应网关/代理) 4.2 404(找不到对应页面) 4.3 400(异常请求) 4.4 响应超时问题 5. 完整版本Nginx配置文件 1. nginx前置操作 1. 下载拉取nginx镜像 docker pull nginx 2. 使用nginx镜像创…

LVS负载均衡群集(DR模式)

LVS-DR工作原理 数据包流向分析 第一步:客户端发送请求到 Director Server (负载均衡器),请求的数据报文到达内核空间。 数据报文 源 IP ------客户端的 IP 目标 IP ------ VIP 源 MAC ------客户端的 MAC 目的 MAC ------ Director Server…

全产业链核心升级 集聚创新大展宏图——慕尼黑华南电子展回顾

展会简介 2022年11月15日至17日,高交会 - 智能制造、先进电子及激光技术博览会旗下成员展 (LEAP Expo)-慕尼黑华南电子展、慕尼黑华南电子生产设备展、华南先进激光及加工应用技术展览会及同期举办的华南电路板国际贸易采购博览会与中国&…

【全网热点】打造全网最全爱心代码仓库【火速领取爱心】

👨‍💻个人主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【代码实践】 目录🌙正文🌏部分效果在线演示🌏部分效果截屏🌸文末祝…

操作系统4小时速成:复习内存管理,内部碎片和外部碎片,页式存储管理,段式存储管理,段页式存储管理,虚拟内存,页面置换算法,LRU内存替换算法

操作系统4小时速成:复习内存管理,内部碎片和外部碎片,页式存储管理,段式存储管理,段页式存储管理,虚拟内存,页面置换算法,LRU内存替换算法 2022找工作是学历、能力和运气的超强结合体&#xff…

react面试题详解

React-Router怎么设置重定向&#xff1f; 使用<Redirect>组件实现路由的重定向&#xff1a; <Switch><Redirect from/users/:id to/users/profile/:id/><Route path/users/profile/:id component{Profile}/> </Switch>当请求 /users/:id 被重定…

显示控件——直线进度条

该控件是指定一个图标&#xff08;矩形长条&#xff09;&#xff0c;通过其滑动在水平方向或者垂直方向实现来调节指定存储空间的变量的效果。滑动范围对应变量地址数据&#xff0c;显示位置通过变量设定。可以配合“滑动调节”触摸控件进行设置。 位置信息&#xff1a;控件在工…

Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、单点触摸 dispatchTouchEvent onInterceptTouchEvent onTouchEvent三个方法的输入参数都是手势事件MotionEvent&#xff0c;其中包含触摸动作的所有信息&#xff0c;各种手势操作都从MotionEvent中获取触摸信息并判断处…

Python3,5行代码,让你拥有无限量壁纸美图,终于告别手动下载了。

这里写目录标题1、引言2、代码实战2.1 手动下载2.2 代码批量下载3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 你电脑桌面壁纸挺好看啊。 小鱼&#xff1a;那是&#xff0c; 毕竟我的审美观在这摆着呢。 小屌丝&#xff1a;你这话&#xff0c;让我不服… 小鱼&#xff…

STC51单片机30——单个数码管显示

#include<reg51.h> // 包含51单片机寄存器定义的头文件 /************************************************** 函数功能&#xff1a;延时函数&#xff0c;延时一段时间 ***************************************************/ void delay(void) { unsigned …

腾讯二面vue面试题总结

Vue2.x 响应式数据原理 整体思路是数据劫持观察者模式 对象内部通过 defineReactive 方法&#xff0c;使用 Object.defineProperty 来劫持各个属性的 setter、getter&#xff08;只会劫持已经存在的属性&#xff09;&#xff0c;数组则是通过重写数组7个方法来实现。当页面使…

在 Swift 图表中使用 Foudation 库中的测量类型

前言 在这篇文章中&#xff0c;我们将建立一个条形图&#xff0c;比较基督城地区自然散步的持续时间。我们将使用今年推出的新的Swift Charts 框架&#xff0c;并将看到如何绘制默认不符合 Plottable 协议的类型的数据&#xff0c;如 Measurement<UnitDuration>。 定义…

【附源码】计算机毕业设计JAVA校园社团管理平台演示录像2021

【附源码】计算机毕业设计JAVA校园社团管理平台演示录像2021 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1…

537页15万字大数据治理体系、大数据可视化平台及应用方案

目录 第1章 前言 第2章 集团企业大数据现状分析 2.1、 基本现状 2.2、 总体现状 2.2.1、 行领导 2.2.2、 业务人员 2.3、 数据架构方面 2.3.1、 业务表现 2.3.2、 问题 2.4、 数据应用难题 2.4.1、 缺少统一的应用分析标准 2.4.1.1、 业务表现 2.4.1.2、 问题 2.4…

天天都在CRUD,你知道数据库如何工作的吗?

作为一个天天都在CRUD的程序员&#xff0c;你有没有想过&#xff0c;数据库是如何工作的&#xff1f; 今天&#xff0c;让我们从一个最最最简单的模型开始&#xff0c;揭开数据库神秘的一角。 对我们使用者而言&#xff0c;数据库就像是一个黑盒子&#xff0c;你可以往它里面…