分享更有价值
被信任是一种快乐

为什么在MySQL双主单写的情况下主库偶尔出现大量延迟

文章页正文上

为什么在MySQL双主单写的情况下主库偶尔出现大量延迟,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。我们是双主单写,这里约定写入的库为主库,没有写入的库为从库。我们的falco免费主机域名n偶尔会进行报警如下(频率很低):这是非常奇怪的,按理说我是单写的从库没有做任何操作(除了应用Event以外),主库哪来的延迟,并且延迟这么大。在我映像中有朋友问过这个问题,当时没有细细研究。我们还是要看看主从计算延迟的伪代码:计算延迟的公式为:出现延迟的必要条件:如果SQL线程没有应用完了所有的IO线程写入的Event,也就是Read_Master_Log_Pos和Exec_Master_Log_Pos存在一定的差值。判定标准为抛开文件名,也就是通过 IO线程读取到主库binary log的位置 和 SQL线程应用到的主库binary log位置进行比较来进行 判断,只要他们出现差值就会进入延迟计算环节。服务器当前时间-Event header中的timestamp – 主从服务器时间差 这个公式必须出现差值。好了接下来带着这两个产生延迟的必要条件来寻求原因。
1.主库:首先主库写到从库的Event,从库会写入到binlog(log_slave_updates 开启),并且从库的DUMP线程会发送给主库,但是主库的IO线程通过SERVER_ID进程判定,将Event进行过滤,不写入主库的relay log,同时会更新主库IO线程读取的位置(Read_Master_Log_Pos),并且更新忽略到的位置(rli->ign_master_log_name_end[0])。代码如下:主库:SQL线程会通过rli->ign_master_log_name_end[0]判定是否有需要跳过的Event,如果有则构建一个Rotate_log_event来跳过这个Event,代码如下:好了到这里我们知道了Event在主库是如何跳过的,但是注意IO线程和SQL线程在处理Read_Master_Log_Pos和Exec_Master_Log_Pos的时候可能有一定的时间差,那么Read_Master_Log_Pos和Exec_Master_Log_Pos存在一定的差值 的条件就可能会满足,则进入延迟计算环节。主库的SQL线程平时并没有读取到Event,因为所有的Event都被IO线程过滤掉了。因此
Event的 header中的timestamp 不会更新(MTS)。但是如果从库binlog切换的时候,从库至少会传送ROTATE_EVENT给主库,这个时候主库会拿到这个实际的Event,因此Event的 header中的timestamp 更新了。 如果刚好遇到主库的IO线程的Read_Master_Log_Pos和Exec_Master_Log_Pos有差值,
那么falcon去查看延迟就会得到一个延迟很大的假象,延迟的计算公式就会变为如下:主库当前的时候 – 从库上次binlog切换的时间 – 主从时间的差值MTS和单线程的不同上面的第3点只适用于MTS,单SQL线程不同,会去将last_master_timestamp设置为0,代码如下:言外之意单SQL线程计算延迟的公式为:主库当前的时间 – 1970年1月1日0点 – 主从时间的差值因此看起来计算出来的延迟会更大。最后需要注意的是实际上这种情况的延迟并没有问题,完全是一种偶尔出现的计算上的问题,是一种假象,如果主库的压力越大出现这种情况的可能性就会越大,因为IO线程和SQL线程在处理Read_Master_Log_Pos和Exec_Master_Log_Pos的出现时间差的可能性就会越大。其实知道了原理就很容易debug了,因为我们可以将断点放到主库的show_slave_status_send_data函数上,那么就能看出来了,做的操作如下:从库flush binary logs主库执行一些insert操作主库show slave status这个时候我们可以跳过(Read_Master_Log_Pos和Exec_Master_Log_Pos存在一定的差值)这个条件,直接通过公式去计算,得到如下结果:延迟就是37秒,因此我们的理论得到了验证。下面一个debug结果是单SQL线程的,可以看到延迟更是大得离谱。额外的问题:如果双主双写如果按照上面的理论那么T3的更新的位置可能会被,T2事务的位点重置。因为主库的SQL线程通过构建的Rotate_log_event可能会出现Exec_Master_Log_Pos倒退的可能性,这显然是不行的。但是代码中构建Rotate_log_event的逻辑包裹在如下逻辑下面。我们可以看到只有在当前 relay log读取完成后才会进行Rotate_log_event的构建。因此不存在此问题。问题如上虽然不构建Rotate_log_event,但是如果rli->ign_master_log_name_end[0]如果一直保留那么当relay log应用完成后,依旧会去构建Rotate_log_event导致Exec_Master_Log_Pos倒退,实际上这个问题也不会出现,因为在每次IO线程Event写入到relay log后会重置,如下:看完上述内容,你们掌握为什么在MySQL双主单写的情况下主库偶尔出现大量延迟的方法了吗?如果还想学到更多技能或想了解更多相关内容免费主机域名,欢迎关注云技术行业资讯频道,感谢各位的阅读!

相关推荐: MySQL online ddl工具之pt-online-schema-change怎么用

这篇文章主要介绍MySQL online ddl工具之pt-online-schema-change怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL ddl 的问题现状 在运维m免费主机域名ysql数据库时,我们总会对数据…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册