京东二面:MySQL 主备延迟有哪些坑?主备切换策略

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 一、什么是高可用?维基百科定义:高可用性(high availability,缩写 HA),指系统无中断地执行其功能的能力,代表系统的可用性程度。高可用性通常通过提高系统的容错能力来实现。MySQL 的高可用是如何实现的呢?

一、什么是高可用?

维基百科定义:

高可用性(high availability,缩写 HA),指系统无中断地执行其功能的能力,代表系统的可用性程度。高可用性通常通过提高系统的容错能力来实现。

MySQL 的高可用是如何实现的呢?

首先,我们来看这张图

过程:

  • 开始时,处理流程主要是 场景一
  • 客户端 读、写 ,访问的是主库
  • 主库通过某种机制,将数据实时同步给备库
  • 当主库突然发生故障(如:磁盘损坏等),无法正常响应客户端的请求。此时会 自动主备切换 ,进入 场景二
  • 客户端读写,访问的是备库(此时备库升级为新主库)

看似天衣无缝,那是不是可以高枕无忧了呢???兄弟,想多了

主备切换,确实能满足高可用要求。但有个前提,主备库的数据要同步。

不过, 数据同步 是个异步操作,不可能做到实时,所以说 主备延迟 是一定存在的

二、什么是主备延迟?

  • 主库完成一个事务,写入binlog。binlog 中有一个时间字段,用于记录主库写入的时间【时刻 t1】
  • binlog 同步给备库,备库接收并存储到中继日志 【时刻 t2】
  • 备库SQL执行线程执行binlog,数据写入到备库表中 【时刻 t3】

主备延迟时间计算公式:

t3 - t1

有没有简单命令,直接查看。在备库执行 show slave status 命令

seconds_behind_master,表示当前备库延迟了多少秒

心细的同学会有疑问了, t3 和 t1 分属于两台机器,如果时钟不一致怎么办?

初始化时,备库连接到主库,会执行 SELECT UNIX_TIMESTAMP() 来获得当前主库的系统时间。

如果发现主库的系统时间与备库不一致,备库在计算 seconds_behind_master 会自动减掉这个差值。

注意:

binlog 数据传输的时间(t2 - t1)非常短,可以忽略。主要延迟花费在备库执行binlog日志

三、主备延迟常见原因

1、备库机器配置差

这个不难理解,“门当户对”、“志同道合”,如果主备机器的性能差别大,直接导致备库的同步速度跟不上主库的生产节奏。

就像跑步一样,落后的差距会越来越大。

解决方案:

1、升级备份库的机器配置

2、备库干私活

备库除了服务于正常的 读业务 外,是否有被其他特殊业务征用,如:运营数据统计等,这类操作非常消耗系统资源,也会影响数据同步速度。

解决方案:

可以借助大数据平台,数据异构,满足这些特殊的统计类查询。

3、大事务

我们知道 binglog 是在事务提交时才生成的。

如果是处理大事务,执行时间比较长(比如 5分钟)。虽然备库很快拿到 binlog,但是在 备库回放执行也要花费差不多的时间 ,也要 5分钟 (备库中,只有这个事务执行完提交,备库才真正对外可见),从而导致主备延迟很大。

比如 delete 操作,慎用 delete from 表名 ,建议采用分批删除,减少大事务。

四、主库不可用,主备切换有哪些策略?

1、可靠优先

当主库A 发生故障不可用时,开始进入主备切换

  • 首先,判断 B库 seconds_behind_master 是否小于设定的阈值(比如 4 秒),如果满足条件
  • 将 A库 改为只读状态,将 readonly 设置为 true。断掉 A 库的写入操作,保证不会有新的写入流量进来
  • 判断 B库的 seconds_behind_master ,直到为 0
  • 修改 B库 为 读、写状态
  • 客户端的请求打到 B库

此时,主备切换完成。

优点:

数据不会丢失,所以我们称为可靠性高

缺点:

中间有个阶段,A库和B库都是只读状态,此时系统对外不能提供写服务。

2、可用优先

当然我们也可以不用等主备数据同步完成,在一开始时就直接将流量切到备库。

这样备库的流量就可能有两个来源:

  • 主库之前的剩余流量 binlog
  • 客户端新请求进来的流量

两部分流量冲击,会对 数据一致性 造成一些影响。

我们来做个实验:

首次创建一个用户表:

CREATE TABLE `person` (
  `id`  bigint(20) unsigned  NOT NULL AUTO_INCREMENT,
  `name` varchar(32) ,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

插入2条记录

insert into person(name) values ("tom");
insert into person(name) values ("jerry");

实验一:

将 binlog 的格式设为 binlog_format=row

说明:row 模式,写 binlog 时会记录所有字段的值

库A 、库B 在做数据同步时,都会报主键冲突,最后只有一行数据不一致,但是会丢数据。

优点:同步过程中,出现问题能够及时发现。

实验二:

将 binlog 格式设置为 statement 或者 mixed

按照 SQL 原始语句同步 binlog,可以看到,数据条数不会少,但是主键id会出现混乱。

3、结论

本着 "攘外必先安内" ,保证内部的数据的正确性是我们的首选。所以,一般建议大家选择 可靠优先

但是可靠优先可能会导致一定时间内,数据库不可用。这个时间值取决于主备延迟的时间大小。

所以,我们应尽可能缩短主备库的延迟时间大小,这样一旦主库发生故障,备库才会更快的同步完数据,主备切换才能完成,服务才能更快恢复。

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
27天前
|
缓存 关系型数据库 MySQL
MySQL慢查询优化策略
MySQL慢查询优化是一个复杂的过程,需要根据具体的应用场景和数据特点进行。以上策略是提升数据库查询性能的有效途径,但最关键的是对系统进行持续的监控和分析,及时发现并解决性能瓶颈。通过实践这些策略,你可以显著提高MySQL数据库的性能,为用户提供更快的响应时间和更好的体验。
43 10
|
1月前
|
SQL 监控 关系型数据库
MySQL 延迟从库介绍
本文介绍了MySQL中的延迟从库功能,详细解释了其工作原理及配置方法。延迟从库允许从库在主库执行完数据变更后延迟一段时间再同步,主要用于快速恢复误操作的数据。此外,它还可用于备份、离线查询及数据合规性需求。通过合理配置,可显著提升数据库系统的稳定性和可靠性。
|
3月前
|
存储 关系型数据库 MySQL
MySQL数据库碎片化:隐患与解决策略
UUID作为主键可能导致MySQL存储碎片,影响性能。频繁的DML操作、字段长度变化和非顺序插入(如UUID)都会造成碎片。碎片增加磁盘I/O,降低查询效率,浪费空间,影响备份速度。建议使用自增ID,固定长度字段,并适时运行OPTIMIZE TABLE来减少碎片。
|
6天前
|
存储 关系型数据库 MySQL
MySQL索引失效及避免策略:优化查询性能的关键
MySQL索引失效及避免策略:优化查询性能的关键
26 3
|
8天前
|
SQL 关系型数据库 MySQL
MySQL中外键的使用及外键约束策略
这篇文章讨论了MySQL中使用外键的重要性,包括外键的概念、不使用外键可能导致的问题、如何设置外键约束以及不同的外键约束策略(如CASCADE和SET NULL),并通过示例演示了这些概念。
MySQL中外键的使用及外键约束策略
|
19天前
|
关系型数据库 MySQL 数据处理
针对MySQL亿级数据的高效插入策略与性能优化技巧
在处理MySQL亿级数据的高效插入和性能优化时,以上提到的策略和技巧可以显著提升数据处理速度,减少系统负担,并保持数据的稳定性和一致性。正确实施这些策略需要深入理解MySQL的工作原理和业务需求,以便做出最适合的配置调整。
73 6
|
2月前
|
SQL 关系型数据库 MySQL
在Linux中,mysql 如何减少主从复制延迟?
在Linux中,mysql 如何减少主从复制延迟?
|
2月前
|
SQL 存储 关系型数据库
mysql加索引真的会锁表吗?揭秘背后的技术细节与规避策略
【8月更文挑战第16天】在数据库管理中,添加索引能大幅提升查询效率。MySQL执行此操作时的锁定行为常引起关注。文章详细解析MySQL中索引添加时的锁定机制及其原理。不同存储引擎及SQL语句影响锁定策略:MyISAM需全表锁定;InnoDB提供更灵活选项,如使用`ALTER TABLE... LOCK=NONE`可在加索引时允许读写访问,尽管可能延长索引构建时间。自MySQL 5.6起,在线DDL技术可进一步减少锁定时间,通过`ALGORITHM=INPLACE`和`LOCK=NONE`实现近乎无锁的表结构变更。合理配置这些选项有助于最小化对业务的影响并保持数据库高效运行。
151 4
|
2月前
|
SQL 关系型数据库 MySQL
MySQL 常见日志清理策略
MySQL 数据库服务器使用多种类型的日志来记录操作和事件,这对于故障诊断、审计和性能分析非常重要。然而,这些日志文件会随着时间的推移而不断增长,可能会占用大量的磁盘空间。因此,定期清理这些日志是必要的,本篇文章我们一起来学习下如何清理 MySQL 中的日志文件。
102 3
|
2月前
|
SQL 关系型数据库 MySQL
深入探索MySQL索引策略
本文旨在深入探讨MySQL(8.0.26)数据库中索引的设计与优化方法。
下一篇
无影云桌面