35|MySQL半同步能提高主备数据的一致性吗?
俊达
你好,我是俊达。
上一讲中,我留了一个问题,就是在默认的情况下,MySQL 的数据复制是异步的,当主库意外崩溃后,备库是否有可能比主库多执行一些事务?
回答这个问题,需要对主库事务提交的过程,以及数据复制的细节有更深入的了解。这一讲我们就来看一看事务的提交过程,分析 Binlog 是什么时候发送给备库的,还有 Semi-Sync 插件在中间起到的作用。这里我假定只使用了 InnoDB 存储引擎,开启了 GTID,并且使用了 ROW 格式 Binlog,这也是推荐的使用方式。
MySQL 数据复制回顾
下面这张数据复制的架构图,你应该在上一讲中就看到过了。
我们回顾一下。
用户线程在执行事务的过程中不断产生 Binlog 事件。Binlog 事件的内容和事务中执行的语句相关,同时也受参数 binlog_format 影响。产生的 Binlog 事件会先缓存到 Binlog Cache 中。每一个用户线程都有各自独立的 Binlog Cache。
提交事务时,用户线程将 Binlog Cache 中的数据写入到 Binlog 文件。一个事务会产生多个 Binlog 事件,这些事件在 Binlog 文件中是连续存放的。一个线程在往 Binlog 文件中写入数据时,其他线程要等待之前的线程写完数据,才能写入 Binlog 文件。
用户线程将 Binlog 事件写入到文件或将 Binlog 文件同步到磁盘后,通知 Dump 线程有新的 binlog 事件产生,通知的具体时机跟参数 sync_binlog 的设置有关系。
对每一个备库上的 IO 线程,主库上都会创建一个 Dump 线程。Dump 线程负责将已提交事务的 Binlog 事件发送给 IO 线程。
IO 线程接收到 Binlog 事件后,将事件写入 RelayLog 文件。
SQL 线程从 RelayLog 文件中解析出 Binlog 事件,并进行应用。启用了多线程复制时,SQL 线程也称为协调线程。备库上参数 replica_parallel_workers 设置为大于 1 的值,就能开启多线程复制。参数 replica_parallel_type 用来控制并行复制的方式,建议设置为 LOGICAL_CLOCK。
如果启用了多线程复制,SQL 线程会将 Binlog 事件分发给各个 Worker 线程。
SQL 线程或 Worker 线程执行 Binlog 事件。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
1. MySQL数据复制的架构和流程,包括Binlog事件生成、写入Binlog文件、Dump线程发送给IO线程等步骤。 2. 主库事务提交过程,包括Binlog Cache的使用、二阶段提交的Prepare和Commit阶段、组提交的Binlog Flush和Binlog Sync阶段。 3. 参数sync_binlog对Binlog持久化的影响,以及可能导致备库比主库执行更多事务的情况。 4. 半同步(Semi Sync)的应用,包括开启半同步、AFTER_SYNC和AFTER_COMMIT设置等步骤。 5. 主库和备库安装半同步插件及相关参数设置。 6. 半同步的退化状态和监控建议。 7. 半同步的作用和优势,以及在主备数据一致性方面的应用。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 运维实战课》,新⼈⾸单¥59
《MySQL 运维实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论