首页 > 数据库 >MySQL 5.7增强半同步AFTER SYNC&AFTER COMMIT

MySQL 5.7增强半同步AFTER SYNC&AFTER COMMIT

时间:2024-10-11 11:33:27浏览次数:10  
标签:binlog 事务 slave 5.7 AFTER SYNC master commit

今天主要剖析一下MySQL 5.7增强半同步的AFTER SYNC和AFTER COMMIT的区别。
    如果我们生产库对数据的一致性要求比较高,那么我们一般会开启了半同步复制,但在MySQL5.5/5.6里,会存在数据不一致的风险。比如有如下场景,客户端提交了一个事务,master把binlog发送给slave,在发送的期间,网络出现波动,此时Binlog Dump线程发送就会卡住,要等待slave把binlog写到本地的relay-log里,然后给master一个反馈,等待的时间以rpl_semi_sync_master_timeout参数为准,默认为10秒。在这等待的10秒钟里,在其他会话里,查看刚才的事务是可以看见的,此时一旦master发生宕机,由于binlog没有发送给slave,前端app切到slave查看,就会发现刚才已提交的事务不见了。盗用两张图讲解一下两者的区别。

  • AFTER SYNC
    after sync是MySQL5.7官方新加的用以解决MySQL5.6半同步缺陷的选项,也是官方推荐的方式。下面我结合图来说明一下AFTER SYNC是怎么回事。
     
        实际上,客户端发出commit请求后,在主库上写入binlog并推送给slave,slave接收到binlog并写入relaylog,发送ACK确认已经接收binlog后,master在引擎层commit,客户端接收commit完成,此时其他会话才可以看见已提交的数据。
        故障分析:假设master在接收ACK确认时宕机,因为在引擎层并没有提交,HA切换到从库,因为binlog已经写入从库的relaylog,因此不会造成数据丢失,个人认为是目前比较完美的解决方式。
  • AFTER COMMIT
       
        after commit是MySQL5.6半同步参数,区别于after sync,after sync是在接收ack确认以后主库在引擎层做提交,而after commit是先在引擎层做提交后等待ACK确认。因此,在写入数据后并且在从库确认之前,其他的客户端可以看到在这一事务。
        故障分析:
    1.binlog 未发送到从库:
        事务B获取到事务A提交的内容, 此时宕机故障切换到slave,事务B获取到的内容却丢失了。事务A commit没有收到反馈信息(则需要业务判断了)。
    2.binlog 已经发送给从库 :
        事务B获取到事务A提交的内容,故障切换到salve ,B仍然获取到A提交的内容,没毛病。事务A commit没有收到反馈信息,若重新执行该事务,则相当于执行两次A事务(则需要业务判断了)。

dump thread过程分析:

  • mysql5.6版本之前:
    1. master dump thread 发送binlog events 给 slave 的IO thread,等待 slave 的ack反馈
    2. slave 接受binlog events 写入relay log ,返回 ack 消息给master dump thread
    3. master dump thread 收到ack消息,给session返回commit ok,然后继续发送写一个事务的binlog。
  • mysql5.7之后新增ack线程:
    1. master dump thread 发送binlog events 给 slave 的IO thread,开启ack线程等待 slave 的ack反馈,dump 线程继续向slaveIO thread发送下一个事务的binlog。
    2. slave 接受binlog events 写入relay log ,返回 ack 消息给master ack线程,然后给session返回commit ok。

过程总结:

1.Master在收到slave的应答后才Commit事务--after_sync(5.6上Master在commit后,才等待Slave的应答--after commit).
因此在确认事务复制到Slave上之前,并发的事务看不到当前事务的数据.当Master出现故障时,所有已经提交的事务都复制到了Slave上.
2.缺省采用无数据丢失的应答等待机制after_sync。用户也可以选择使用5.6的应答等待机制after_commit

设置方法:

mysql> SET rpl_semi_sync_master_wait_point= AFTER_SYNC;

Master接收到N个slave的应答后,才commit 事务.
用户可以设置应答Slave的数量:

mysql> SET GLOBAL rpl_semi_sync_master_wait_for_slave_count= N;



链接:https://www.jianshu.com/p/3bfb0bfb8b34

标签:binlog,事务,slave,5.7,AFTER,SYNC,master,commit
From: https://www.cnblogs.com/hsjz-xinyuan/p/18458071

相关文章

  • 【Flink系列十八】Hudi hive_sync JDO报错 Could not find API definition for name "
    问题现象Error:CouldnotfindAPIdefinitionforname"JDO".Perhapsyoudonthavetherequisitedatanucleus-api-XXXjarintheCLASSPATH?2024-10-1011:12:31,251ERRORDataNucleus.Persistence[]-Error:Co......
  • MySQL之innodb_flush_log_at_trx_commit和sync_binlog
    innodb_flush_log_at_trx_commit和sync_binlog两个参数是控制MySQL磁盘写入策略以及数据安全性的关键参数,它们的配置对于mysql性能有很大的影响一、innodb_flush_log_at_trx_commitinnodb_flush_log_at_trx_commit:是InnoDB引擎特有的,ib_logfile的刷新方式(ib_logfile:存放In......
  • 什么是 Vue 3 的 `defineAsyncComponent`?它的用途是什么?
    什么是Vue3的defineAsyncComponent?它的用途是什么?在Vue3中,defineAsyncComponent是一个用于定义异步组件的函数。异步组件是一种特殊的组件,它们允许你在需要时才加载组件代码,而不是在应用初始化时一次性加载所有组件代码。这种方式可以提高应用的加载速度和性能,尤其......
  • 异步场景: promise、async函数与await命令介绍
    如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。在鸿蒙的开发中,我们时常会遇到promise异步场景,有同学反馈说希望提一下。异步开发这部分的内容比较多,我不确定这位朋友具体想讨论是哪些方面,那我从......
  • 备份服务rsync
    1.备份服务目标1.备份服务应用场景2.两台机器之间传输数据的命令:scp,rsync3.备份服务使用流程.服务端,客户端.4.服务使用流程中的排错(总结至少5个故障与排查流程).5.备份项目:所有服务器数据备份,在备份服务器检查,邮件发送结果.2.备份服务概述2.1目标目标:主要解决数......
  • JAVA基础: synchronized 和 lock的区别、synchronized锁机制与升级
    1synchronized和lock的区别synchronized是一个关键字,lock是一个接口,实际使用的是实现类synchronized通过触发的是系统级别的锁机制,lock是API级别的锁机制synchronized自动获得锁,自动释放锁。lock需要通过方法获得锁并释放锁synchronized可以修饰代码段和方法,lock......
  • 说一下synchronized的锁的升级和降级
    在Java中,synchronized关键字使用的锁有状态的升级和降级过程,主要涉及偏向锁、轻量级锁和重量级锁。一、偏向锁(BiasedLocking)引入目的:在没有竞争的情况下,减少锁获取的开销。很多情况下,一个对象在被一个线程使用时,不存在多线程竞争,此时使用偏向锁可以避免不必要的同步操作......
  • synchronized关键字的使用和原理
    在Java中,synchronized关键字是一种用于实现线程同步的机制,它可以确保在同一时刻只有一个线程能够访问被synchronized修饰的代码块或方法。一、作用和原理互斥访问:synchronized关键字通过对共享资源加锁来实现互斥访问。当一个线程进入synchronized代码块或方法时,它会获取......
  • linux中mysql5.7安装
    系统要求:CentOS7.664位卸载系统自带mariadb-lib1、rpm-qa|grepmariadb2、rpm-emariadb-libs-5.5.68-1.el7.x86_64 --nodeps 解压tar包:tar-xvfmysql*.tar以下加粗rpm包需要安装:mysql-community-common-5.7.23-1.el7.x86_64.rpmmysql-community-libs-co......
  • 讨论jiffies回转的time_after比较函数
    本文讨论jiffies回转的比较函数:#definetime_after(a,b)\((long)(b)-(long)(a)<0)写了个例子如下:#include<stdio.h>#include<stdint.h>#definetime_after(a,b)\((long)(b)-(long)(a)<0)intmain(){unsignedlongla......