毫不夸张地说,MySQL 能够成为现下最流行的开源数据库,binlog 功不可没

在最开始,MySQL 是以容易学习和方便的高可用架构,被开发人员青睐的。而它的几乎所有的高可用架构,都直接依赖于 binlog。虽然这些高可用架构已经呈现出越来越复杂的趋势,但都是从最基本的一主一备演化过来的

\如图 1 所示就是基本的主备切换流程


在状态 1 中,客户端的读写都直接访问节点 A,而节点 B 是 A 的备库,只是将 A 的更新都同步过来,到本地执行。这样可以保持节点 B 和 A 的数据是相同的。当需要切换的时候,就切成状态 2。这时候客户端读写访问的都是节点 B,而节点 A 是 B 的备库。

在状态 1 中,虽然节点 B 没有被直接访问,但是我依然建议你把节点 B(也就是备库)设置成只读(readonly)模式。

这样做,有以下几个考虑:

- 有时候一些运营类的查询语句会被放到备库上去查,设置为只读可以防止误操作;
- 防止切换逻辑有 bug,比如切换过程中出现双写,造成主备不一致;
- 可以用 readonly 状态,来判断节点的角色。

你可能会问,**我把备库设置成只读了,还怎么跟主库保持同步更新呢?**这个问题,你不用担心。因为 readonly 设置对超级 (super) 权限用户是无效的,而用于同步更新的线程,就拥有超级权限。

接下来,我们再看看节点 A 到 B 这条线的内部流程是什么样的。图 2 中画出的就是一个 update 语句在节点 A 执行,然后同步到节点 B 的完整流程图。

图 2 中,包含了我在上一篇文章中讲到的 binlog 和 redo log 的写入机制相关的内容,可以看到:主库接收到客户端的更新请求后,执行内部事务的更新逻辑,同时写 binlog。

备库 B 跟主库 A 之间维持了一个长连接。主库 A 内部有一个线程,专门用于服务备库 B 的这个长连接。一个事务日志同步的完整过程是这样的:

- 在备库 B 上通过 change master 命令,设置主库 A 的 IP、端口、用户名、密码,以及要从哪个位置开始请求 binlog,这个位置包含文件名和日志偏移量。
- 在备库 B 上执行 start slave 命令,这时候备库会启动两个线程,就是图中的 io_thread 和 sql_thread。其中 io_thread 负责与主库建立连接。
- 主库 A 校验完用户名、密码后,开始按照备库 B 传过来的位置,从本地读取 binlog,发给 B。
- 备库 B 拿到 binlog 后,写到本地文件,称为中转日志(relay log)。
- sql_thread 读取中转日志,解析出日志里的命令,并执行。

这里需要说明,后来由于多线程复制方案的引入,sql_thread 演化成为了多个线程,跟我们今天要介绍的原理没有直接关系,暂且不展开。分析完了这个长连接的逻辑,我们再来看一个问题:binlog 里面到底是什么内容,为什么备库拿过去可以直接执行。

总结

  • 同步binlog保证主备一致

MySQL是怎么保证主备一致的?相关推荐

  1. mysql主备在同一台_MySQL高可用(一)主备同步:MySQL是如何保证主备一致的

    主备同步,也叫主从复制,是MySQL提供的一种高可用的解决方案,保证主备数据一致性的解决方案. 在生产环境中,会有很多不可控因素,例如数据库服务挂了.为了保证应用的高可用,数据库也必须要是高可用的. ...

  2. 阿里云 mysql主从_阿里云MySQL主从_Mater Slave_主备同步_MySQL主从_MySQL延迟-云栖社区-阿里云...

    1.背景 为了提高系统的可用性和数据保护,MySQL通常采用master-slave的部署结构,简单高效,master和slave之间使用binlog来复制数据. binlog支持statement和 ...

  3. MySQL高可用之主备同步:电脑安装java步骤

    结构化数据.非结构化数据与半结构化数据 文章的开始,聊一下结构化数据.非结构化数据与半结构化数据,因为数据特点的不同,将在技术上直接影响存储引擎的选型. 首先是结构化数据,根据定义结构化数据指的是由二 ...

  4. MySQL高可用之主备同步:javafor循环乘法表

    前言 回顾这一年,我的付出终归是没有白费的!很快,今天是2021年了,激烈的金三银四已经没有多少日子就有上场了!所以今天,我挑选了"美团+字节+腾讯"等三家的一二三面问题,在此篇文 ...

  5. MySQL集群搭建——主备模式

    参考: https://segmentfault.com/a/1190000017049567

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

  7. 《MySQL实战45讲》实践篇 24-29 学习笔记 (主备篇)

    图片来自于极客时间,如有版权问题,请联系我删除. 24 | MySQL是怎么保证主备一致的? 主备切换流程如下: 建议把节点 B(也就是备库)设置成只读(readonly)模式. 1.有时候一些运营类 ...

  8. MySQL是如何保证主从一致的

    一:什么是binlog Binary log(二进制日志),简称Binlog. Binlog是记录所以数据表结构变更以及表数据修改的二进制日志,不会记录select和show这类操作.Binlog是以 ...

  9. mysql集群保证数据一致性

    mysql集群配置在网站负载均衡中是必不可少的: 首先说下我个人准备的负载均衡方式: 1.通过nginx方向代理来将服务器压力分散到各个服务器上: 2.每个服务器中代码逻辑一样: 3.通过使用redi ...

最新文章

  1. servlet 中 out.println(中文) 乱码 问题
  2. containerd镜像导入import和push命令 gzip压缩解压缩命令
  3. Bash shell的内建命令:type
  4. Nutanix企业云助力嘉里大通提升核心竞争力
  5. 信息学奥赛一本通 1099:第n小的质数 | OpenJudge NOI 1.5 44
  6. PRML-系列一之1.2.1
  7. 生活在别处——“Samsung Cloud Print”云打印体验
  8. Go 每日一库之 zap
  9. Android隐式启动匹配:action,category,data
  10. 服务启动失败_将控制台程序转换为服务运行
  11. Linux scp 使用详解
  12. dex2jar android,dex2jar
  13. JAVA实现网页版斗地主_Java实现斗地主简化版
  14. directshow
  15. 繁体转简体 java_java 中文简体与繁体的转换
  16. springboot打包-依赖包到单独文件夹并微缩原有jar包体积
  17. Vivado安装—Xilinx design tool already exists for 2019.1,specify a different program program group entr
  18. 让你终生受用的时间管理技巧
  19. 公司电子企业邮箱注册哪个好,电子企业邮箱怎么写?
  20. matlab如何画波特图,matlab画波特图

热门文章

  1. Educoder Basemap和Seaborn 第2关:Seaborn图形介绍
  2. 华为2288H V5服务器安装win_server_2016问题解决过程
  3. Linux网络配置与远程连接
  4. 2020中软java面试题,通过这9个Java面试题,就可以入职华为啦
  5. 西邮计算机学院院长,西安邮电大学计算机学院
  6. mysql for windows 64_MySQL 5.6 for Windows 解压缩版配置安装(win 10 64位亲测)附安装包下载链接...
  7. bagging和时间序列预测_Simple RNN时间序列预测
  8. oracle大对象实例_oracle 数据迁移案例 从 8.1.7.4到9.2.0.8
  9. java反射方法_java反射之方法反射的基本操作方法
  10. 服务器系统是指什么,服务器操作系统指的是什么