MySQL:从MySQL看主从架构高可用性实现

目录

1 主备延迟

1.1 主备延迟

1.2 主备延迟的来源

1.2.1 主备机性能有差距

1.2.2 备库压力大

1.2.3 大事务

1.3 主备延迟的排查思路

3)查看MySQL状态 

2 主备切换策略

2.1 可靠性优先策略

2.2 可用性优先策略

2.3 常见切换技术


从进入互联网时代开始,我们从单机走向集群再到当前的微服务架构,我们已经很少再使用单机架构来实现业务逻辑,即使没有使用微服务,但是主备、主从等集群已经属于是业务侧必备能力。

但是,无论是主备还是主从架构,实际上就是为了系统的高可用性实现的一个策略,防止主机因为某些故障导致异常下线,这时候备份或者从实例就会通过选择或者其他策略成为主服务实例,对外继续提供服务。

在MySQL的正常情况下,只要主库执行更新生成的所有binlog全部被正确的传到备库并且被正确执行,备库就能和主库数据一致,实现最终一致性。但是最终一致性并不能满足线上的性能需求,还需要保证集群的可用性。

1 主备延迟

1.1 主备延迟

在发生主备延迟时,与数据同步的时间点主要包括:

  • 主库 A 执行完成一个事务,写入 binlog,我们把这个时刻记为 T1;
  • 之后传给备库 B,我们把备库 B 接收完这个 binlog 的时刻记为 T2;
  • 备库 B 执行完成这个事务,我们把这个时刻记为 T3。

主备延迟,就是同一个事务,在备库执行完成的时间和主库执行完成的时间之间的差值,就是T3-T1。

在备库执行show slave status会得到seconds_behind_master,表示备库延迟的时间,计算方法为:

  • 每个事务的binlog都有一个时间字段,用于记录主库写入时间;
  • 备库取出当前正在执行的事务的时间字段的值,计算与当前系统时间差值,就是该值,单位为秒;

如果主备库机器的系统时间设置不一致,不会导致主备延迟的值不准。因为,备库连接到主库的时候,会通过执行 SELECT UNIX_TIMESTAMP() 函数来获得当前主库的系统时间。如果这时候发现主库的系统时间与自己不一致,备库在执行 seconds_behind_master 计算的时候会自动扣掉这个差值。

但是:如果备库已经连接主库后,修改主库的系统时间,备库同步的时候就不会再做时间的自动修正了,因此,时间修正只有第一次建连的时候才会执行。

在网络正常的时候,日志从主库传给备库所需的时间是很短的,即 T2-T1 的值是非常小的。也就是说,网络正常情况下,主备延迟的主要来源是备库接收完 binlog 和执行完这个事务之间的时间差。所以说,主备延迟最直接的表现是,备库消费中转日志(relay log)的速度,比主库生产 binlog 的速度要慢。

1.2 主备延迟的来源

1.2.1 主备机性能有差距

备库所在机器性能比主库的机器性能差,此时一般将备库设置为“非双1”模式【牺牲备库的一点可靠性,减少写盘次数,增强IO能力】,更新过程中触发大量读操作,可能会导致主备延迟。

现在这种情况比较少,因为现在都是主从部署,可能随时发生主从切换,因此一般都是对称部署。

1.2.2 备库压力大

一般出现的原因是读写分离场景,备库对外提供读能力,查询耗费大量CPU资源,影响了同步速度,造成主备延迟。

此时的处理措施是:

  • 一主多从,用从库分担压力;
  • 通过binlog输出到外部系统,比如Hadoop系统,提供统计类查询能力;

从库和备库在概念上其实差不多。在我们这个专栏里,为了方便描述,我把会在 HA 过程中被选成新主库的,称为备库,其他的称为从库。

1.2.3 大事务

主库必须等事务执行完成后才能写入binlog,再传给备库,造成主备延迟。

比如说大量数据的删除就会造成大事务,一般是要求分批执行。之所以删除会造成大事务,是因为无论是否有索引,存储引擎都是一条条数据查询并加锁,返回给执行引擎,执行引擎标记数据删除。所有的数据都处理完成后,才会提交事务释放锁。

另一种就是大表DDL。

1.3 主备延迟的排查思路

1)查数据库在干什么 

pager cat - | grep -v Sleep | sort -rn -k 12 | head -n 20show full processlist; 
select * from information_schema.processlist 
where 1=1 order by TIME desc limit 10;

2)查看sql_thread在干什么 

slave上查看状态:

show slave status\G;

查看relay_master_log_file以及exec_master_log_pos 

master上解析binglog日志:

mysqlbinlog -v --base64-output=decode-rows --start-position=exec_master_log_pos relay_master_log_file

如果发现卡在操作某表上: 

1)检查表结构 

  • 没有索引:stop slave 可能会卡主,建议关闭mysql,启动后先加索引,然后start slave 
  • 有索引:只能等,大事务需要做拆分,不要操作太多数据 

2)大事务:M上session回话使用statement格式,使用语句级别的复制 

3)查看MySQL状态 
  • 机器性能(CPU、IO等):从库配置适当高一点,使用新硬件PCI-E或SSD设备 
  • 表结构: 设计要合理,必须有主键,主键要短小,为查询字段建索引 
  • 业务程序:适当使用缓存,减少数据库压力 

分析MySQL进程并结合源码:

perf top `pidof mysqld`

4)参数临时优化 

  • 主库开启group commit 
  • 从库开启writeset 
  • 从库设置sync_binlog=0 && innodb_flush_log_at_trx_commit=2 

5)检查锁情况 

show engine innodb status\G;

2 主备切换策略

2.1 可靠性优先策略

在双M结构下,主备切换的流程如图:

图片

  1. 判断备库 B 现在的 seconds_behind_master(SBM),如果小于某个值(比如 5 秒)继续下一步,否则持续重试这一步;这里主从延迟时间短,说明当前没有大事务,延迟比较低,减少因为延迟造成数据不可靠的几率;
  2. 把主库 A 改成只读状态,即把 readonly 设置为 true;
  3. 判断备库 B 的 seconds_behind_master 的值,直到这个值变成 0 为止;
  4. 把备库 B 改成可读写状态,也就是把 readonly 设置为 false;
  5. 把业务请求切到备库 B。

这个切换流程,一般是由专门的 HA 系统来完成的,我们暂时称之为可靠性优先流程。

图片

这个切换流程中是有不可用时间的。因为在步骤 2 之后,主库 A 和备库 B 都处于 readonly 状态,也就是说这时系统处于不可写状态,直到步骤 5 完成后才能恢复。

在这个不可用状态中,比较耗费时间的是步骤 3,可能需要耗费好几秒的时间。这也是为什么需要在步骤 1 先做判断,确保 seconds_behind_master 的值足够小。

2.2 可用性优先策略

如果是直接将第4和第5步提前,保证了系统几乎么有不可用时间,但是可能造成数据不一致。

其实这就是CAP中的C和A,MySQL主库在写完binlog后就给客户端响应了,没等binlog同步到一个或多个备库,这种策略是在C和A之间选择了A,牺牲了C,如果主库宕机了,但binlog的最后一个或几个事务没同步到备库,那备库成为主库后,数据就丢了。其它的NoSQL很多是给用户提供了选择,比如Mongo,用户可以设置日志同步到几个Slave后再给客户端响应,同步的Slave越多,C越强,A越弱,比如同步到X个Slave后再给客户端响应,那即使任何X个节点宕机,集群中仍然有1个节点有最新日志,它会成为主节点,数据没丢,集群还可以工作。

在满足数据可靠性的前提下,MySQL 高可用系统的可用性,是依赖于主备延迟的。延迟的时间越小,在主库故障的时候,服务恢复需要的时间就越短,可用性就越高。

2.3 常见切换技术

semi-sync在网络故障超时的情况下会退化成async,这个时候如果刚好主库掉电了,有些binlog还没有传给从库,从库无法判断数据跟主库是否一致,如果强行切换可能会导致丢数据,在金融业务场景下只能"人工智能"来做切换,服务中断时间长。AliSQL采用双通道复制更容易判断主备数据是否一致,如果一致可以自动切换,如果不一致才需要人工恢复数据。

相关内容拓展:(技术前沿)

近10年间,甚至连传统企业都开始大面积数字化时,我们发现开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

针对这类问题,低代码把某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。极大的提高了程序员的生产效率。

推荐一款程序员都应该知道的软件JNPF快速开发平台,采用业内领先的SpringBoot微服务架构、支持SpringCloud模式,完善了平台的扩增基础,满足了系统快速开发、灵活拓展、无缝集成和高性能应用等综合能力;采用前后端分离模式,前端和后端的开发人员可分工合作负责不同板块,省事又便捷。

体验官网:https://www.jnpfsoft.com/?csdnxx

还没有了解低代码这项技术可以赶紧体验学习!

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

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

相关文章

class083 动态规划中用观察优化枚举的技巧-下【算法】

class083 动态规划中用观察优化枚举的技巧-下【算法】 算法讲解083【必备】动态规划中用观察优化枚举的技巧-下 code1 1235. 规划兼职工作 // 规划兼职工作 // 你打算利用空闲时间来做兼职工作赚些零花钱,这里有n份兼职工作 // 每份工作预计从startTime[i]开始、e…

GaussDB如何创建和管理视图

GaussDB如何创建和管理视图 一、什么是视图 当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。 视图与基本表不同,不是物理上实际存在的&#x…

基于ssm的“游侠”旅游信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本“游侠”旅游信息管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的…

自动灭火贴哪个牌子好?看懂灭火贴原理应该这么选!

随着大家安全意识的增强,无论是日常生活还是工业生产,都可以看到灭火器的踪影。但是往往在火情中,人们很难第一时间发现危险并及时扑灭,或多或少会造成财产损失,甚至影响到生命安全。近几年,自动灭火贴应运…

第十五章 React使用UI(Ant Design)框架

一、专栏介绍 😆😆 欢迎加入本专栏!本专栏将引领您快速上手React,让我们一起放弃放弃的念头,开始学习之旅吧!我们将从搭建React项目开始,逐步深入讲解最核心的hooks,以及React路由、…

【论文翻译】Learning Deep Features for Discriminative Localization

原文:Learning Deep Features for Discriminative Localization 摘要 在这项工作中,我们重新审视了文献[13]中提出的全局平均池化层,并阐明了它如何明确地使卷积神经网络具有出色的定位能力,尽管该网络是在图像级标签上进行训练的…

排序算法:【冒泡排序】、逻辑运算符not用法、解释if not tag:

注意: 1、排序:将一组无序序列,调整为有序的序列。所谓有序,就是说,要么升序要么降序。 2、列表排序:将无序列表变成有序列表。 3、列表这个类里,内置排序方法:sort( )&#xff0…

Python实现图形的几何变换

一、能够提供对话框窗口,输入三角形的顶点坐标;或者,采用鼠标左键单击方式输入三角形的顶点坐标。 二、对输入的三角形顶点坐标进行五种基本几何变换: 对于平移变换,能够提供对话框窗口,输入平移向量&…

HashMap:理解Hash、底层实现与扩容机制

一、简单叙述 HashMap是Java中常用的一种数据结构,它以键值对的形式存储数据,具有高效的查找、插入和删除操作。本文将详细介绍HashMap的底层实现原理,包括哈希技术、底层数据结构和扩容机制,帮助读者深入理解HashMap的工作原理。…

Java IO 模型之 BIO、NIO、AIO 详解

目录 一. 前言 二. IO 模型 2.1. IO 模型分类 2.2. BIO、NIO、AIO 使用场景分析 2.3. NIO 和 BIO 的比较 三. BIO(同步阻塞) 3.1. BIO 编程流程 3.2. BIO 应用实例 3.3. 问题分析 四. NIO(同步非阻塞) 4.1. 基本介绍 …

Dubbo 3.x源码(13)—Dubbo服务发布导出源码(2)

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo 3.x源码(12)—Dubbo服务发布导出源码(1),也就是Dubbo服务发布导出的入口源码,现在我们继续学习,服务导出的核心方法doExportUrls的源码。 Dubbo 3.x…

一文读懂Java中的设计模式——单例模式!默认情况下,Spring的Bean就是单例的

单例模式概念 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例模式只应在有真正的“单一实例”的需求时才可使用。总结起来单例模式有三个优点: 全局访问共享资源:当需要在应用程序的多个地方共享和使用相…

跑代码中遇到的错误合集(持续更新)

1.TypeError: dropout(): argument ‘input‘ (position 1) must be Tensor, not str 原因:dropout函数接收到的参数是一个字典类型(需手动设置其不要返回字典类型) 解决步骤: 1.根据代码定位到dropout函数 2.定位到函数中的参数 3.对给dropout函数参数赋值的函数的…

[渗透测试学习] Sau - HackTheBox

首先是信息搜集,nmap扫一下 nmap -sV -sC -p- -v 10.10.11.224 发现存在两个端口,55555端口有http服务,访问一下 获得线索request-baskets版本为1.2.1,搜索发现存在漏洞 那么我们试试构造ssrf,create的时候bp抓包 构…

定时器TIM HAL库+cubeMX(上)

定时器时钟源APB1 36MHz 一.基本定时器 1.基本框图 2.溢出时间计算 3.配置定时器步骤 TIM_HandleTypeDef g_timx_handle;/* 定时器中断初始化函数 */ void btim_timx_int_init(uint16_t arr, uint16_t psc) {g_timx_handle.Instance TIM6;g_timx_handle.Init.Prescaler p…

【数据安全】金融行业数据安全保障措施汇总

数字化的今天,数据的价值不可估量,尤其是金融行业,数据不仅代表着企业的核心资产,还涉及到客户的隐私和信任。因此对于金融行业而言,保障数据安全至关重要。下面我们就来一起讨论为什么金融行业要保障数据安全&#xf…

Idea执行bat使用maven打包springboot项目成docker镜像并push到Harbor

如果执行以下命令失败,先把mvn的-q参数去掉,让错误输出到控制台。 《idea配置优化、Maven配置镜像、并行构建加速打包、解决maven打包时偶尔几个文件没权限的问题》下面的使用company-repo私有仓库和阿里云镜像仓库同时使用的配置参考。 bat echo off …

要实现长页面滑动到指定位置触发动画效果(亲测有效)

1.添加触发动画的元素&#xff1a;在你的 HTML 文件中&#xff0c;将需要触发动画的元素添加相应的类名<div class"animation"> <p>安全工矿 智能工矿 安全工矿 智能工矿</p> </div> 给一个 <div> 元素添加 .animation…

JVM 详解(JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路)

目录 JVM 详解&#xff08;JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路&#xff09;1、概念&#xff1a;什么是 JVM ?JVM 的作用&#xff1f; 2、JVM 的主要组成部分&#xff1f;类加载器&#xff08;Class Loader&#xff09;&#xff1a;简单…

02基于matlab的卡尔曼滤波

基于matlab的卡尔曼滤波&#xff0c;可更改状态转移方程&#xff0c;控制输入&#xff0c;观测方程&#xff0c;设置生成的信号的噪声标准差&#xff0c;设置状态转移方差Q和观测方差R等参数&#xff0c;程序已调通&#xff0c;需要直接拍下。