半同步复制中可能出现的异常情况以及应该如何应对?

2024-02-23 01:32

本文主要是介绍半同步复制中可能出现的异常情况以及应该如何应对?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 半同步复制如何应对各种异常情况?
    • 一、准备知识
      • 事务提交会经历哪些阶段
      • 何为半同步复制
    • 二、可能出现哪些异常以及如何解决
      • master 在flush binlog之前宕机
      • master 在flush binlog 之后,send binlog之前宕机
      • master 在send binlog之后,收到ack之前宕机

半同步复制如何应对各种异常情况?

全篇以MySQL-5.7 after_sync模式半同步为背景,sync_binlog=1.

对外承诺的数据零丢失,通过半同步复制究竟能实现吗?为了能够回答这个问题,我们必须对半同步复制中可能出现的任何异常情况进行描述,并且了解故障时的master-slave数据状态。

一、准备知识

事务提交会经历哪些阶段

  • flush binlog

将每一个线程中缓存的binlog文件写到binlog cache中(binlog_cache_size)

  • sync redo

根据innodb_flush_log_at_trx_commit=1的设置,事务提交时,redo必须落盘。

  • sync binlog

将binlog cache 写入磁盘文件

  • send binlog

触发dump线程发送binlog给slave

  • read ack

读取slave返回的ACK信息

  • commit

在Innodb存储引擎中进行提交,包括释放undo,释放锁资源等。

  • 返回给客户端提交结果

何为半同步复制

以MySQL-5.7 semisync after_sync为例,半同步复制解释为如下:
master端事务提交时,在binlog落盘之后,必须等待slave返回ack信息,才可以继续下面的操作。至于什么ACK,ACK具体包含了什么,其他地方有讲到。sync binlog是事务提交过程其中的一个阶段。

二、可能出现哪些异常以及如何解决

事务提交过程的各个阶段以及时间顺序如下图,根据下图,可以假设出一系列的故障场景,以及面对这些场景,应该如何解决?

master 在flush binlog之前宕机

  • 宕机瞬间情况描述:

    • master在flush binlog之前宕机,客户端未收到commit成功的信息。
    • binlog未落盘
    • redo可能落盘,也可能没有,因为存在一个后台线程,在没间隔innodb_flush_log_at_timeout之后,进行redo的刷盘操作。
    • slave未收到此事务的binlog,slave中不会存在此数据。
  • 假设只有一个半同步slave,并且rpl_semi_sync_master_wait_for_slave_count=1,那么对应的切换逻辑如下:

    • 查看relay log是否被消费完成
    • 切换为master(通过域名或者SIP,入口改变应该注意的事项不在本次讨论范围之内,比如说arp,DNS缓存等等)
  • 切换后的master修复

    • binlog中不存在对应的提交失败的事务
    • redo中可能有,也可能没有
    • MySQL会回滚掉相关提交失败的事务
    • 数据和半同步 slave保持一致。

自己可以尝试分析下面这些场景,并进行描述。明天再更新

master 在flush binlog 之后,send binlog之前宕机

master 在send binlog之后,收到ack之前宕机

等等。

这篇关于半同步复制中可能出现的异常情况以及应该如何应对?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/737109

相关文章

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL实现多源复制的示例代码

《MySQL实现多源复制的示例代码》MySQL的多源复制允许一个从服务器从多个主服务器复制数据,这在需要将多个数据源汇聚到一个数据库实例时非常有用,下面就来详细的介绍一下,感兴趣的可以了解一下... 目录一、多源复制原理二、多源复制配置步骤2.1 主服务器配置Master1配置Master2配置2.2 从服

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

MySQL配置多主复制的实现步骤

《MySQL配置多主复制的实现步骤》多主复制是一种允许多个MySQL服务器同时接受写操作的复制方式,本文就来介绍一下MySQL配置多主复制的实现步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 环境准备2. 配置每台服务器2.1 修改每台服务器的配置文件3. 安装和配置插件4. 启动组复制4.

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal