写点什么

揭秘 MySQL 的主从同步实现方案

发布于: 17 小时前
揭秘MySQL的主从同步实现方案

关于 MySQL 主从复制主要同步的是 binlog 日志,涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点,如下图所示:


1、如何实现主从一致

(1)主节点 binary log dump 线程

当从节点连接主节点时,主节点会创建一个 log dump 线程,用于发送 binlog 的内容。在读取 binlog 中的操作时,此线程会对主节点上的 binlog 加锁,当读取完成,在发送给从节点之前,锁会被释放。


(2)从节点 I/O 线程

当从节点上执行start slave命令之后,从节点会创建一个 I/O 线程用来连接主节点,请求主库中更新的 binlog。I/O 线程接收到主节点 binlog dump 进程发来的更新之后,保存在本地 relay-log(中继日志)中。


(3)从节点 SQL 线程

SQL 线程负责读取 relay log 中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。


2、一主多从同步?

对于每一个主从连接,都需要三个进程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个 binlog dump 进程,而每个从节点都有自己的 I/O 进程,SQL 进程。


从节点用两个线程将从主库拉取更新和执行分成独立的任务,这样在执行同步数据任务的时候,不会降低读操作的性能。比如,如果从节点没有运行,此时 I/O 进程可以很快从主节点获取更新,尽管 SQL 进程还没有执行。


如果在 SQL 进程执行之前从节点服务停止,至少 I/O 进程已经从主节点拉取到了最新的变更并且保存在本地 relay 日志中,当服务再次起来之后,就可以完成数据的同步。


3、主从复制的基本过程

(1)从节点上的 I/O 进程连接主节点,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;


(2)主节点接收到来自从节点的 I/O 请求后,通过负责复制的 I/O 进程根据请求信息读取指定日志指定位置之后的日志信息,返回给从节点。返回信息中除了日志所包含的信息之外,还包括本次返回的信息的 binlog file 的以及 binlog position;


(3)从节点的 I/O 进程接收到内容后,将接收到的日志内容更新到本机的 relay log 中,并将读取到的 binlog 文件名和位置保存到 master-info 文件中,以便在下一次读取的时候能够清楚的告诉 Master“我需要从某个 binlog 的哪个位置开始往后的日志内容,请发给我”;


(4)Slave 的 SQL 线程检测到 relay-log 中新增加了内容后,会将 relay-log 的内容解析成在主节点上实际执行过的操作,并在本数据库中执行。


4、MySQL 主从复制模式

MySQL 主从复制默认是异步的模式。MySQL 增删改操作会全部记录在 binlog 中,当 slave 节点连接 master 时,会主动从 master 处获取最新的 bin log 文件。并把 bin log 中的 sql relay。


(1)异步模式(mysql async-mode)

原理:客户端提交 COMMIT 之后主库,不需要等从库返回任何结果,而是直接将结果返回给客户端,这样做的好处是不会影响主库写的效率,但可能会存在主库宕机(就凉了),而 Binlog 还没有同步到从库的情况,也就是此时的主库和从库数据不一致。

这时候从从库中选择一个作为新主,那么新主则可能缺少原来主服务器中已提交的事务。所以,这种复制模式下的数据一致性是最弱的。



(2)半同步模式(mysql semi-sync)

原理:在客户端提交 COMMIT 之后不直接将结果返回给客户端,而是等待至少有一个从库接收到了 Binlog,并且写入到中继日志中,再返回给客户端。


这样做的好处就是提高了数据的一致性,当然相比于异步复制来说,至少多增加了一个网络连接的延迟,降低了主库写的效率。MySql5.7 支持设置应答从库的个数,保证 N 个从库同步完成后进行返回。


半同步模式不是 mysql 内置的,从 mysql 5.5 开始集成,需要 master 和 slave 安装插件开启半同步模式。


(3)全同步模式


全同步模式是指主节点和从节点全部执行了 commit 并确认才会向客户端返回成功。



作者:架构精进之路,十年研发风雨路,大厂架构师,CSDN 博客专家,专注架构技术沉淀学习及分享,职业与认知升级,坚持分享接地气儿的干货文章,期待与你一起成长

关注并私信我回复“01”,送你一份程序员成长进阶大礼包,欢迎勾搭。



Thanks for reading!

发布于: 17 小时前阅读数: 13
用户头像

坚持分享接地气儿的架构技术文章! 2018.02.26 加入

同名微信公众号「架构精进之路」,专注软件架构研究,技术学习与职业成长!坚持原创总结、沉淀和分享,希望能带给大家一些引导和启发,感谢各位的支持(关注、点赞、分享)!

评论

发布
暂无评论
揭秘MySQL的主从同步实现方案