面试官:Mysql 中主库跑太快,从库追不上怎么整?

九路 等级 1161 2 1

写这篇文章是因为之前有一次删库操作,需要进行批量删除数据,当时没有控制好删除速度,导致产生了主从延迟,出现了一点小事故。

今天我们就来看看为什么会产生主从延迟以及主从延迟如何处理等相关问题。

坐好了,准备发车!

面试官:Mysql 中主库跑太快,从库追不上怎么整?

image

图注:思维导图

主从常见架构

随着日益增长的访问量,单台数据库的应接能力已经捉襟见肘。因此采用主库写数据,从库读数据这种将读写分离开的主从架构便随之衍生了出来。

在生产环境中,常见的主从架构有很多种,在这里给大家介绍几种比较常见的架构模式。

面试官:Mysql 中主库跑太快,从库追不上怎么整?

image

面试官:Mysql 中主库跑太快,从库追不上怎么整?

image

主从复制原理

了解了主从的基本架构及相关配置后,下面就要进入正题了。

对于主从来说,通常的操作是主库用来写入数据,从库用来读取数据。这样的好处是通过将读写压力分散开,避免了所有的请求都打在主库上。同时通过从库进行水平扩展使系统的伸缩性及负载能力也得到了很大的提升。

面试官:Mysql 中主库跑太快,从库追不上怎么整?

image

但是问题就来了,读从库时的数据要与主库保持一致,那就需要主库的数据在写入后同步到从库中。如何保持主库与从库的数据一致性,主库又是通过什么样的方式将数据实时同步到从库的?

基本原理

Mysql 中主从复制时有两个很重要的日志文件:

  • binlog(二进制日志文件)

  • relay log(中继日志文件)

面试官:Mysql 中主库跑太快,从库追不上怎么整?

image

在主从同步的过程中,主库会将所有的操作事件记录在 binlog 中,从库通过开启一个 I/O 线程保持与主库的通信,并在一定时间间隔内探测 binlog 日志文件是否发生改变。如果 binlog 日志发生了变化,主库生成一个 binlog dump 线程向从库 I/O 线程传送 binlog。从库上的 I/O 线程将 binlog 复制到自己的 relay log 中。最终由从库中的 SQL 线程读取 relay log 中的事件重放到从库上。

面试官:Mysql 中主库跑太快,从库追不上怎么整?

image

主从延迟原因

上面的流程我们已经知道了主从复制的相关过程了,但是主库有更新就会同步从库,那为什么会出现主从延迟的情况呢?

随机重放

Mysql 主库中写 binlog 的操作是顺序写的,之前我们提到过,磁盘的顺序读写速度是很快的。同样的,从库中的 I/O 线程操作日志的速度效率也是很高的。但是别忘了,还有一个 SQL 线程来进行数据重放,而重放的过程是随机写盘的。到这里你应该就明白了吧,某一时刻 relay log 里的数据来不及重放进从库,就会产生主从延迟的情况。

主库并发高

知道了从库中 SQL 线程的重放情况,对于主库并发高导致主从延迟肯定就不难理解了。某一时刻,大量写请求打到主库上,意味着要不断对 binlog 进行写入,此时从库中的 SQL 线程就会应接不暇,自然会产生主从延迟。

锁等待

对于 SQL 单线程来说,当遇到阻塞时就会一直等待,直到执行成功才会继续进行。如果某一时刻从库因为查询产生了锁等待的情况,此时只有当前的操作执行完成后才会进行下面的操作,同理也就产生了主从延迟的情况。

主从延迟处理

知道了主从延迟的原因,接下来我们看看如何来进行处理。

并行复制

既然 SQL 单线程进行重放时速度有限,那么能不能采用多线程的方式来进行重放呢?MySQL 5.6 版本后,提供了一种并行复制的方式,通过将 SQL 线程转换为多个 work 线程来进行重放,这样就解决了主从延迟的问题。

面试官:Mysql 中主库跑太快,从库追不上怎么整?

image

降低主库并发

你可能会说了,我现在用的低版本的数据库,也没法升版本啊,那我怎么整。对于主库并发高的情况,这种方式你只能通过控制并发来解决延迟了,多用用 Redis。

读主库

这种情况你肯定不陌生,对于一些实时性要求比较高的数据,你总不能读从库去拿吧,万一延迟个大半天,你不得贡献自己的年终奖啊。

总结

主从复制原理

  • 主从复制中有两个很重要的日志文件,binlog和relay log,分别位于主库与从库中。其中 binlog 是主从复制的基础,通过将操作事件写入 binlog 通过 I/O 线程传送至从库进行同步。

主从延迟原因

  • 从库中 SQL 线程重放的过程是随机写盘的,并且 SQL 线程是单线程的,因此数据来不及重放的话就会导致主从延迟。

  • 主库并发高会导致写操作不断写入 binlog,对于 SQL 线程说可能会应接不暇,也会产生主从延迟。

  • 重放过程中如果遇到锁等待也是产生延迟的原因之一。

主从延迟处理

  • MySQL 5.6版本以后通过并行复制的方式来解决 SQL 单线程产生的主从延迟问题。对于低版本来说,可以通过降低主库的并发来解决。如果对数据实时性要求比较严格的话,可以通过读主库来达到目的。

转载:https://www.cnblogs.com/caoyier/p/14246126.html

收藏
评论区

相关推荐

面试官:Mysql 中主库跑太快,从库追不上怎么整?
写这篇文章是因为之前有一次删库操作,需要进行批量删除数据,当时没有控制好删除速度,导致产生了主从延迟,出现了一点小事故。 今天我们就来看看为什么会产生主从延迟以及主从延迟如何处理等相关问题。 坐好了,准备发车! (https://imghelloworld.osscnbeijing.aliyuncs.com/4ed72bf8b1fc67
MySQL 8 复制(二)——半同步复制
目录 一、简介 直到目前的最新版本为止,MySQL缺省依然使用异步复制策略。简单说所谓异步复制,指的是主库写二进制日志、从库的I/O线程读主库的二进制日志写本地中继日志、从库的SQL线程重放中继日志,这三步操作都是异步进行的。如此选择的主要理由是出于性能考虑,与同步复制相比,异步复制显然更快,同时能承载更高的吞吐量。但异
MYSQL数据库之主从复制及读写分离
MYSQL数据库之主从复制及读写分离 一、MySQL的主从复制 1、概述    MySQL Replication俗称MySQL AB复制或主从复制,是MySQL官方推荐的数据同步技术。数据同步基本过程:从库会实时去读取主库的二进制日志文件,按照日志中记录对从座进行同样的操作,以达到数据同步效果。 2、MySQL Replication优点
MySQL 主从复制(实时热备)原理与配置
MySQL是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失。为了保证MySQL数据库的可靠性,就要会一些提高可靠性的技术。MySQL主从复制可以做到实时热备数据。本文介绍MySQL主从复制原理及其配置过程。 术语:主从复制——master slave replication(M-S模式)。 用途 == * 备份 * 读写分离 * 高
MySQL主从复制异步原理以及搭建
**MySQL主从复制的原理:**   1、首先,MySQL主库在事务提交时会把数据变更作为时间events记录在二进制日志文件binlog中;MySQL主库上的sync\_binlog参数控制Binlog日志以什么样的方式刷新到磁盘上。   2、主库推送二进制日志文件Binlog中的事件到从库的中继日志Relay Log中,之后从库根据中继日志Rela
Mysqlbinlog解析工具
  Mysql的binlog日志作用是用来记录mysql内部增删改查等对mysql数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被binlog日志记录;主要用于数据库的主从复制以及增量恢复。 mysql的binlog日志必须打开log-bin功能才能生存binlog日志 \-rw-rw---- 1 mysql my
Mysql主从 读写分离(一主一从或一主多从),双机热备(互为主从)
### 什么是主从复制  当mysql数据库的数据量太大的时候,查询数据就很吃力了,无论怎么优化都会产生瓶颈,这时我们需要增加服务器设备来实现分布式数据库,首先要了解主从数据库服务器的版本的需求,主从mysql的安装运行版本需一致。因此,我们利用mysql自带的REPLICATION来实现mysql多机主从同步的功能,mysql版本为5.7进行演示。 !
mysql 主从复制
**mysql主从复制** (超简单) 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: **1、主从服务器分别作以下操作**:   1.1、版本一致   1.2、初始化表,并在后台启动mysql   1.3、修改root的密码 **2、修改主服务器master:**    #vi /etc/my.cnf
mysql主从
\[toc\] 1\. 主从简介 ======== 1.1 主从作用及条件 ----------- 作用: * 实时灾备,用于故障切换 * 读写分离,提供查询服务 * 备份,避免影响业务 主从部署必要条件: * 主库开启binlog日志(设置log-bin参数) * 主从server-id不同 * 从库服务器能连通主库
mysql主从
\[toc\] 1.GTID是什么? ========== `GTID` 全称`A global transaction identifier` 全局事物`id`,是`MASTER`创建的和事物相匹配的`ID`号; 1. 它不仅在本机上是唯一的,而且在其他服务器上也是唯一的; 2. `gitd`与事物一一对应 3. `master`每次`comm
mysql主从复制(简单直观)
[mysql主从复制](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.cnblogs.com%2Ffindumars%2Fp%2F10421345.html) =============================================================
Linux Centos下MySQL主从Replication同步配置(一主一从)
MySQL 主从复制概念MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。  ![](https://img2018.cnblogs.c
Linux开发环境搭建之MySQL安装配置
        本文主要实践在Linux上安装和配置MySQL关系型数据库,完整的实践MySQL的下载、安装、配置、使 用的过程,为后面某些文中使用做基础 一、环境准备 ------ 1.CentOS7发行版的Linux系统(最小化安装) 2.MySQL官方编译的安装包 mysql-5.7.20-linux-glibc2.12-x86\_64 下载
Mycat高可用解决方案二(主从复制)
Mycat高可用解决方案二(主从复制) =================== 系统部署规划 ------ **名称** **IP** **主机名称** **用户名/密码** **配置** **mysql主节点** **192.168.199.110** **mysql-01** **root/hadoop** **2核/2G** *
Node连接MySQL数据库及相关操作
**首先使用npm安装mysql包:** $ npm install mysql **连接数据库:** var mysql      = require('mysql');   //引入mysql包 //创建数据库连接 var connection = mysql.createConnection({   host     : 'localhos