MySQL实战45讲 笔记 - MySQL如何保证主从一致?

MySQL实战45讲 笔记

Mysql主从的基本原理

在这里插入图片描述

mysql 主从切换流程

  • 客户端的读写可以直接访问主库,备库只是将主库的更新都同步过来,到本地执行

在这里插入图片描述
主从流程图

  • 主库跟备库之间维护了一个长链接,主库A内部有一个线程,专门用于维护服务备库B的长连接。
  • 主库接收到客户端的更新请求后,执行内部事务的更新逻辑,同时写binlog
  • 日志同步的流程 :
  1. 在备库B执行change master 命令,设置主库A的IP,端口,用户,密码,以及要从哪个位置请求binlog,这个位置包含文件名和日志偏移量
  2. 在备库B 执行 start slave 命令,备库会启动两个线程,io_thread 和sql_thread 。 其中io_thread 负责与主库建立连接。
  3. 主库校验完用户名,密码后,开始按照备库传来的位置,从本地读取binlog, 发给备库
  4. 备库拿到 binlog 后,写到日志文件之中,称为中转日志
  5. sql_thread 读取中转日志并且执行

还有一种情况是双M结构(即互为主从结构)
在这里插入图片描述
双M结构存在一个问题,当A生成binlog之后发送给B,B执行完语句之后也会生成binlog。如果A同时是B的备库,这就相当于把B生成的Binlog拿过来再次执行一遍,那么A和B之间会一直循环执行该条语句,这种情况应该如何解决?

  • 因为MySQL在binlog 中记录了所在实例的server id ,我们可以通过规定两个库的server id 必须不同,如果相同,则它们不能设置为主备关系。
  • 备库在收到binlog 重新执行的时候,在自身的binlog中记录与原binlog相同的server id
  • 每个库在收到自己主库发来的日志后,先判断server id ,如果跟自己的相同,直接丢弃该日志

日志的执行流 :
1.从节点A更新的事务,binlog记录都为A的server id
2.传到B执行之后, B 中的binlog 记录的server id 也是A的server id
3.传回给A,A判断server id 与自己相同,进行丢弃日志。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值