当前位置: 首页 > news >正文

MySQL45讲 第二十七讲 主库故障应对:从库切换策略与 GTID 详解——阅读总结

文章目录

  • MySQL45讲 第二十七讲 主库故障应对:从库切换策略与 GTID 详解
    • 一、一主多从架构与主备切换的挑战
      • (一)一主多从基本结构
      • (二)主备切换的复杂性
    • 二、基于位点的主备切换
      • (一)同步位点的概念与获取方法
      • (二)处理同步错误的方法
    • 三、GTID 的引入与优势
      • (一)GTID 的概念与组成
      • (二)GTID 的生成与分配方式
      • (三)基于 GTID 的主备切换逻辑
      • (四)GTID 在在线 DDL 中的应用
    • 四、总结与思考

MySQL45讲 第二十七讲 主库故障应对:从库切换策略与 GTID 详解

在 MySQL 数据库架构中,一主多从结构被广泛应用于应对读多写少的业务场景,以提升系统的读性能。然而,当主库出现故障时,如何确保从库能够顺利接管并保证数据的一致性和完整性,成为了至关重要的问题。今天,我们将深入探讨一主多从架构下主库故障后的主备切换问题,重点介绍基于位点和基于 GTID(Global Transaction Identifier)的两种切换方式及其原理、优缺点。

一、一主多从架构与主备切换的挑战

(一)一主多从基本结构

如图 1 所示,一主多从结构中,虚线箭头表示主备关系(如 A 和 A’互为主备),从库 B、C、D 指向主库 A。主库负责所有写入和部分读操作,从库分担其他读请求,实现读写分离。

在这里插入图片描述

(二)主备切换的复杂性

当主库发生故障时(如图 2 所示),主备切换后 A’成为新主库,从库 B、C、D 需要改接到 A’。这一过程相较于一主一备结构更为复杂,因为涉及到多个从库重新指向新主库的操作,而其中关键的问题是从库如何找到与新主库的同步位点。

在这里插入图片描述


二、基于位点的主备切换

(一)同步位点的概念与获取方法

  1. 概念:当把节点 B 设置为节点 A’的从库时,需要通过 CHANGE MASTER 命令指定同步位点,即主库对应的文件名和日志偏移量(MASTER_LOG_FILE 和 MASTER_LOG_POS)。

    CHANGE MASTER TO
    MASTER_HOST=$host_name
    MASTER_PORT=$port
    MASTER_USER=$user_name
    MASTER_PASSWORD=$password
    MASTER_LOG_FILE=$master_log_name
    MASTER_LOG_POS=$master_log_pos
    
    • MASTER_HOST、MASTER_PORT、MASTER_USER和MASTER_PASSWORD四个参数,分别代表了主库A’的IP、端口、用户名和密码。
    • 最后两个参数MASTER_LOG_FILE和MASTER_LOG_POS表示,要从主库的 master_log_name文件的master_log_pos这个位置的日志继续同步。而这个位置就是我们所 说的同步位点,也就是主库对应的文件名和日志偏移量。
  2. 获取方法及不精确性:

    • 一种常见方法是等待新主库 A’把中转日志(relay log)全部同步完成,在 A’上执行 show master status 命令获取当前最新的 File 和 Position,取原主库 A 故障时刻 T,然后用 mysqlbinlog 工具解析 A’的 File,得到 T 时刻的位点(如 end_log_pos 的值)。但此方法并不精确,例如假设在 T 时刻主库 A 插入一行数据 R 并传 binlog 给 A’和 B 后瞬间掉电,从库 B 已存在 R,新主库 A’的日志在该位点之后,此时 B 切换指向 A’的该位点,会再次同步插入 R 的 binlog,导致主键冲突。

(二)处理同步错误的方法

在这里插入图片描述

  1. 主动跳过事务:通过执行 set global sql_slave_skip_counter = 1; start slave; 命令,每次遇到主键冲突(1062 错误)或删除数据时找不到行(1032 错误)等错误时,停下来执行该命令跳过可能重复的事务,直到不再出现错误。
  2. 设置 slave_skip_errors 参数:将 slave_skip_errors 设置为 “1032,1062”,直接跳过指定错误。但这种方法仅适用于主备切换时因找不到精确同步位点而创建主备关系的情况,且在主备同步关系稳定后,需将该参数设置为空,以免掩盖后续真正的数据不一致问题。

三、GTID 的引入与优势

(一)GTID 的概念与组成

GTID(Global Transaction Identifier)是事务在提交时生成的全局唯一标识,由 server_uuid(实例第一次启动时自动生成的全局唯一值)和 gno(初始值为 1,每次提交事务时递增)组成,格式为 GTID = server_uuid:gno。它在 MySQL 5.6 版本引入,用于解决主备切换中找同步位点的难题。

(二)GTID 的生成与分配方式

  1. 默认生成方式(gtid_next = automatic):MySQL 会将 server_uuid:gno 分配给事务。记录 binlog 时,先记录一行 SET @@SESSION.GTID_NEXT = ‘server_uuid:gno’,并将该 GTID 加入本实例的 GTID 集合。
  2. 指定 GTID 值(gtid_next 为指定值):若 gtid_next 指定为一个已存在于实例 GTID 集合中的 GTID(如 current_gtid),则接下来执行的事务会被系统忽略;若不存在,则将该 current_gtid 分配给事务,事务提交后,若要执行下一个事务,需再次设置 gtid_next。

(三)基于 GTID 的主备切换逻辑

  1. 语法与优势:在 GTID 模式下,备库 B 设置为新主库 A’的从库语法为 CHANGE MASTER TO… master_auto_position = 1,无需指定 MASTER_LOG_FILE 和 MASTER_LOG_POS 参数。
  2. 切换流程:
    • 实例 B 指定主库 A’建立连接,将自己的 GTID 集合 set_b 发给 A’。
    • A’算出 set_a 与 set_b 的差集,判断本地是否包含差集所需的所有 binlog 事务,若不包含则返回错误;若包含,从自己的 binlog 文件中找出第一个不在 set_b 的事务发给 B,之后按顺序取 binlog 发给 B 执行。

(四)GTID 在在线 DDL 中的应用

以之前提到的在线加索引为例,在双 M 结构且开启 GTID 模式下,可在实例 X(主库)上执行 stop slave,在实例 Y(备库)上执行 DDL 语句(无需关闭 binlog),查出 DDL 语句对应的 GTID,然后在实例 X 上执行一系列语句(如 set GTID_NEXT = “server_uuid_of_Y:gno”; begin; commit; set gtid_next = automatic; start slave;),既保证了实例 Y 的更新有 binlog 记录,又确保实例 X 不会重复执行该更新。

四、总结与思考

在一主多从架构下,主库故障后的主备切换涉及到同步位点的确定和处理同步错误等复杂问题。基于位点的切换方法存在不精确性,而 GTID 的引入为解决这些问题提供了更简洁、可靠的方案。在 GTID 模式下,主备切换更加方便,系统能自动完成位点查找工作,且在在线 DDL 等场景中也有很好的应用。

相关文章:

MySQL45讲 第二十七讲 主库故障应对:从库切换策略与 GTID 详解——阅读总结

文章目录 MySQL45讲 第二十七讲 主库故障应对:从库切换策略与 GTID 详解一、一主多从架构与主备切换的挑战(一)一主多从基本结构(二)主备切换的复杂性 二、基于位点的主备切换(一)同步位点的概念…...

JavaWeb笔记整理——Spring Task、WebSocket

目录 SpringTask ​cron表达式 WebSocket SpringTask cron表达式 WebSocket...

基于SpringBoot+RabbitMQ完成应⽤通信

前言: 经过上面俩章学习,我们已经知道Rabbit的使用方式RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)-CSDN博客作为⼀个消息队列,RabbitMQ也可以⽤作应⽤程…...

Flutter踩坑记录(一)debug运行生成的项目,不能手动点击运行

问题 IOS14设备,切后台划掉,二次启动崩溃。 原因 IOS14以上 flutter 不支持debugger模式下的二次启动 。 要二次启动需要以release方式编译工程安装至手机。 操作步骤 清理项目:在命令行中运行flutter clean来清理之前的构建文件。重新构…...

React的hook✅

为什么hook必须在组件内的顶层声明? 这是为了确保每次组件渲染时,Hooks 的调用顺序保持一致。React利用 hook 的调用顺序来跟踪各个 hook 的状态。每当一个函数组件被渲染时,所有的 hook 调用都是按照从上到下的顺序依次执行的。React 内部会…...

2024.5 AAAiGLaM:通过邻域分区和生成子图编码对领域知识图谱对齐的大型语言模型进行微调

GLaM: Fine-Tuning Large Language Models for Domain Knowledge Graph Alignment via Neighborhood Partitioning and Generative Subgraph Encoding 问题 如何将特定领域知识图谱直接整合进大语言模型(LLM)的表示中,以提高其在图数据上自…...

从熟练Python到入门学习C++(record 6)

基础之基础之最后一节-结构体 1.结构体的定义 结构体相对于自定义的一种新的变量类型。 四种定义方式&#xff0c;推荐第一种&#xff1b;第四种适合大量定义&#xff0c;也适合查找&#xff1b; #include <iostream> using namespace std; #include <string.h>…...

jenkins的安装(War包安装)

‌Jenkins是一个开源的持续集成工具&#xff0c;基于Java开发&#xff0c;主要用于监控持续的软件版本发布和测试项目。‌ 它提供了一个开放易用的平台&#xff0c;使软件项目能够实现持续集成。Jenkins的功能包括持续的软件版本发布和测试项目&#xff0c;以及监控外部调用执行…...

WPS 加载项开发说明wpsjs

wpsjs几个常用的CMD命令&#xff1a; 1.打开cmd输入命令测试版本号 npm -v 2.首次安装nodejs&#xff0c;npm默认国外镜像&#xff0c;包下载较慢时&#xff0c;可切换到国内镜像 //下载速度较慢时可切换国内镜像 npm config set registry https://registry.npmmirror.com …...

【Anomaly Detection论文阅读记录】PaDiM与PatchCore模型的区别与联系

PaDiM与PatchCore模型的区别与联系 背景介绍 PADIM(Pretrained Anomaly Detection via Image Matching)和 PatchCore 都是基于深度学习的异常检测方法,主要用于图像异常检测,尤其是在无监督学习设置下。 PADIM 是一种通过利用预训练的视觉模型(例如,ImageNet预训练的卷…...

uni-app Vue3语法实现微信小程序样式穿透uview-plus框架

1 问题描述 我在用 uni-app vue3 语法开发微信小程序时&#xff0c;在项目中使用了 uview-plus 这一开源 UI 框架。在使用 up-text 组件时&#xff0c;想要给它添加一些样式&#xff0c;之前了解到微信小程序存在样式隔离的问题&#xff0c;也在uview-plus官网-注意事项中找到…...

K8S基础概念和环境搭建

K8S的基础概念 1. 什么是K8S K8S的全称是Kubernetes K8S是一个开源的容器编排平台&#xff0c;用于自动化部署、扩缩、管理容器化应用程序。 2. 集群和节点 集群&#xff1a;K8S将多个机器统筹和管理起来&#xff0c;彼此保持通讯&#xff0c;这样的关系称之为集群。 节点…...

[服务器] 腾讯云服务器免费体验,成功部署网站

文章目录 概要整体架构流程概要 腾讯云服务器免费体验一个月。 整体架构流程 腾讯云服务器体验一个月, 选择预装 CentOS 7.5 首要最重要的是: 添加阿里云镜像。 不然国外源速度慢, 且容易失败。 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/li…...

vue中el-select 模糊查询下拉两种方式

第一种&#xff1a;先获取所有下拉数据再模糊查询&#xff0c;效果如下 1&#xff0c;页面代码&#xff1a;speciesList是种类列表List, speciesId 是speciesList里面对应的id&#xff0c;filterable是过滤查询标签 <el-form-item label"种类" prop"species…...

深入解析PostgreSQL中的PL/pgSQL语法

在数据库管理系统中&#xff0c;PostgreSQL因其强大的功能和稳定性而受到广泛欢迎。其中&#xff0c;PL/pgSQL作为PostgreSQL的过程化语言&#xff0c;为用户提供了更为灵活和强大的编程能力。本文将深入解析PL/pgSQL的语法&#xff0c;帮助读者更好地掌握这门语言&#xff0c;…...

Vue 3集成海康Web插件实现视频监控

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;组件封装篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来组件封装篇专栏内容:Vue 3集成海康Web插件实现视频监控 引言 最近在项目中使用了 Vue 3 结合海康Web插件来实…...

多目标优化算法:多目标蛇鹫优化算法(MOSBOA)求解DTLZ1-DTLZ9,提供完整MATLAB代码

一、蛇鹫优化算法 蛇鹫优化算法&#xff08;Secretary Bird Optimization Algorithm&#xff0c;简称SBOA&#xff09;由Youfa Fu等人于2024年4月发表在《Artificial Intelligence Review》期刊上的一种新型的元启发式算法。该算法旨在解决复杂工程优化问题&#xff0c;特别是…...

机器翻译基础与模型 之三:基于自注意力的模型

基于RNN和CNN的翻译模型&#xff0c;在处理文字序列时有个问题&#xff1a;它们对序列中不同位置之间的依赖关系的建模并不直接。以CNN的为例&#xff0c;如果要对长距离依赖进行描述&#xff0c;需要多层卷积操作&#xff0c;而且不同层之间信息传递也可能有损失&#xff0c;这…...

如何使用PCL处理ROS Bag文件中的点云数据并重新保存 ubuntu20.04

如何使用PCL处理ROS Bag文件中的点云数据并重新保存 要精确地处理ROS bag中的点云数据并使用PCL进行处理&#xff0c;再将处理后的数据保存回新的ROS bag文件&#xff0c;以下方案提供了详细、专业和严谨的步骤。 步骤 1: 环境设置 确保安装了ROS和PCL&#xff0c;并配置好环…...

背包问题(动态规划)

背包问题是一种组合优化的问题&#xff0c;它有多种变体&#xff0c;但最常见的两种是0/1背包问题和完全背包问题。 0/1背包问题 问题描述&#xff1a; 假设你有一个背包&#xff0c;背包的容量为W&#xff08;可以是重量或者体积等度量&#xff09;&#xff0c;同时有n个物品…...

从0开始学习机器学习--Day26--聚类算法

无监督学习(Unsupervised learning and introduction) 监督学习问题的样本 无监督学习样本 如图&#xff0c;可以看到两者的区别在于无监督学习的样本是没有标签的&#xff0c;换言之就是无监督学习不会赋予主观上的判断&#xff0c;需要算法自己去探寻区别&#xff0c;第二张…...

Vue3插槽v-slot使用方式

在 Vue 3 中&#xff0c;v-slot 是用来定义和使用插槽的指令。插槽是 Vue 的一个功能&#xff0c;允许你在组件内部定义占位内容&#xff0c;便于在父组件中提供动态内容。以下是 v-slot 的详细使用方法&#xff1a; 1. 基础使用 <template><BaseComponent><te…...

Axure二级菜单下拉交互实例

1.使用boxlabe进行基础布局 2.设置鼠标悬浮和选中状态 3.转换为动态面板 选中所有二级菜单,进行按钮组转换 选中所有二级菜单,进行动态面板转换 4.给用户管理增加显示/隐藏事件 1)选择toggle代表上拉和下拉切换加载 2)勾选Bring to Front,并选择Push/Pull Widgets代表收缩时…...

华为VPN技术

1.启动设备 2.配置IP地址 [FW1]int g1/0/0 [FW1-GigabitEthernet1/0/0]ip add 192.168.1.254 24 [FW1-GigabitEthernet1/0/0]int g1/0/1 [FW1-GigabitEthernet1/0/1]ip add 100.1.1.1 24 [FW1-GigabitEthernet1/0/1]service-manage ping permit [FW2]int g1/0/0 [FW2-Gi…...

CommonsBeanutils与Shiro发序列化利用的学习

一、前言 前面的学习中&#xff0c;过了一遍cc1-cc7的利用链&#xff0c;在CC2的利用链中&#xff0c;学习了 java.util.PriorityQueue&#xff0c;它在Java中是一个优先队列&#xff0c;队列中每一个元素都有自己的优先级。在反序列化这个对象时&#xff0c;为了保证队列顺序…...

运维云计算SRE-第2周

1. 总结学过的权限&#xff0c;属性及ACL相关命令及选项&#xff0c;示例。 一、Linux安全模型 &#xff08;一&#xff09;资源分派 Authentication&#xff08;认证&#xff09;&#xff1a;验证用户身份&#xff0c;确保登录系统的用户是合法的。 Authorization&#xff08…...

React Native 全栈开发实战班 - 用户界面进阶之响应式设计实践

在移动应用开发中&#xff0c;响应式设计 是确保应用在不同设备、屏幕尺寸和方向下都能提供良好用户体验的关键。React Native 提供了多种工具和技巧来实现响应式设计&#xff0c;包括 Flexbox 布局、动态样式、屏幕尺寸适配等。本章节将详细介绍如何在 React Native 中进行响应…...

SlickGrid点击/双击事件

分析 SlickGrid提供了点击事件方法grid.onClick和grid.onDblClick用于捕获用户对表格列的点击&#xff0c;捕获到点击事件之后&#xff0c;修改表格数据&#xff0c;然后使用grid.updateRow方法将修改后的数据更新到表格中。 展示 代码 创建grid&#xff08;HTML&#xff09;…...

一文详细深入总结服务器选型

1. 题记&#xff1a; 服务器选型工作是项目规划检讨的一项非常重要的工作&#xff0c;本文详细深入总结服务器选型。 2. 服务器基础知识概览 2.1 服务器的定义与功能 2.1 .1 定义 服务器是一种高性能计算机&#xff0c;其设计目的是在网络中提供服务。它可以处理来自多个客…...

一、Nginx反向代理(七层代理)二、Nginx的TCP/UDP调度器(四层代理)

一、Nginx反向代理&#xff08;七层代理&#xff09; 实验要求 使用Nginx实现Web反向代理功能&#xff0c;实现如下功能&#xff1a; 后端Web服务器两台&#xff0c;可以使用httpd实现Nginx采用轮询的方式调用后端Web服务器两台Web服务器的权重要求设置为不同的值最大失败次数为…...

公司网站建设发票能抵扣不/seo免费优化工具

变量的作用域意思就是变量可以在什么位置使用 变量的作用域分为&#xff1a;局部作用域&#xff0c;全局作用域 局部变量&#xff1a; 在函数内声明的变量&#xff0c;只能在该函数内访问 函数运行结束&#xff0c;变量自动销毁 函数参数也是局部变量&#xff0c;只能在当前函…...

虎门网站seo/手机百度ai入口

本文为《浅谈服务治理、微服务与Service Mesh》系列文章第三篇&#xff0c;前两篇分别为&#xff1a;浅谈服务治理、微服务与Service Mesh&#xff08;一&#xff09;&#xff1a;Dubbo的前世今生浅谈服务治理、微服务与Service Mesh&#xff08;二&#xff09;&#xff1a;Spr…...

政府网站网站安全建设目标/网络营销渠道有哪些

拆包粘包问题解决 netty使用tcp/ip协议传输数据。而tcp/ip协议是类似水流一样的数据传输方式。多次访问的时候有可能出现数据粘包的问题&#xff0c;解决这种问题的方式如下&#xff1a; 1 定长数据流 客户端和服务器&#xff0c;提前协调好&#xff0c;每个消息长度固定。&…...

做网站用Linux还是win/个人网页模板

网络编程(c/s)与网站编程(b/s)的区别&#xff1f;网站编程是编写网页html,jsp,servelet等&#xff0c;只需要编写一端(server端),不需要编写client端&#xff0c;已经编写好了网络编程相对底层一些&#xff0c;服务端和客户端都需要编写&#xff0c;比如说QQ,msn,飞秋。网络编程…...

新手学做网站 pdf下载/百度seo公司电话

啥&#xff1f;你把CUDA系列学习&#xff08;一&#xff09;&#xff0c;&#xff08;二&#xff09;都看完了还不知道為什麼要用GPU提速&#xff1f; 是啊。。经微博上的反馈我默默感觉到提出这样问题的小伙伴不在少数&#xff0c;但是更多小伙伴应该是看了&#xff08;一&…...

长沙品牌网站设计/seo优化推广工程师招聘

因单表数据太大&#xff0c; 需要表按时间分区 分区字段 pay_out_date 按天分 要求自动创建 1. 创建分区表 MYSQL的分区字段&#xff0c;必须包含在主键字段内 常见错误提示 错误提示&#xff1a;#1503 A PRIMARY KEY MUST INCLUDE ALL COLUMNS IN THE TABLES PARTITIONING…...