主从同步binlog

主从同步的原理是怎样的
提到主从同步的原理,我们就需要了解在数据库中的一个重要日志文件,那就是 Binlog 二

进制日志,它记录了对数据库进行更新的事件。实际上主从同步的原理就是基于 Binlog 进

行数据同步的。在主从复制过程中,会基于 3 个线程来操作,一个主库线程,两个从库线

程。

二进制日志转储线程(Binlog dump thread)是一个主库线程。当从库线程连接的时候,

主库可以将二进制日志发送给从库,当主库读取事件的时候,会在 Binlog 上加锁,读取完

成之后,再将锁释放掉。

从库 I/O 线程会连接到主库,向主库发送请求更新 Binlog。这时从库的 I/O 线程就可以读

取到主库的二进制日志转储线程发送的 Binlog 更新部分,并且拷贝到本地形成中继日志

(Relay log)。

从库 SQL 线程会读取从库中的中继日志,并且执行日志中的事件,从而将从库中的数据与

主库保持同步。

在这里插入图片描述

所以你能看到主从同步的内容就是二进制日志(Binlog),它虽然叫二进制日志,实际上

存储的是一个又一个事件(Event),这些事件分别对应着数据库的更新操作,比如

INSERT、UPDATE、DELETE 等。另外我们还需要注意的是,不是所有版本的 MySQL 都

默认开启服务器的二进制日志,在进行主从同步的时候,我们需要先检查服务器是否已经开

启了二进制日志。进行主从同步的内容是二进制日志,它是一个文件,在进行网络传输的过程中就一定会存在

延迟(比如 500ms),这样就可能造成用户在从库上读取的数据不是最新的数据,也就是

主从同步中的数据不一致性问题。比如我们对一条记录进行更新,这个操作是在主库上完成

的,而在很短的时间内(比如 100ms)又对同一个记录进行了读取,这时候从库还没有完

成数据的更新,那么我们通过从库读到的数据就是一条旧的记录。

这种情况下该怎么办呢?

如何解决主从同步的数据一致性问题

可以想象下,如果我们想要操作的数据都存储在同一个数据库中,那么对数据进行更新的时
候,可以对记录加写锁,这样在读取的时候就不会发生数据不一致的情况,但这时从库的作
用就是备份,并没有起到读写分离,分担主库读压力的作用。
在这里插入图片描述
因此我们还需要继续想办法,在进行读写分离的同时,解决主从同步中数据不一致的问题,

也就是解决主从之间数据复制方式的问题,如果按照数据一致性从弱到强来进行划分,有以

下 3 种复制方式。

方法 1:异步复制
异步模式就是客户端提交 COMMIT 之后不需要等从库返回任何结果,而是直接将结果返回

给客户端,这样做的好处是不会影响主库写的效率,但可能会存在主库宕机,而 Binlog 还

没有同步到从库的情况,也就是此时的主库和从库数据不一致。这时候从从库中选择一个作

为新主,那么新主则可能缺少原来主服务器中已提交的事务。所以,这种复制模式下的数据

一致性是最弱的。
在这里插入图片描述
方法 2:半同步复制

MySQL5.5 版本之后开始支持半同步复制的方式。原理是在客户端提交 COMMIT 之后不

直接将结果返回给客户端,而是等待至少有一个从库接收到了 Binlog,并且写入到中继日

志中,再返回给客户端。这样做的好处就是提高了数据的一致性,当然相比于异步复制来

说,至少多增加了一个网络连接的延迟,降低了主库写的效率。

在 MySQL5.7 版本中还增加了一个

rpl_semi_sync_master_wait_for_slave_count参数,我们可以对应答的从库数量

进行设置,默认为 1,也就是说只要有 1 个从库进行了响应,就可以返回给客户端。如果

将这个参数调大,可以提升数据一致性的强度,但也会增加主库等待从库响应的时间。

在这里插入图片描述
方法 3:组复制

组复制技术,简称 MGR(MySQL Group Replication)。是 MySQL 在 5.7.17 版本中推

出的一种新的数据复制技术,这种复制技术是基于 Paxos 协议的状态机复制。

我刚才介绍的异步复制和半同步复制都无法最终保证数据的一致性问题,半同步复制是通过

判断从库响应的个数来决定是否返回给客户端,虽然数据一致性相比于异步复制有提升,但

仍然无法满足对数据一致性要求高的场景,比如金融领域。MGR 很好地弥补了这两种复制

模式的不足。

下面我们来看下 MGR 是如何工作的(如下图所示)。

首先我们将多个节点共同组成一个复制组,在执行读写(RW)事务的时候,需要通过一致

性协议层(Consensus 层)的同意,也就是读写事务想要进行提交,必须要经过组里“大

多数人”(对应 Node 节点)的同意,大多数指的是同意的节点数量需要大于

(N/2+1),这样才可以进行提交,而不是原发起方一个说了算。而针对只读(RO)事务

则不需要经过组内同意,直接 COMMIT 即可。

在一个复制组内有多个节点组成,它们各自维护了自己的数据副本,并且在一致性协议层实

现了原子消息和全局有序消息,从而保证组内数据的一致性。
在这里插入图片描述
MGR 将 MySQL 带入了数据强一致性的时代,是一个划时代的创新,其中一个重要的原因
就是 MGR 是基于 Paxos 协议的。Paxos 算法是由 2013 年的图灵奖获得者 Leslie
Lamport 于 1990 年提出的,有关这个算法的决策机制你可以去网上搜一下。或者点击
这里查看具体的算法,另外作者在 2001 年发布了一篇简化版的文章,你如果感兴趣的
话,也可以看下。
事实上,Paxos 算法提出来之后就作为分布式一致性算法被广泛应用,比如 Apache 的
ZooKeeper 也是基于 Paxos 实现的。

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

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

相关文章

SpringBoot 项目整合 MyBatisPlus 框架,附带测试示例

文章目录 一、创建 SpringBoot 项目二、添加 MyBatisPlus 依赖三、项目结构和数据库表结构四、项目代码1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisPlusTest 五、浏览器测试…

网安小贴士(3)网安协议

一、前言 网络安全协议是构建安全网络环境的基础,它们帮助保护网络通信免受各种威胁和攻击。 二、定义 网络安全协议是指在计算机网络中用于确保网络通信和数据传输安全的协议。它们定义了在网络通信过程中的安全机制、加密算法、认证和授权流程等,以保…

为什么 [] == ![] 为 true?

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 前言 面试官问我,[] ![] 的结果是啥,我:蒙一个true; 面试官:你是对的;我:内心非常高兴&a…

继承QAbstractListModel,结合QListView

这里想要写一个QAbstractListModel的子类&#xff0c;学习一下如何实例化QAbstractListModel。 QAbstractListModel子类化-CSDN博客 QVariant与自定义类型互转之奇巧淫技_qt 类型转 qvariant-CSDN博客 #pragma once#include <QStyledItemDelegate> #include <qmeta…

Python:Pycharm安装指南

三、Pycharm安装指南 在开始之前今天内容之前&#xff0c;将上篇的初体验练习题公布如下&#xff1a; 初体验练习题&#xff1a;输入两个字符&#xff0c;将他们组合后输出。 str1 input("请输入名字&#xff1a;") str2 input("请输入城市&#xff1a;&qu…

嵌套组合请求对象的校验与全局捕捉

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

游戏AI的创造思路-技术基础-tanh函数详解

又来搞事情&#xff0c;总想着把sigmoid函数替换成其他函数作为激活函数&#xff0c;或者找到更合适某一段训练的函数&#xff0c;所以今天来聊聊tanh函数&#xff08;谁让咱当年差点去了数学系&#xff0c;结果还是在数学系转过去计算机的&#xff09; 目录 3.9. tanh函数详解…

反向沙箱技术:安全隔离上网

在信息化建设不断深化的今天&#xff0c;业务系统的安全性和稳定性成为各公司和相关部门关注的焦点。面对日益复杂的网络威胁&#xff0c;传统的安全防护手段已难以满足需求。深信达反向沙箱技术&#xff0c;以其独特的设计和强大的功能&#xff0c;成为保障政务系统信息安全的…

XTDrone-固定翼无人机编队跟踪无人车-配置教程

配置使用ROS版本为Neotic 1 配置 1.1 加载固定翼无人机编队跟踪控制工程文件 cp -r ~/XTDrone/coordination/fixed_wing_formation_control ~/catkin_ws/src 1.2 加载一些用到的功能包 sudo apt-get install ros-noetic-serial #根据自己的ROS版本修改 sudo apt-get insta…

209.力扣每日一题:质数的最大距离

代码解决 class Solution { public:// 判断一个数是否为质数bool isPrime(int n) {if (n < 1) {return false;}if (n < 3) {return true;}if (n % 2 0 || n % 3 0) {return false;}for (int i 5; i * i < n; i 6) {if (n % i 0 || n % (i 2) 0) {return false;…

如何利用GPT-4o生成有趣的梗图

文章目录 如何利用GPT-4o生成有趣的梗图一、引言二、使用GPT-4o生成梗图1. 提供主题2. 调用工具3. 获取图片实际案例输入输出 三、更多功能1. 创意和灵感2. 梗图知识 四、总结 如何利用GPT-4o生成有趣的梗图 梗图&#xff0c;作为互联网文化的一部分&#xff0c;已经成为了我们…

深圳比创达电子EMC|EMC电磁兼容性行业:推动电子产品向更高发展

随着科技的飞速发展&#xff0c;电子产品在我们的日常生活中无处不在&#xff0c;从智能手机到智能家居&#xff0c;从医疗设备到工业自动化&#xff0c;这些设备的普及和更新换代对电磁兼容性&#xff08;EMC&#xff09;提出了更高的要求。 一、EMC电磁兼容性行业的概述 EM…

mac有什么解压软件 mac怎么解压7z软件 苹果电脑好用的压缩软件有哪些

众所周知&#xff0c;macOS集成解压缩软件归档实用工具&#xff0c;可直接解压zip格式的压缩包。但对于其他比较常见的格式&#xff0c;诸如RAR、7z、TAR等&#xff0c;则无能为力&#xff0c;不过&#xff0c;我们可以选择大量第三方解压缩软件&#xff0c;帮助我们更好地完成…

2024.7.2作业

1. 梳理笔记(原创&#xff01;&#xff01;&#xff01;) 2.解析代码&#xff1a;分析每一步变量的取值 #include <stdio.h> int main(int argc, char *argv[]) { int a 10; //a10 int b a--; //b10 int c a b 2; //a9 b10 c21 int d (b--…

大模型参数规模扩大是趋势

©作者|TW 来源|神州问学 一、引言 近两年互联网科技领域&#xff0c;大模型成为了各大企业竞相发布的热点话题。百度、腾讯、阿里和华为等公司相继推出了自己的AI大模型&#xff0c;使得“大模型”这一概念迅速走入大众视野。大模型以其庞大的参数规模和强大的性能&…

玉林师范学院宿舍管理系统的设计与实现19633

玉林师范学院宿舍管理系统设计与实现 摘要&#xff1a;随着大学生人数的增加&#xff0c;宿舍管理成为高校管理中的重要问题。本论文旨在研究玉林师范学院宿舍管理系统&#xff0c;探讨其优势和不足&#xff0c;并提出改进建议。通过对相关文献的综述和实地调研&#xff0c;我们…

button1 <Button>: Missing Constraints in ConstraintLayout

书籍 《第一行代码 Android》第三版 开发 环境 Android Studio Jellyfish | 2023.3.1 问题 在学习3.2.2 创建和加载布局章节,在first_layout.xml中增加一个按钮button1时报错:"button1 <Button>: Missing Constraints in ConstraintLayout" 分析 产生这个…

【Python】已解决:NameError: name ‘unichr’ is not defined

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;NameError: name ‘unichr’ is not defined 一、分析问题背景 在使用Python进行编程时&#xff0c;有时会遇到“NameError: name ‘unichr’ is not defined”…

装箱单填写规范‼️

装箱单填写说明 出单方 (Issuer) 出单人的名称与地址&#xff0c;应与发票的出单方相同。在信用证支付方式下&#xff0c;此栏应与信用证受益人的名称和地址一致。 受单方 (TO) 受单方的名称与地址&#xff0c;应与发票的受单方相同。多数情况下填写进口商的名称和地址&#…

JavaScript常见数组方法的详细用法及示例

1.filter():检测数值元素&#xff0c;并返回符合条件所有元素的数组(具体要符合什么条件的的元素的函数方法需要我们自己去写)。示例如下 </head> <body><button id"but" onclick"test(arr)">点击出结果</button><div id"…