MySQL 主从同步方案(异步复制)

参考文献:

《详解MySQL的主从同步实现方案》

作者:https://jiagou.blog.csdn.net/?type=blog

https://blog.csdn.net/zhanghuan0126/article/details/118058369

《mysql binlog日志 的三种格式》

作者:https://blog.csdn.net/u011334954?type=blog

https://blog.csdn.net/u011334954/article/details/121471967

《Mysql如何解决主从数据不一致的问题》

作者:https://blog.csdn.net/hanjinjuan?type=blog

https://blog.csdn.net/hanjinjuan/article/details/118784292?spm=1001.2014.3001.5502


一、MySQL 主从同步模式

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

        这种异步模式,拥有了数据复制的性能和效率,但是数据一致性(主从)上表现较差,可以通过校验策略和工具,增加数据一致性的保护。

        另外,基于事务(GTID)的同步方式,存在一些限制(如:主从两边存储引擎都要采用 InnoDB)。还有对 MySQL 版本的要求,如 MySQL 8.0 版本开始增加支持窗口函数等。当然还有同步模式,是否需要采用强一致性保障的半同步或全同步模式,都需要根据实际的业务场景进行挑选适配,本篇技术手册描述的是异步复制模式。


二、binlog 日志格式分类

        参数 binlog_format 控制着 binlog 的格式,一种是 statement,一种是 row,还有一种是前面两种格式的混合,叫 mixed。

        statement 格式记录 SQL 语句,复制过程会导致主从出现不一致的情况。row 格式的问题是会导致 binlog 占用空间(磁盘)大,同时耗费 I/O 影响整体性能,但是对于保护主从一致性上面表现好。所以,还有个 mixed 格式,它是前面两种格式的混合,MySQL 会自己判断 SQL 语句是否可能导致主从不一致,是的话就采用 row,否则就采用 statement,不过该模式对于性能的要求需要更多实践来验证,一般多见于主主架构。


三、主从数据一致性 

        在保证网络低延迟,主从服务器负载一致,max_allowed_packet 参数设置一致,自增键一致(从节点尽量 read-only),同步参数(sync_binlog 等)设置正确,MySQL 版本一致等的情况下,从以下两个方面进行主从一致性的保护和校验。

3.1、监控MySQL主从复制的监控项

Slave_IO_Running

        该参数可作为 io_thread 的监控项,Yes 表示 io_thread 和主节点的连接正常并能完成复制工作,No 则说明与主节点通讯异常,多数情况是由主从间网络引起的问题。

Slave_SQL_Running

        该参数代表 sql_thread 是否正常,具体就是语句是否执行通过,通常会遇到主键重复或某个表不存在等错误问题。

Seconds_Behind_Master

        该参数经过计算得出值,该值为零的情况表示主从复制良好,延迟不存在。正值表示主从已经出现延时,数字越大表示从库落后主库越多。负值几乎很少见,该参数不支持负值,也就是不应该出现。

3.2、采用第三方工具进行主从一致性校验

工具介绍

        Percona-toolkit

pt-table-checksum

        负责监测MySQL主从数据一致性

pt-table-sync

        负责当主从数据不一致时修复数据,让它们保存数据的一致性

pt-heartbeat

        负责监控MySQL主从同步延迟



版权声明:本文为u014071071原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。