Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql如何保证高可用

Mysql如何保证高可用

作者头像
小土豆Yuki
发布于 2021-01-04 01:59:55
发布于 2021-01-04 01:59:55
71600
代码可运行
举报
文章被收录于专栏:洁癖是一只狗洁癖是一只狗
运行总次数:0
代码可运行

上一节我们看到主备的一些基本内容,今天我们看看其他的内容

主备延迟

主备切换是很正常的操作,比如服务下线,断电,软件升级等等,首先我们先了解另外一个概念就是同步延迟,与数据同步的三个时间点如下

  1. 主库A上执行的一个事务,写入binlog,这个时刻是T1
  2. 备库B接收完成这个binlog的时刻是T2
  3. 在备库上执行完这个事务时刻就是T3

所谓的主备延迟就是同一个事务在主库和备库上执行完的时间差。

我们可以使用下面命令获取具体的时间差

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show slave status
seconds_behind_master// 表示备库的延迟时间,表示延迟了多少秒

seconds_behind_master计算方式如下

  1. 每个事物的binlog日志都会有一个时间
  2. 在备库上获取binlog日志的时候,获取到这个时间,计算他和当前系统上的时间差

计算的时间差就是我们的seconds_behind_master,但是我们发现是否会出现主库和备库的系统时间不一致的情况,答案是不可能,因为在备库上获取主库的事务binlog的时候,备库会执行SELECT UNIX_TIMESTAMP()查看备库的时间和主库的时间是否一致,如果不一致,就会在计算seconds_behind_master会扣减这个时间差.

正常情况下,T2-T1的时间差是很小的,因此延迟的时间主要是备库接收完binlog日志之后在在备库上执行完这个事务,很明显时间差的主要来源就是备库上消费中转日志的速度比主库生产binlog日志慢

主备延迟的来源

有些情况是主库部署的机器性能比备库的机器好,比如,有些公司会把主库部署在多个机器上,而把备库部署在一条机器,这样就会导致备库的主机上的多个备库会抢夺资源,导致主备延迟

但是实际上,很少有公司那样做,而是使用的主备可以随时切换,因此部署的机器的性能都一样且是对称部署

但是为什么这样的部署,也会出现主备延迟呢

正常情况下主库设置读写操作,而备库设置只读操作,由于主库的操作可能会影响生产环境的业务,因此大多数消耗资源的操作就会在备库上执行,因此就会导致主备延迟,当然我们也可以使用下面策略

  1. 使用一主多从策略,使用多个从库分担读的能力
  2. 输出binlog日志到外部系统如Hadoop系统,让外部系统提供查询统计这类查询

如果按照一主多从的部署,还会有其他情况引起主备延迟吗

其实大事务也是可能引起延迟的,比如我们在主库上执行了一个大事务,这个事务执行了10分钟,就会导致备库延迟10分钟,因此有时候我们再使用delete删除整张表的数据,就会导致报警,此时我们就必须采用多次删除.

由于存在主备延迟的情况,因此有会有相应的策略

可靠优先策略

上图的双主结构下,状态1到状态2的流程如下

  1. 判断备库上的seconds_behind_master的时间差是否小于某个值(例如5秒),如果不小于,就重复判断直到小于
  2. 把主库设置成只读
  3. 再判断备库上的seconds_behind_master的值为0
  4. 在把备库设置成读写
  5. 把业务切换到备库

这个切换流程,都是在HA系统完成的,这种就是可靠性优先策略

上面SBM就是seconds_behind_master简写

我们发现这种切换会导致系统有不可用时间的,在步骤2之后主备的状态都是只读,这个过程最耗时的就是步骤3,会有几秒的不可用时间,因此就会知道为什么我们需要步骤一,可以尽可能的减少不可用时间,如果没有步骤一,就有可能导致系统的不可用时间很长,一般业务是不可接受的

可用性优先策略

我们是不是可以把步骤4,5提前到最开始,直接切换主备库,这样就不会出现不可用的情况了,但是我们会发现可能会导致数据不一致的情况

我们可以举个例子如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

mysql> CREATE TABLE `t` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `c` int(11) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

insert into t(c) values(1),(2),(3);

假设主库上的其他表有大量的更新操作,此时的备库延迟是5秒,在主库上执行插入c=4的语句,然后进行主备切换

使用可用性优先策略,且binlog_format=mixed,切换流程如下

我们来分析一下上面流程

  1. 在步骤2中主库上执行完c=4后,进行主备切换
  2. 步骤3,由于有主备延迟的存在5秒,此时备库还没有进行插入c=4的中转日志,且备库已经开始接受客户端的命令c=5的sql
  3. 在步骤4中,备库中接受了c=5的命令,且生成的binlog传给了主库,且也
  4. 在步骤5中,主库插入了记录(5,5),且在备库上插入了记录(5,4)

我最后发现主备的数据最后两行数据不一致,这是由于可用性优先策略流程导致的

但是此时我们假设binlog_format=row,会记录插入的所有字段,做一只有一行数据不一致,主备库上会发生主键冲突而停止,

在步骤4中,备库的日志记录(4,4),传给主库,而主库的日志记录(4,5)传给备库,都会报错(duplicate key error),因此最后会导致数据一行不一致。

  1. 可以看到如果binlog_format=row是更容易发现,但是如果是mixed或statement就不容易发现,当你发现的时候,已经没有办法查询了,也有可能导致更多的数据不一致
  2. 可用性优先策略可能会导致数据不一致性,因此建议使用可靠性优先策略,数据的一致性比较高.

那些场景可用性优先策略适合呢

比如下面场景就比较适合

  1. 有一个库专门是用来记录操作日志,这个时候数据不一致可以用binlog日志修复,短暂的数据不一致不影响业务流程
  2. 同时,业务系统依赖日志的写入逻辑,如果这个库不可用,会导致业务不可用

那么如果可靠性优先策略异常切换会出现什么效果

但主库断电的时候,这个时候如果是可靠性优先策略,就必须等待seconds_behind_master=0,才能进行切换,此时的系统已经不可用了,因为我们此时的连接还没有到备库上,但是有人说可以直接切到备库,保持备库只读就可以了,实际上这就会导致主库上的中转日志没有完成,直接切换会导致数据丢失的现象,虽然等待中转日志应用完成,数据就会回来,但是短暂的数据丢失也是不能接受的.

我们发现数据库的可用性是依赖主备延迟的时间,延迟时间越少,主备故障时候数据恢复就越小,可用性越高

如果对您有一丝丝帮助,麻烦点个关注,也欢迎转发,谢谢

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洁癖是一只狗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
25 | MySQL是怎么保证高可用的?
正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。
HaC
2020/12/30
7640
25 | MySQL是怎么保证高可用的?
MySQL实战第二十五讲-MySQL是怎么保证高可用的?
在上一篇文章中,介绍了 binlog 的基本内容,在一个主备关系中,每个备库接收主库的 binlog 并执行。
越陌度阡
2022/05/06
4050
MySQL实战第二十五讲-MySQL是怎么保证高可用的?
MySQL 主从架构原理
上图展示的是 MySQL 的主从切换流程。在 State-1 中,客户端的读写都直接访问节点 A,而节点 B 是 A 的备库,只是将 A 的更新都同步过来,到本地执行。这样可以保持节点 B 和 A 的数据是相同的。当需要切换的时候,就切成状态 2。这时候客户端读写访问的都是节点 B,而节点 A 是 B 的从库。
张申傲
2020/09/03
1.2K0
MySQL 主从架构原理
MySQL主备的基本原理2
2.备库的压力大。主库提供写能力,备库提供一些读能力。忽略了备库的压力控制,导致备库上的查询耗费了大量的CPU资源,影响了同步速度,造成主备延迟
用户8639654
2021/08/11
7770
MySQL主从如何保证高可用
通过主备同步我们能够保证数据的可靠性(最终一致性),MySQL的主备可用性主要依赖于主备切换的时间,越短越好,但前提是切换完成以后数据要一致。
shysh95
2022/04/07
4950
MySQL主从如何保证高可用
【阿里数据库面试题解】MySQL高可用原理
正常情况下,只要主库执行更新生成的所有binlog,都可以传到备库并被正确执行,备库就能达到跟主库一致的状态,这就是最终一致性。
JavaEdge
2021/12/07
6760
【阿里数据库面试题解】MySQL高可用原理
京东一面:MySQL 主备延迟有哪些坑?主备切换策略
作为一名开发同学,大家对 MySQL 一定不陌生,像常见的 事务特性、隔离级别 、索引等也都是老生常谈。
微观技术
2022/04/07
2K0
京东一面:MySQL 主备延迟有哪些坑?主备切换策略
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
在分布式系统中,单机节点在发生故障时无法提供服务,这可能导致长期的服务不可用,从而影响其他节点的运作,导致的后果非常严重
菜菜的后端私房菜
2024/06/28
5910
MySQL集群架构[通俗易懂]
题记: 文章内容输出来源:拉勾教育Java高薪训练营。 本篇文章是 MySQL 学习课程中的一部分笔记。
全栈程序员站长
2022/09/18
1.6K0
MySQL集群架构[通俗易懂]
Mysql 基于innoDB的一篇总结
mysql 为了保证crash-safe, 是通过引入binlog(server 层的逻辑日志), redo log(innodb 存储引擎层日志), undo log(innodb 存储引擎层日志)来保证的。
Check King
2021/08/09
2970
MySql主从复制
在MySql的生产环境中,由于单台MySql不能满足高可用性需求,一般通过主从复制(Master-Slave)方式同步数据,再通过读写分离(MySql-Proxy)来提升数据库并发负载能力。
春哥大魔王
2020/07/14
2.3K0
MySQL主备切换解析
MySQL的主备切换是高可用性数据库架构中的重要一环。通过主备切换,可以在主库出现故障时迅速切换到备库,从而保证系统的持续运行。本文将详细解析MySQL主备切换的基本原理、实现方法以及相关的注意事项。
炒香菇的书呆子
2024/12/04
6950
MySQL主从同步如何操作?
随着业务量的增长,高并发,数据库服务器宕机等问题频繁出现,单台MySQL服务器将会成为系统瓶颈。
程序猿川子
2024/08/20
2690
MySQL主从同步如何操作?
MySQL主备的基本原理
在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持节点B和A的数据是相同的。当需要切换的时候,就切成状态2。这时候客户端读写访问的都是节点B,而节点A是B的备库
用户8639654
2021/08/11
9280
关于主从延迟,一篇文章给你讲明白了!
在实际的生产环境中,由单台MySQL作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面
MySQL技术
2021/07/05
6930
关于主从延迟,一篇文章给你讲明白了!
mysql高可用架构设计,处理高并发,大流量!
主要介绍:复制功能介绍、mysql二进制日志、mysql复制拓扑、高可用框架、单点故障、读写分离和负载均衡介绍等 mysql复制功能介绍 mysql复制功能提供分担读负载 复制解决的问题 实现在不同服务器上的数据分布 利用二进制日志增量进行 不需要太多的带宽 但是使用基于行的复制在进行大批量的更改时会对带宽带来一定得压力,特别是跨IDC环境下进行复制 实现在不同服务器上的数据分布 实现数据读取的负载均衡 需要其他组件配合完成 利用DNS轮询的方式把程序的读连接到不同的备份数据库, 使用LVS,haproxy
思梦php
2018/03/09
2.5K0
mysql高可用架构设计,处理高并发,大流量!
Mysql解决主从慢同步问题(上)
一般主从复制,有三个线程参与,都是单线程:Binlog Dump(主) —–>IO Thread (从) —–> SQL Thread(从)。复制出现延迟一般出在两个地方
陈不成i
2021/06/17
2.1K0
MySQL主从复制延迟解决方案
前面一篇,我们学习到了MySQL多版本并发控制(MVCC)实现原理,这一篇我们接着学习MySQL主从复制模式下的延迟解决方案。
兔云小新LM
2023/03/16
4.8K0
mysql读写分离延迟问题_MySQL读写分离后的延迟解决方案
根据上图可以看到QPS:10.73k,实际上真实的并发大量数据到达的时候,我这里最高的QPS是将近15k.而目前单个数据库分片(实例)4CPU8G内存的配置下,最高的性能是7k的QPS。
全栈程序员站长
2022/09/02
1.4K0
MySQL 主从架构之 GTID 的实践
为了保证高可用,之前在测试环境部署了一套 MySQL 双主模式,当一个主库服务出现异常,可以将流量切到另外一个主库,两个主库之间相互同步数据。
悟空聊架构
2023/09/16
7751
MySQL 主从架构之 GTID 的实践
相关推荐
25 | MySQL是怎么保证高可用的?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验