MySQL45讲 第二十五讲 高可用性深度剖析:从主备原理到策略选择

news2024/11/19 21:08:27

文章目录

  • MySQL45讲 第二十五讲 高可用性深度剖析:从主备原理到策略选择
    • 一、MySQL 主备基础原理
      • (一)主备关系与数据同步
      • (二)主备切换流程
    • 二、主备延迟分析
      • (一)主备延迟的定义与计算
      • (二)主备延迟的来源
    • 三、主备切换策略
      • (一)可靠性优先策略
      • (二)可用性优先策略
      • (三)策略选择的权衡
    • 四、异常切换情况
      • (一)异常切换流程
      • (二)对可用性的影响
    • 五、总结与思考

MySQL45讲 第二十五讲 高可用性深度剖析:从主备原理到策略选择

在当今数字化时代,数据库的高可用性对于企业的业务连续性至关重要。MySQL 作为广泛使用的关系型数据库管理系统,其高可用性机制一直备受关注。今天,我们将深入探讨 MySQL 是如何保证高可用性的,这涉及到主备关系中的数据同步、主备延迟的产生原因及应对策略,以及主备切换时可靠性优先和可用性优先策略的权衡。


一、MySQL 主备基础原理

(一)主备关系与数据同步

在 MySQL 的主备关系中,每个备库接收主库的 binlog 并执行,以此来保持数据一致。正常情况下,主库执行更新生成的 binlog 能顺利传到备库并被正确执行,备库就能达到与主库一致的状态,这就是最终一致性。例如,在一个简单的一主一备架构中,主库上的数据更新操作会被记录到 binlog 中,备库通过读取和执行这些 binlog,实现数据的同步更新。

(二)主备切换流程

我们来看双 M 结构的主备切换流程(如下图所示)。

在这里插入图片描述

在状态 1 时,客户端的读写直接访问主库 A,备库 B 作为主库 A 的备库,通过同步 A 的更新来保持数据一致。此时,通常建议将备库 B 设置为只读(readonly)模式,原因如下:

  1. 防止运营类查询语句在备库上的误操作。例如,运营人员可能在备库上执行一些临时查询,如果备库可写,可能会不小心修改数据,导致主备数据不一致。
  2. 避免切换逻辑出现 bug,如双写导致主备不一致。如果备库可写,在主备切换过程中可能会出现同时写入主库和备库的情况,破坏数据的一致性。
  3. 可依据 readonly 状态判断节点角色。在运维过程中,通过查看节点的 readonly 状态,可以快速确定其是主库还是备库,便于管理和维护。
  4. 虽然设置为 readonly,但用于同步更新的线程拥有超级权限,仍可进行数据同步。这样既能保证备库的只读性,又能确保数据的同步正常进行。

当需要切换时,客户端读写访问切换到备库 B,此时备库 B 成为主库,原主库 A 成为备库。


二、主备延迟分析

(一)主备延迟的定义与计算

  1. 相关时间点
    • 主库 A 执行完成一个事务,写入 binlog 的时刻记为 T1。
    • 备库 B 接收完这个 binlog 的时刻记为 T2。
    • 备库 B 执行完成这个事务的时刻记为 T3。
    • 主备延迟就是同一个事务在备库执行完成的时间和主库执行完成的时间之间的差值,即 T3 - T1
  2. 计算方法
    • 可以在备库上执行 show slave status 命令,其返回结果中的 seconds_behind_master 用于表示当前备库延迟了多少秒。seconds_behind_master 的计算方法是:每个事务的 binlog 里面都有一个时间字段,用于记录主库上写入的时间备库取出当前正在执行的事务的时间字段的值,计算它与当前系统时间的差值,得到 seconds_behind_master。实际上,seconds_behind_master 计算的就是 T3 - T1,其时间精度是秒。
  3. 系统时间不一致的影响
    • 若主备库机器的系统时间设置不一致,不会导致主备延迟的值不准。因为备库连接到主库的时候,会通过执行 SELECT UNIX_TIMESTAMP () 函数来获得当前主库的系统时间。如果发现主库的系统时间与自己不一致,备库在执行 seconds_behind_master 计算的时候会自动扣掉这个差值。

(二)主备延迟的来源

  1. 备库性能较差
    • 在一些部署中,备库所在机器的性能比主库所在机器性能差。例如,有人认为备库没有请求,所以使用较差的机器,或者将多个主库放在少数性能较好的机器上,而把备库集中在一台性能较差的机器上。然而,更新请求对 IOPS 的压力在主库和备库上并无差别,这种部署可能导致备库在处理事务时资源不足,从而造成主备延迟。不过,现在这种不对称部署情况较少,更多的是采用主备库选用相同规格机器并做对称部署的方式。
  2. 备库压力大
    • 一种常见情况是,主库提供写能力,备库提供读能力,同时一些运营后台需要的分析语句也在备库上运行。由于主库直接影响业务,使用时会比较克制,而备库的压力容易被忽视。大量的查询操作可能耗费备库大量的 CPU 资源,影响同步速度,进而造成主备延迟。针对这种情况,可以采用一主多从的方式,让多个从库分担读的压力;或者通过 binlog 输出到外部系统(如 Hadoop),让外部系统提供统计类查询的能力。其中,一主多从的方式较为常用,因为从库还适合用于定期全量备份。
  3. 大事务
    • 大事务是导致主备延迟的另一个重要原因。主库上必须等事务执行完成才会写入 binlog 并传给备库,所以如果一个主库上的语句执行时间很长,如一次性删除大量数据或执行大表 DDL 操作,就会导致从库延迟。例如,一些归档类数据在删除时,如果一次性删除过多,可能会使备库延迟很长时间。对于计划内的大表 DDL 操作,建议使用 gh - ost 方案来减少对主备延迟的影响。
  4. 备库的并行复制能力
    • 备库的并行复制能力也会影响主备延迟,这将在下一篇文章中详细介绍。此外,还有其他一些情况可能导致主备延迟,如主库 DML 语句并发大、从库服务器配置差、主库和从库参数配置不一样、从库上在进行备份操作、表上无主键(主库利用索引更改数据,备库回放只能用全表扫描)、设置的是延迟备库、备库空间不足等。

三、主备切换策略

(一)可靠性优先策略

在这里插入图片描述

  1. 切换流程
    • 在双 M 结构下,从状态 1 到状态 2 切换时,可靠性优先策略的详细过程如下:
      • 判断备库 B 现在的 seconds_behind_master,如果小于某个值(如 5 秒)继续下一步,否则持续重试这一步。这一步的目的是确保备库与主库的延迟在可接受范围内,避免切换后出现数据不一致的情况。
      • 把主库 A 改成只读状态,即把 readonly 设置为 true。这可以防止在切换过程中主库有新的数据写入,保证数据的一致性。
      • 判断备库 B 的 seconds_behind_master 的值,直到这个值变成 0 为止。这一步需要等待备库完全同步主库的数据,确保切换后的数据准确性。
      • 把备库 B 改成可读写状态,也就是把 readonly 设置为 false。此时备库 B 成为新的主库,可以接受读写请求。
      • 把业务请求切到备库 B,完成主备切换。
  2. 不可用时间分析
    • 这个切换流程中存在不可用时间。在步骤 2 之后,主库 A 和备库 B 都处于 readonly 状态,系统处于不可写状态,直到步骤 5 完成后才能恢复。其中,步骤 3 可能需要耗费较长时间,这也是为什么需要在步骤 1 先做判断,确保 seconds_behind_master 的值足够小。如果一开始主备延迟就很长,如长达 30 分钟,而不先做判断直接切换,系统的不可用时间就会很长,这对业务来说可能是不可接受的。

(二)可用性优先策略

在这里插入图片描述

  1. 切换流程与数据不一致示例
    • 如果强行把步骤 4、5 调整到最开始执行,即不等主备数据同步,直接把连接切到备库 B 并让其可读写,系统几乎没有不可用时间,但可能出现数据不一致的情况。
    • 例如,假设有一个表 t 定义了自增主键 id,初始化数据后,主库和备库上都是 3 行数据。业务人员要执行两条插入语句,在插入一条 c = 4 的语句后发起主备切换(假设此时主备延迟达到 5 秒)。
    • 主库 A 执行完 insert 语句,插入了一行数据 (4,4) 后开始切换。由于主备延迟,备库 B 还没来得及应用 “插入 c = 4” 的中转日志,就开始接收客户端 “插入 c = 5” 的命令,此时备库 B 插入了一行数据 (4,5),并把 binlog 发给主库 A。接着备库 B 执行 “插入 c = 4” 的中转日志,插入了一行数据 (5,4),而直接在备库 B 执行的 “插入 c = 5” 语句传到主库 A 后,插入了一行新数据 (5,5)。最终,主库 A 和备库 B 上出现了两行不一致的数据。
  2. binlog 格式对数据一致性的影响
    • 当设置 binlog_format = row 时,数据不一致的问题更容易被发现。因为 row 格式在记录 binlog 时会记录新插入行的所有字段值,所以最后只会有一行不一致,且两边的主备同步应用线程会报错 duplicate key error 并停止。而使用 mixed 或 statement 格式的 binlog 时,数据很可能悄悄地就不一致了,如果过了很久才发现数据不一致问题,可能这时的数据不一致已经不可查,或者连带造成了更多的数据逻辑不一致。

(三)策略选择的权衡

  1. 可靠性优先的建议
    • 大多数情况下,建议使用可靠性优先策略。因为对数据服务来说,数据的可靠性一般要优于可用性。保证数据准确是数据库服务的底线,在此基础上,通过减少主备延迟来提升系统的可用性。
  2. 可用性优先的适用场景
    • 然而,也存在一些情况数据的可用性优先级更高。例如,有一个库用于记录操作日志,数据不一致可以通过 binlog 来修补,且短暂的不一致不会引发业务问题,同时业务系统依赖于这个日志写入逻辑,如果库不可写会导致线上业务操作无法执行。在这种情况下,可以选择先强行切换,事后再补数据的策略。但事后复盘时,应考虑改进措施,如让业务逻辑不依赖于这类日志的写入,将日志写入逻辑模块降级,写到本地文件或另一个临时库中,这样就可以再次使用可靠性优先策略。

四、异常切换情况

在这里插入图片描述

(一)异常切换流程

假设主库 A 和备库 B 间的主备延迟是 30 分钟,此时主库 A 掉电,HA 系统要切换 B 作为主库。按照可靠性优先策略,必须等到备库 B 的 seconds_behind_master = 0 之后才能切换。但此时由于主库 A 掉电,连接还未切到备库 B,系统处于完全不可用状态。如果直接切换到备库 B 且保持 B 只读也不行,因为中转日志还未应用完成,客户端查询可能会认为有 “数据丢失”,虽然数据最终会恢复,但查询到 “暂时丢失数据的状态” 对一些业务来说是不可接受的。

(二)对可用性的影响

从这个例子可以看出,在满足数据可靠性的前提下,MySQL 高可用系统的可用性依赖于主备延迟。延迟时间越小,在主库故障时服务恢复所需时间就越短,可用性就越高。


五、总结与思考

MySQL 通过主备机制实现高可用性,主备数据同步基于 binlog。主备延迟的产生有多种原因,包括备库性能、压力、大事务以及并行复制能力等。在主备切换时,可靠性优先策略能保证数据一致性但可能存在不可用时间,可用性优先策略可减少不可用时间但可能导致数据不一致。在实际应用中,应根据业务需求权衡选择合适的策略。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨越网络边界:IPv6与零信任架构的深度融合

2024年,工信部发布了《关于开展“网络去NAT”专项工作 进一步深化IPv6部署应用的通知》,加速了国内网络由IPv4向IPv6的转型步伐。未来,各行各业将逐步去NAT,逐步向IPv6迁移。在此过程中,网络安全解决方案和产品能力将面…

Linux—ln(link files)命令使用方法(How to create links on Linux)

Linux—ln(link files)命令使用方法 在 Linux 系统中工作时,需要在不同的目录中使用相同的文件时,不必在每个目录下都复制一份文件,这样不仅浪费磁盘空间,还会导致文件管理上的混乱。 ln(link files) 便是…

我要成为算法高手-位运算篇

目录 1. 判断字符是否唯一2. 消失的数字3. 两整数之和4. 只出现一次的数字II5. 消失的两个数字 前情提要:如果对一些常见的二进制位运算不熟悉,请看这篇文章: 常见的位运算 1. 判断字符是否唯一 面试题 01.01. 判定字符是否唯一 - 力扣&…

1Panel 推送 SSL 证书到阿里云、腾讯云

本文首发于 Anyeの小站,点击链接 访问原文体验更佳 前言 都用 CDN 了还在乎那点 1 年证书钱么? 开句玩笑话,按照 Apple 的说法,证书有效期不该超过 45 天。那么证书有效期的缩短意味着要更频繁地更新证书。对于我这样的“裸奔”…

23种设计模式-访问者(Visitor)设计模式

文章目录 一.什么是访问者模式?二.访问者模式的结构三.访问者模式的应用场景四.访问者模式的优缺点五.访问者模式的C实现六.访问者模式的JAVA实现七.代码解释八.总结 类图: 访问者设计模式类图 一.什么是访问者模式? 访问者模式(…

JavaScript——DOM编程、JS的对象和JSON

一、DOM编程 DOM(Document Object Model)编程:就是使用document对象的API,完成对网页HTML文档进行动态修改,以实现网页数据,和样式动态变化效果的编程。 (一)DOM获取元素的多种方法 1.查找元素的函数 getElementById("id值…

Pr:音频过渡

Adobe Premiere Pro 自带一组共三个音频过渡 Audio Transitions效果。 对音频剪辑之间应用交叉淡化 Crossfade过渡,操作方式类似于应用视频过渡效果。 对于交叉淡化,要保证前剪辑的出点之后及后剪辑的入点之前有足够的预留内容(也称“手柄”&…

大数据-226 离线数仓 - Flume 优化配置 自定义拦截器 拦截原理 拦截器实现 Java

点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop&#xff0…

stm32启动过程解析startup启动文件

1.STM32的启动过程模式 1.1 根据boot引脚决定三种启动模式 复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于…

如何在项目中用elementui实现分页器功能

1.在结构部分复制官网代码&#xff1a; <template> 标签: 这是 Vue 模板的根标签&#xff0c;包含所有的 HTML 元素和 Vue 组件。 <div> 标签: 这是一个普通的 HTML 元素&#xff0c;包裹了 el-pagination 组件。它没有特别的意义&#xff0c;只是为了确保 el-pagi…

15-大模型 RAG 经验篇

一、LLMs 已经具备了较强能力了&#xff0c;存在哪些不足点? 在 LLM 已经具备了较强能力的基础上&#xff0c;仍然存在以下问题&#xff1a; 幻觉问题&#xff1a;LLM 文本生成的底层原理是基于概率的 token by token 的形式&#xff0c;因此会不可避免地产生"一本正经…

数据结构-二叉树及其遍历

🚀欢迎来到我的【数据结构】专栏🚀 🙋我是小蜗,一名在职牛马。🐒我的博客主页​​​​​​ ➡️ ➡️ 小蜗向前冲的主页🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏🌍前言 本篇文章咱们聊聊数据结构中的树,准确的说因该是只说一说二叉树以及相…

Iview DatePicker 仅允许选择当前月份及以后的月份

iview DatePicker之前月份禁用且下月可用 html代码 <DatePicker type"month" :options"options4" :value"dialogForm.estimatedStartTimeWithCreate" on-change"monthTime($event, loadDateStart)" placeholder"请选择时间&q…

r-and-r——提高长文本质量保证任务的准确性重新提示和上下文搜索的新方法可减轻大规模语言模型中的迷失在中间现象

概述 随着大规模语言模型的兴起&#xff0c;自然语言处理领域取得了重大发展。这些创新的模型允许用户通过输入简单的 "提示 "文本来执行各种任务。然而&#xff0c;众所周知&#xff0c;在问题解答&#xff08;QA&#xff09;任务中&#xff0c;用户在处理长文本时…

【GPTs】Ai-Ming:AI命理助手,个人运势与未来发展剖析

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;Ai-Ming主要功能适用场景优点缺点 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; defcomplete_sexagenary&#xff08;年&a…

ubuntu24.04网卡配置

vim /etc/netplan/01-netcfg.yaml /24表示子网掩码的长度。这种表示法称为CIDR&#xff08;无类别域间路由&#xff09;记法。CIDR记法将IP地址和它们的子网掩码合并为一个单一的值&#xff0c;其中斜杠/后面的数字表示子网掩码中连续的1的位数。 对于/24&#xff1a; 24表示…

【linux】如何扩展磁盘容量(VMware虚拟机)-转载

如何扩展磁盘容量(VMware虚拟机) 一、前置准备工作 扩展虚拟机磁盘前&#xff0c;需要先把虚拟机关机才能进行扩展磁盘操作 1.选择虚拟机设置&#xff0c;如下图所示 2.输入你想扩展的磁盘容量&#xff0c;以本次实操为例&#xff0c;我这里输入的30G&#xff08;具体按照实…

python 数据类型----可变数据类型

一、list列表类型&#xff1a; 一种有序集合&#xff0c;里面有多个数据用逗号隔开&#xff0c;可以对数据进行追加、插入、删除和替换&#xff1b;使用[]标识&#xff0c;可以包含任意数据类型 登录后复制 # 字符串类型列表 names[bill,may,jack]#整数型列表 numbers [1,2,34…

STARTS:一种用于自动脑电/脑磁(E/MEG)源成像的自适应时空框架|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 STARTS: A Self-adapted Spatio-temporal Framework for Automatic E/MEG SourceImaging STARTS&#xff1a;一种用于自动脑电/脑磁(E/MEG)源成像的自适应时空框架 01 文献速递介绍 电生理源成像&#xff08;Electrophysiological Source Imaging&#xff0c;E…

海康威视和大华视频设备对接方案

目录 一、海康威视 【老版本】 【新版本】 二、大华 一、海康威视 【老版本】 URL规定&#xff1a; rtsp://username:password[ipaddress]/[videotype]/ch[number]/[streamtype] 注&#xff1a;VLC可以支持解析URL里的用户名密码&#xff0c;实际发给设备的RTSP请求不支…