semisync continue…

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

在前两天刚刚释放的MySQL5.7.2代码中,可以看到semisync终于做了进一步的改进;在之前用户线程的逻辑为:

1.在binlog写入文件后,调用semisync记录事务位点信息;

2.sync binlog(如果需要)

3.将事务提交;

4.等待备库ack;

该逻辑存在的问题是,当主库crash时,可能Binlog还没有传递到备库,这时候做一次主备切换,备库提升为新主库,老主库降级为新备库,这时候主备库是处于不一致状态的;

而在5.7.2中,可以使用如下逻辑:

1.在binlog写入文件后,记录事务位点信息;

2.sync binlog(如果需要)

3.等待备库ack;

4..将事务提交;

在新版本5.7.2中,增加了新的HOOK函数:after_sync,通过参数rpl_semi_sync_master_wait_point来控制,默认为AFTER_SYNC,如果设置为AFTER_COMMIT则在commit之前等待备库ack,这可以确保备库接受到了最新的binlog,即使主库随后crash掉,也可以在recovery阶段恢复,因为主库已经完成了prepare阶段;

尽管该特性仅存在于官方5.7.2中,使用MySQL5.6的同学也可以很容易的把这个特性port过来,因为代码的改动量非常小.但需要注意一个问题,即在rotate时,由于需要持有LOCK_log并等待所有preare的事务完成commit,而dump线程也需要持有LOCK_log来发送binlog,这里rotate, 用户线程等待ACK, dump线程三者很容易形成死锁。

解释下,rotate为什么要等待prepare的线程commit,由于我们默认使用的XA事务,在crash recovery时,会扫描最后一个binlog文件,找出其中的XID,然后再跟所有处于prepare状态的事务xid做对比,如果事务xid存在于binlog,则将该prepare的事务commit,否则rollback。

如果rotate时不等待prepare的事务commit,那么我们可能需要往前扫描多个binlog文件来

关于这个问题,有几种解决办法:

1.Mariadb版本,rotate线程无需等待prepare线程commit,而是在binlog中写入事件的方式,类似于给binlog做了个checkpoint。

2.MySQL5.7.2/FacebookMySQL5.6, 通过维护当前active的binlog尾部偏移量的方式来解除dump线程对LOCK_log锁的需求


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
break和continue语句
break和continue语句
29 0
|
6月前
|
C语言
for和do-while循环以及break和continue语句
for和do-while循环以及break和continue语句
43 0
|
10月前
continue和break的区别
continue和break的区别
78 0
break 和 continue
break 和 continue自制脑图 break 可以用来立即退出循环语句(包括 else),continue作用:可以跳过当次循环,break 和 continue 都是只对离它们最近的循环起作用,
59 0
break 和 continue
|
机器学习/深度学习 Java 程序员
实现 Break 和 Continue|学习笔记
快速学习实现 Break 和 Continue。
214 0
实现 Break 和 Continue|学习笔记
|
数据安全/隐私保护 开发者 Python
Break 和 continue 的使用 | 学习笔记
快速学习 Break 和 continue 的使用
66 0
写出continue和break的区别
写出continue和break的区别
82 0
|
开发者 Python
break 和 continue|学习笔记
快速学习 break 和 continue
break和continue区别
break和continue区别
121 0
break和continue区别