mysql主从复制延迟问题的相关知识与解决方案

摘要:
线程正在同步数据。2、 同步延迟场景当主数据库的TPS并发性较高时,生成的DDL(修改类的SQL语句)数量、从属数据库的同步线程(slave_IO_Running)和从属数据库的线程(slave _IO_Runing)仅在同一线程上运行。如果MySQL有n个需要同步的数据库,则可以在MySQL内存中完成更多操作,并且从属数据库使用SSD磁盘。机械硬盘可以通过将磁头旋转到指定位置来读取和写入数据。

一、如何监控发生了主从延迟?

在从库机器上,执行show slave status,查看Seconds_Behind_Master值,代表主从同步从库落后主库的时间,单位为秒,若同从同步无延迟,这个值为0。

Mysql主从延迟一个重要的原因之一是:mysql是以单线程串行执行。

主从复制数据时,在从服务器上的mysql,是一个线程在同步数据。

串行的方式,它是指,执行一个后才继续执行下一个。如果一个卡住了,要等待时间,才会继续下一个。串行与并行是相反的。

二、同步延迟发生的场景

当主库的TPS并发较高时,产生的DDL(修改类的sql语句)数量,超过了slave机器sql线程所能承受的能力,那么延时就会产生了。

主库写binlog日志到文件的时候,是顺序写入到磁盘,顺序写入速度是很快,避免了磁盘随机寻址。

从库的同步线程(Slave_IO_Running),将binlog在slave上执行的时候,实际上是随机的,速度肯定要慢点。

 从库的同步线程(Slave_IO_Running)只有应该线程在操作,整个mysql实例就一个这样的线程,那么,如果mysql有n个库的数据需要同步,全部要这个线程来处理。人手不够啊(mysql-5.6.3)

三、解决思路

如何避免或解决主从延迟?可以用来解决的办法,有如下的:

  • 从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘操作。

  • 从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。

  • 从库使用SSD磁盘。机械硬盘是靠磁头旋转到指定位置来读数据、写数据。转来转去的,我们叫做i/o。磁盘i/o存在速度瓶颈。固态硬盘是一个电子设备,电子设备不需要机械旋转,读写固态硬盘上任意位置的数据,速度都是一样的。

  • 业务代码的妥协。将实时性要求高的某些操作,使用主库做读操作。比如我写了数据到主库了,需要马上展示数据,不要到从库去读数据,因为从库可能还没同步过去呢。直接从主库读数据,保证是最新的数据展示。

  • 从库的线程改为多个同步线程同步数据。mysql-5.6.3为了解决这个问题,从服务器上,每一个库开一个线程来同步。
  • 网络优化。网络堵塞,也会导致同步延迟。跨机房的数据库同步,会存在同步延迟。保证主从在同一个机房里面去。

附:mysql主从复制的三种格式数据

第一种是,statement格式。也就是记录下原来执行的sql语句。

这是最早的一种方式,后来发现也不是很完美,在复制的过程中会存在一些问题。

举例:由于sql语句中使用了某些mysql函数,而这个mysql函数是特定版本才有的,其他版本是没有这个函数,放到slave端运行,假如slave的mysql版本不一样,就可能执行出现问题。

使用了特定的功能,如果sql中使用了last_insert_id()函数,当同样的sql语句复制到slave端执行的时候,last_insert_id()所得到的结果是不同的。

上面两种情况导致了:复制过程中,slave端的结果没有完全与master端一致了。

而基于row格式的就不会。于是发明了row格式的。

第二种,基于row格式的。会记录下每一行修改前和修改后的值。binlog中存储的就是被修改行的修改前和修改后的值,直接拿到结果即可。重做。

基于row的格式有个缺点:涉及到ddl操作,比如alter table,加一个字段,那么意味着整个表的行都要进行修改。那么binlog中记录的是整个表中行的数据,造成binlog中的数据量很大。

于是,又发明了基于statement格式和基于row格式的综合版,叫做mixed

第三种:mixed

遇到ddl表变更操作,则使用statement格式,遇到delete或update格式,则使用row格式。

三种格式的发展过程总结:

一直使用statement格式,到了5.1.5版本才支持row格式。后来存储过程的出现,又带来了新的问题。存储过程中调用一些函数,在slave端运行结果会不同。所以5.1.8版本开始支持mixed格式。上面所有策略的做法目标是,让master与slave的数据保持一致。从这个角度出发。

 
 

免责声明:文章转载自《mysql主从复制延迟问题的相关知识与解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇帧动画和骨骼json、极速、二进制对比一个巧妙的实现悬浮的tableViewHeader的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ADO.net数据访问方法

ADO.NET是一组用于和数据源进行交互的面向对象的类库。 核心组件有两个:   DataSet 是 ADO.NET 的非连接(断开)结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,ADO.NET结构可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 Dat...

Java多线程 -yield用法

 前几天复习了一下多线程,发现有许多网上讲的都很抽象,所以,自己把网上的一些案例总结了一下!  一. Thread.yield( )方法:  使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了。 ...

ADO.NET(内涵效率问题)

ADO.NET 为什么要学习ADO.NET呢? 之前我们所学只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学sql, 所以我们搭建一个界面(Web Winform)让用户方便的操作数据库中的数据 什么是ADO.NET? ADO.NET就是一组类库,这组类库可以让我们通过程序的方式访问数据库,就像System.IO下的类用类操作文件一样, Sys...

【转载】通过服务端监控结果,说说WCF的并发处理

InstanceContextMode表示的是,WCF允许产生可用来处理包含在传入消息中的调用的服务(契约类)的实例InstanceContext模式数,WCF的并发模式ConcurrencyMode是针对某个封装了服务实例的InstanceContext而言的 简单的说,InstanceContextMode表示产生多少个服务实例对象,Concurren...

二维码知识介绍(转)

一、二维码的分类 二维码,从字面上看就是用两个维度(水平方向和垂直方向)来进行数据的编码,条形码只利用了一个维度(水平方向)表示信息,在另一个维度(垂直方向)没有意义,所以二维码比条形码有着更高的数据存储容量。 从形成方式上,二维码可以分为两类, 1、堆叠式二维码:在一维条形码的基础上,将多个条形码堆积在一起进行编码,常见的编码标准有PDF417等   ...

使用Proteus模拟操作HDG12864F-1液晶屏

  在Proteus中模拟了89C52操作HDG12864F-1液晶屏,原理图如下:   一、HDG12864F-1官网信息   该液晶屏是Hantronix的产品,官网上搜索出这个型号是系列型号中的一种,各种型号间的区别主要是尺寸不同、有无背光、背光颜色等等。    下面是官网中几个手册的链接: DataSheet 完整版说明书 控制器说明书,该...