MySQL实战45讲 笔记
Mysql主从的基本原理
mysql 主从切换流程
- 客户端的读写可以直接访问主库,备库只是将主库的更新都同步过来,到本地执行
主从流程图
- 主库跟备库之间维护了一个长链接,主库A内部有一个线程,专门用于维护服务备库B的长连接。
- 主库接收到客户端的更新请求后,执行内部事务的更新逻辑,同时写binlog
- 日志同步的流程 :
- 在备库B执行change master 命令,设置主库A的IP,端口,用户,密码,以及要从哪个位置请求binlog,这个位置包含文件名和日志偏移量
- 在备库B 执行 start slave 命令,备库会启动两个线程,io_thread 和sql_thread 。 其中io_thread 负责与主库建立连接。
- 主库校验完用户名,密码后,开始按照备库传来的位置,从本地读取binlog, 发给备库
- 备库拿到 binlog 后,写到日志文件之中,称为中转日志
- 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 与自己相同,进行丢弃日志。