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

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

在从库机器上,执行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的数据保持一致。从这个角度出发。

时间: 2024-12-24 04:37:15

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

mysql主从复制延迟问题

在一般生产环境,普遍通过MySQL的主从复制进行读写分离,从而减轻主服务器的压力,提高数据的读写效率.通常情况下,主从复制基本上能做实时同步.由于服务器实际运行过程中,客户端的连接服务器,读写数据不可能是均匀,在某个时间点出现大量并发连接,主服务器不断的有更新操作不断的写入,但是从服务器当某个语句在从服务器上执行的时间较长,或者某个语句要进行锁表,就会导致主服务器的SQL语句大量积压,未被同步到从服务器,这样就会导致在某个时刻主从数据不一致:还有主从复制,是通过网络进行数据传输,网络的抖动.主从

mysql 主从复制延迟及解决

qps 每秒处理的查询数tps 每秒处理的事务数IOPS,每秒磁盘进行的I/O操作次数 一 延迟的原因 主库并发量大,而从库复制是单线程,从库过多,主从系统配置不当,cpu,内存等,慢sql过大多,大的事物,网络延迟,跨公网的主从复制很容易导致主从复制延迟 二解决方法 1.适当数量的从库,3-5个,从库配置更好的硬件,网络配置等 2.将大事物拆分成多个小事物进行提交,表加主键,否在会全表扫描 3.mysql 5.7.19 + 版本支持并行复制 # slave 从表配置 slave-paralle

MySQL 主从复制延迟问题

导致主从复制延迟的原因: (1) 主库的从库太多,导致复制延迟(2) 从库硬件比主库差,导致复制延迟(3) 慢 SQL 语句过多,导致复制延迟(4) 主从复制的设计问题,导致复制延迟(5) 主从库之间的网络延迟,导致复制延迟(6) 主库读写压力大,导致复制延迟

mysql主从复制延迟

对于高并发流量大的web站点,单点的数据库往往很难支持,一般是使用主从复制,再加上mysql proxy实现复制均衡,读写分离等功能等.但是主从复制会有延迟,大网站是如何解决这些问题的呢?转载自PHP老杨文章. 1.优酷的经验 数据库采用水平的扩展,主从复制,随着从库的增多,复制延迟越来越厉害,最终无法忍受.最终还是采用了平行的数据库,相当于集群吧,把一组用户的相关的数据和表放到一组的数据库上.使用SSD来优化mysql的I/O,性能明显提高,采用数据库分片的技术,抛弃了原来主从延迟的问题,按照

mysql主从复制replication的一些相关命令

主服务器上的相关命令:show master status; mysql> show master status\G *************************** 1. row *************************** File: host2-bin.000002 Position: 420 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 5abd564e-2b4f-11e5-a7f1-000c2954ccde:1,

mysql中的锁的相关知识

数据库锁:数据库锁出现的原因是为了处理并发问题. 并发控制一般采用三种方法,分别是乐观锁和悲观锁以及时间戳. 乐观锁认为一个用户读数据的时候,别人不会去写自己所读的数据,就是不做任何操作.悲观锁就刚好相反,觉得自己读数据库的时候,别人可能刚好在写自己刚读的数据,其实就是持一种比较保守的态度,悲观锁就是在读取数据的时候,为了不让别人修改自己读取的数据,就会先对自己读取的数据加锁,只有自己把数据读完了,才允许别人修改那部分数据,或者反过来说,就是自己修改某条数据的时候,不允许别人读取该数据,只有等自

mysql 主从复制延迟监控

1.在主从上分别安装percona-toolkit wget https://www.percona.com/downloads/percona-toolkit/2.2.18/RPM/percona-toolkit-2.2.18-1.noarch.rpm yum localinstall percona-toolkit-2.2.18-1.noarch.rpm 2.在主库上执行 pt-heartbeat --user=root --password=******* -S /var/lib/mysq

服务器向Android推送的相关知识和解决方案

在Android中实现推送方式的基础知识及相关解决方案:推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息.这种推送功能是好的一面,但是也会经常看到很多推送过来的垃圾信息,这就让我们感到厌烦了,关于这个我们就不能多说什么了,毕竟很多商家要做广告.本文就是来探讨下Android中实现推送功能的一些解决方案,也希望能够起到抛砖引玉的作用.^_^ 1.推送方式基础知识: 在移动互联网时代以前的手机,如果有事情发生需要通

老男孩教育每日一题-2017年4月28日- MySQL主从复制常见故障及解决方法?

MySQL主从复制常见故障及解决方法? 1.1.1故障1:从库数据与主库冲突 show slave status; 报错:且show slave status\G Slave_I/O_Running:Yes Slave_SQL_Running:No Seconds_Behind_Master:NULL Last_error:Error 'Can't create database 'xiaoliu'; database exists' on query. Default   database:'