semisync continue…

在前两天刚刚释放的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锁的需求

时间: 2024-07-29 10:23:45

semisync continue…的相关文章

函数调用-运行程序只出现press any key to continue

问题描述 运行程序只出现press any key to continue #includevoid DrawPic(int nchar c){ int ij; for(i=1;i<=n;i++) { for(j=1;j<=n-1;j++) { printf("" ""); } for(j=1;j<=2*i-1;j++) { printf(""%c""c); } } return ; }int main(){

Java中for循环中执行顺序问题及break, continue用法

问题|循环|执行 最近在机子上装了jdk1.4.2,装了编辑器Eclipse3.0.1,用后感觉Eclipse确实很好用,特别是参数提示功能.网上的java资源也还不少,看了<thinking in java>中文版前几章,记点问题与发现在这里:1. for循环的一个问题for(int i=1, j=i+10 ; i<5; i++ , j=i*2)System.out.println("i="+i+" j="+j); 运行结果:i=1 j=11i=

JavaScript中Break和Continue

核心提示:JavaScript break 和 continue 语句,有两种特殊的语句可用在循环内部:break 和 continue. JavaScript break 和 continue 语句 有两种特殊的语句可用在循环内部:break 和 continue. Break break命令可以终止循环的运行,然后继续执行循环之后的代码(如果循环之后有代码的话). 实例: <html>  <body>  <script type="text/javascript

continue 语句

语句   停止循环的当前迭代,并开始新的迭代. continue [label]; 可选的 label 参数指定 continue 应用于哪条语句. 说明 只能在 while.do...while.for.或 for...in 循环内使用 continue 语句. 执行 continue 语句会停止当前循环的迭代,并从循环的开始处继续程序流程.这样对不同的循环类型有如下影响: while 和 do...while 循环检查它们的条件,如果条件为 true,则再次执行循环. for 循环执行它们的

在VB。NET里怎么实现类似C#中continue的功能

  如下C#代码:int sum=0;for(int i=1;i<101;i++){ if(i%2!=0) {  continue; } sum+=i;}可以考虑用以下VB.NET代码实现:Dim sum As Integer, i As IntegerFor i = 1 To 100   If (i Mod 2 = 0) Then     sum = sum + i   End IfNext Dim sum As Integer, i As IntegerFor i = 1 To 100  I

Java编程那些事儿38—break和continue语句

5.5 break和continue语句 break和continue语句是和循环语句紧密相关的两种语句.其中break关键字的意思是中断.打断,continue关键字的意思是继续.使用这两个关键字可以调节循环的执行. 5.5.1break语句 break语句在前面的switch语句中已经介绍过,功能的话是中断switch语句的执行,在循环语句中,break语句的作用也是中断循环语句,也就是结束循环语句的执行. break语句可以用在三种循环语句的内部,功能完全相同.下面以while语句为例来说

MySQL 5.7增强版Semisync Replication性能优化

  这篇文章主要介绍了MySQL 5.7增强版Semisync Replication性能优化,本文着重讲解支持发送binlog和接受ack的异步化.支持在事务commit前等待ACK两项内容,需要的朋友可以参考下 一 前言 前文 介绍了5.5/5.6 版本的MySQL semi sync 基础原理和配置,随着MySQL 5.7 的发布,新版本的MySQL修复了semi sync 的一些bug 并且增强了功能. 支持发送binlog和接受ack的异步化; 支持在事务commit前等待ACK; 在

Java中break、continue、return语句的使用区别对比

  这篇文章主要介绍了Java中break.continue.return语句的使用区别对比,本文用非常清爽简明的语言总结了这三个关键字的使用技巧,并用一个实例对比使用结果,需要的朋友可以参考下 break.continue.return之间的区别与联系 在软件开发过程中,逻辑清晰是非常之重要的. 代码的规范也是非常重要的.往往细节决定成败.在编写代码的时候,一定要理解语言的作用以及使用的方法和场景.下面来介绍一下break.continue.return三者的区别和联系. 1. break :

解析PHP跳出循环的方法以及continue、break、exit的区别介绍

PHP中的循环结构大致有for循环,while循环,do{} while 循环以及foreach循环几种,不管哪种循环中,在PHP中跳出循环大致有这么几种方式: 代码: 复制代码 代码如下: <?php $i = 1; while (true) { // 这里看上去这个循环会一直执行 if ($i==2) {// 2跳过不显示 $i++; continue; } else if ($i==5) {// 但到这里$i=5就跳出循循环了 break; } else { echo $i . '<br