专栏首页mysql-dbamysql复制系列4-半同步复制
原创

mysql复制系列4-半同步复制

mysql复制包括异步复制和半同步复制:

异步复制:主库将事件写入二进制日志,但不知道从库是否接收成功,也不知道从库什么时候重放二进制日志,如果主库崩溃,则在主库提交的事务可能还没有传输到从库,这种情况下如果主从故障切换,从库还没有传输到从库的事务将丢失

异步复制同步时间线

master发起事务提交,在execute阶段执行完对数据的修改,然后写入事件到二进制日志,在commit阶段完成存储引擎层的事务提交,同时主库通过dump线程把二进制日志发送到两个从库,另个从库接收到后写入relay log日志文件,之后读取relay log日志进行应用,最后进行提交,由于主库发送binlog是异步的,从库是否接收成功不影响主库的提交。

为了避免从库没有接收到binlog导致的数据丢失。mysql对复制进行了改进,引入了半同步复制,半同步复制是以插件的形式进行安装。半同步复制,主库提交事务产生的二进制日志,需要至少被一个从库接收并写入relay log中等待ACK消息被主库成功接收之后主库才确认事务以提交。正常情况下主库发生故障转移时不会产生数据丢失问题

半同步复制时间线

半同步复制在binlog日志阶段后commit阶段前,主库必须等待从库在把日志写入relay日志后回复ACK消息,确保从库把接收的日志写入了relay log中,这样就避免了异步复制主库宕机可能存在的日志丢失问题了。

mysql5.7增强半同步复制:

rpl_semi_sync_master_wait_point的配置(控制半同步复制中在主库返回事务提交状态信息给客户端之前,等待从库ack消息的位点)

after_sync(默认):主库将事务修改写入二进制日志,把日志传输到从库,等待从库写入relay log 并返回ACK消息后,主库将在存储引擎层提交事务,并将结果返回给发起的事务的客户端,然后客户端可以继续做其他事情

存在问题:如果主库在从库接收日志并写入relay中之后返回ACK消息时挂掉(主库没有收到ack),这时客户端接收不到成功的消息,如果这时主从故障切换,从库利用二进制回放可以看到事务提交的数据,但客户端却没有收到成功的消息,这个时候是不是从库的多了一个事务的数据。(幽灵事务)

after_commit:主库将事务修改写入二进制日志,把日志传输到从库,并继续在存储引擎层提交执行的事务,提交事务后,主库继续等待从库的ACK消息,收到ACK消息后,主库将提交结果返回给客户端,然后客户端可以继续做其他事情

存在问题:after_commit在主库等待从库发送ACK时,存储引擎层已经把事务提交,只是当前客户端看不到提交的数据(需要等待从库的ack消息),但其他客户端可以看到提交的数据。如果这时主库崩溃,而从库也没有接收binlog日志,那么会出现,其他客户端在主库看到的提交数据,故障切换后再原来的从库上又看不到数据了。出现所谓的“幻读”(丢数据了)而after_sync避免这个问题

半同步复制需要在主库和备库分别安装插件semisync_master.so和semisync_slave.so

系统变量和状态变量:

系统变量

rpl_semi_sync_master_enabled:控制是否在主库上启用半同步复制

rpl_semi_sync_slave_enabled:控制是否在从库上启用半同步复制

rpl_semi_sync_master_timeout:控制主库在超时切换到异步复制之前,等待从库返回ack消息的时间

状态变量:

rpl_semi_sync_master_clients:显示半同步复制从库的数量

rpl_semi_sync_master_status:显示当前主库半同步插件是否处于启用状态

rpl_semi_sync_master_no_tx:从库未成功确认事务的提交数

rpl_semi_sync_master_yes_tx:从库成功确认事务的提交数

rpl_semi_sync_slave_status:显示当前从库半同步复制插件是否处于启用状态

使用show variables like查看系统变量,通过show status like查看状态变量

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL半同步复制

    MySQL通过复制(Replication)实现存储系统的高可用。目前,MySQL支持的复制方式有:

    linjinhe
  • MySQL半同步复制

      何为半同步复制模式呢?在此我们先了解异步复制模式,这是MySQL的默认复制选项。异步复制即是master数据库把binlog日志发送给slave数据库,然后...

    那一叶随风
  • MySQL半同步复制

    要开启半同步,我们需要安装插件,基本的要求是在满足异步复制的情况下,版本在5.5以上,并且变量have_dynamic_loading为YES,即判断是否支持动...

    jeanron100
  • mysql 半同步复制

    转载:https://www.cnblogs.com/zero-gg/p/9057092.html

    用户5760343
  • MySQL的异步复制、全同步复制与半同步复制

    今天主要聊一下MySQL的异步复制、全同步复制与半同步复制,目前我们生产库实际上用的就是异步复制了,后面再转成半同步复制。

    木禾wen
  • MySQL 8 复制(二)——半同步复制

    直到目前的最新版本为止,MySQL缺省依然使用异步复制策略。简单说所谓异步复制,指的是主库写二进制日志、从库的I/O线程读主库的二进制日志写本地...

    用户1148526
  • MySQL复制全解析 Part 3 MySQL半同步复制设置

    MySQL复制全解析 Part 2 一步步搭建基于二进制文件位置的MySQL复制

    bsbforever
  • MySQL Case-使用Wireshark窥探异步复制、半同步、组复制

    我们知道异步复制、5.6版本半同步和MySQL 5.7出来的增强半同步,还有MGR在主从复制的过程中流程是不同的,那么我们能不能通过tcpdump或wiresh...

    姚崇
  • 使用Docker快速体验MySQL半同步复制机制

    近期研究了下MySQL的半同步复制机制,想要体验一下。搭建环境是件麻烦事,然后就想到用Docker快速搭建环境。

    Coder Sam
  • 半同步复制搭建过程

    半同步复制需要安装额外插件之后才能启用,然后通过相应的变量启用,在安装插件之前这些变量不可用

    wangwei-dba
  • mysql复制系列3-传统复制和GTID复制

    在mysql5.6之前的版本支持传统的复制,即基于二进制文件和位置的复制。mysql5.6及其以后的版本支持基于GTID的复制,有了GTID复制不需要指定文件和...

    wangwei-dba
  • MySQL复制(一) - 异步复制

    ​MySQL依靠轻量级的复制功能立足于互联网行业的数据库市场,同时依靠binlog可二次开发的能力,也为大数据场景发挥其特有的作用。你对MySQL主从复制了解多...

    懒熊
  • MySQL半同步复制的数据一致性探讨

    MySQL是一个RDBMS(关系型数据库管理系统),由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。由于其体积小、速度快、拥有成本低,尤其是...

    腾讯大讲堂
  • MySQL中的半同步复制(r11笔记第65天)

    关于MySQL的复制架构,大体有下面三种方式,异步,全同步复制,半同步复制。 三种复制方式 第一种是异步复制,是比较经典的主从复制,搭建主从默认的架构方...

    jeanron100
  • mysql复制系列5-多线程复制

    mysql复制中最常见的问题就是主从复制延迟问题,mysql从一开始不支持并行复制,到一步一步的优化改进多线程复制,下面介绍一下mysql复制单线程到多线程复制...

    wangwei-dba
  • mysql复制系列2-复制的格式

    mysql 复制是基于binlog日志的,binlog日志中根据事件类型,事件以不同的格式被记录到二进制日志中,复制的格式由系统变量binlog_format控...

    wangwei-dba
  • MySQL 8 复制(一)——异步复制

    简单说,复制就是将来自一个MySQL数据库服务器(主库)的数据复制到一个或多个MySQL数据库服务器(从库)。传统的MySQL复制提供了一种简单...

    用户1148526
  • mysql复制系列7-复制延迟计算

    我们在主从复制中最常遇到我的问题就是复制延迟的问题,那究竟复制延迟是怎么计算的呢?

    wangwei-dba
  • mysql复制系列1-复制的基本原理

    主库上的所有数据的变更(DDL,DML等)都会被记录到自己的binlog日志中,从库利用从主库传输来的binlog进行回放来模拟主库的数据变更

    wangwei-dba

扫码关注云+社区

领取腾讯云代金券