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

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

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

禁止复制的网页怎么复制

禁止复制的网页怎么复制 文章目录 禁止复制的网页怎么复制前言准备工作操作步骤一、在浏览器菜单中找到“开发者工具”二、点击“检查元素(inspect element)”按钮三、在网页中选取需要的片段,锁定对应的元素四、复制被选中的元素五、粘贴到记事本,以`.html`为后缀命名六、打开`xxx.html`,优雅地复制 前言 在浏览网页的时候,有的网页内容无法复制。比如「360

编程应该用 Mac 还是 PC ?

『有人的地方,就有江湖』—徐克。笑傲江湖。     序     一个竞争的市场,就会有对立的产生,这世界存在著很多不同的领域,领域好比是个江湖的缩影,因此就有许多门派的纷争,例如说浏览器领域有著最大宗的IE派,门派成长速度飞快,武功版号跳的跟台湾物价指数一样快的Chrome门,不断被模仿,一直被超越的Opera派;韧性极强,一直对抗几大势力的Firefox派等等,程序语言也有自己的领域

找出php中可能有问题的代码行

前言 当你发现一个平时占用cpu比较少的进程突然间占用cpu接近100%时,你如何找到导致cpu飙升的原因?我的思路是,首先找到进程正在执行的代码行,从而确定可能有问题的代码段。然后,再仔细分析有问题的代码段,从而找出原因。 如果你的程序使用的是c、c++编写,那么你可以很容易的找到正在执行的代码行。但是,程序是php编写的,如何找到可能有问题的代码行呢?这个问题就是本文要解决的问题。 背景

MySQL主从同步延迟原理及解决方案

概述 MySQL的主从同步是一个很成熟的架构,优点为: ①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力; ②在从主服务器进行备份,避免备份期间影响主服务器服务; ③当主服务器出现问题时,可以切换到从服务器。 相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢? MyS

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满

mysql创建新表,同步数据

import os import argparse import glob import cv2 import numpy as np import onnxruntime import tqdm import pymysql import time import json from datetime import datetime os.environ[“CUDA_VISIBLE_DEVICE