作者:八怪(高鹏)中亦科技数据库专家
源码版本5.7.29
本文作为新书《深入理解MySQL主从原理》的补充部分,供大家参考,如有误请见谅。
数据结构和流程参考:
MySQL:半同步(一)主库端初始化流程 https://www.jianshu.com/p/9437e9059697
MySQL:半同步(二)主库端回调函数 https://www.jianshu.com/p/d55d6383434d
MySQL:半同步(三)从库端初始化和回调函数 https://www.jianshu.com/p/9fecae89f82c
此处不再单独列出
一、半同步的总体流程图
查看大图请移步 https://www.jianshu.com/p/5ebf4f4c1cf8
二、半同步中几个重要的状态值(主库)
半同步插件是否注册:半同步插件注册状态
ReplSemiSyncMaster::init_done_
/* True when initObject has been called */
半同步插件是否启用:半同步开启状态
ReplSemiSyncMaster::master_enabled_
/* semi-sync is enabled on the master */
getMasterEnabled用于获取变量
set_master_enabled设置变量
完全取决于参数rpl_semi_sync_master_enabled
是否使用半同步(异步):半同步复制方式
ReplSemiSyncMaster::state_
/* whether semi-sync is switched */
本状态非常重要,决定了是否是半同步复制方式,在函数ReplSemiSyncMaster::commitTrx中会完全依赖这个状态决定是否进行用户线程事务的等待,也是Rpl_semi_sync_master_status信息的来源。
三、相关参数(主库)
研究的参数包括
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
rpl_semi_sync_master_enabled
默认为false
生效点:
插件初始化初始化生效,参考第一节初始化函数ReplSemiSyncMaster::initObject
Ack_receiver线程初始化生效,参考第一节初始化函数Ack_receiver::init
参数动态生效,参考函数fix_rpl_semi_sync_master_enabled
fix_rpl_semi_sync_master_enabled函数会动态转换为半同步开启状态,并且开启Ack_receiver线程,当然根据参数rpl_semi_sync_master_wait_for_slave_countrpl_semi_sync_master_wait_no_slav