主从库延迟对项目质量的影响

yingchen yingchen     2022-08-20     232

关键词:

最近在测试一个新的项目,原来项目是不存在主从库,和服务器集群的内容。

但新的项目进行了架构升级,随着业务的增长,这种普遍的服务器集群,读写分离等基本的架构内容一定是需要使用的。

出现的问题:

A系统在购买某个产品的时候,先从产品的剩余数量中减去购买量,发送一个mq消息,前面的几个事儿作为一个事务进行提交。

B系统监听到mq消息后,对用户的金额进行扣减,扣减成功,发送mq消息,一个整体的事务

A监听到B的mq后,查询购买产品的内容,并对数量进行真实的扣减。

问题处在,A系统查询产品的内容是从从库进行查询,但B事务已经完成后,A系统当时在写库记录的内容依然在从库中不存在,所以整个业务线出现问题。l

就是由于mysql的主从同步延迟导致 。

MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以切换到从服务器。

相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢?

1. MySQL数据库主从同步延迟原理。

2. MySQL数据库主从同步延迟是怎么产生的。

3. MySQL数据库主从同步延迟解决方案。

 

1. MySQL数据库主从同步延迟原理。

答:谈到MySQL数据库主从同步延迟原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主库对所有DDL和 DML产生binlog,binlog是顺序写,所以效率很高,slave的Slave_IO_Running线程到主库取日志,效率很比较高,下一步, 问题来了,slave的Slave_SQL_Running线程将主库的DDL和DML操作在slave实施。DML和DDL的IO操作是随即的,不是顺 序的,成本高很多,还可能可slave上的其他查询产生lock争用,由于Slave_SQL_Running也是单线程的,所以一个DDL卡主了,需要 执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延时。有朋友会问:“主库上那个相同的DDL也需要执行10分,为什 么slave会延时?”,答案是master可以并发,Slave_SQL_Running线程却不可以。

2. MySQL数据库主从同步延迟是怎么产生的。

答:当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待。

3. MySQL数据库主从同步延迟解决方案

答:最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行。还有就是主库是写,对数据安全性较高,比如 sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog,innodb_flushlog也 可以设置为0来提高sql的执行效率。另外就是使用比主库更好的硬件设备作为slave。

mysql-5.6.3已经支持了多线程的主从复制。原理和丁奇的类似,丁奇的是以表做多线程,Oracle使用的是以数据库(schema)为单位做多线程,不同的库可以使用不同的复制线程。

 

基于局域网的master/slave机制在通常情况下已经可以满足‘实时‘备份的要求了。如果延迟比较大,就先确认以下几个因素: 
1. 网络延迟
2. master负载
3. slave负载
一般的做法是,使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器,只作为备份用,不进行其他任何操作,就能相对最大限度地达到‘实时‘的要求了

slave_net_timeout单位为秒 默认设置为 3600秒

参数含义:当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据

master-connect-retry单位为秒 默认设置为 60秒

参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试。

通常配置以上2个参数可以减少网络问题导致的主从数据同步延迟

 

判断主从延时,通常有两个方法:

1. Seconds_Behind_Master  vs  2. mk-heartbeat,下面具体说下两者在实现功能的差别。

可以通过监控show slave statusG命令输出的Seconds_Behind_Master参数的值来判断,是否有发生主从延时。
其值有这么几种:
NULL - 表示io_thread或是sql_thread有任何一个发生故障,也就是该线程的Running状态是No,而非Yes.
0 - 该值为零,是我们极为渴望看到的情况,表示主从复制良好,可以认为lag不存在。
正值 - 表示主从已经出现延时,数字越大表示从库落后主库越多。
负值 - 几乎很少见,只是听一些资深的DBA说见过,其实,这是一个BUG值,该参数是不支持负值的,也就是不应该出现。

Seconds_Behind_Master是通过比较sql_thread执行的event的timestamp和io_thread复制好的 event的timestamp(简写为ts)进行比较,而得到的这么一个差值。我们都知道的relay-log和主库的bin-log里面的内容完全一 样,在记录sql语句的同时会被记录上当时的ts,所以比较参考的值来自于binlog,其实主从没有必要与NTP进行同步,也就是说无需保证主从时钟的 一致。你也会发现,其实比较真正是发生在io_thread与sql_thread之间,而io_thread才真正与主库有关联,于是,问题就出来了, 当主库I/O负载很大或是网络阻塞,io_thread不能及时复制binlog(没有中断,也在复制),而sql_thread一直都能跟上 io_thread的脚本,这时Seconds_Behind_Master的值是0,也就是我们认为的无延时,但是,实际上不是,你懂得。这也就是为什 么大家要批判用这个参数来监控数据库是否发生延时不准的原因,但是这个值并不是总是不准,如果当io_thread与master网络很好的情况下,那么 该值也是很有价值的。(就好比:妈–儿子–媳妇的关系,妈与儿子亲人,媳妇和儿子也亲人,不见得媳妇与妈就很亲。开个玩笑:-)之前,提到 Seconds_Behind_Master这个参数会有负值出现,我们已经知道该值是io_thread的最近跟新的ts与sql_thread执行到 的ts差值,前者始终是大于后者的,唯一的肯能就是某个event的ts发生了错误,比之前的小了,那么当这种情况发生时,负值出现就成为可能。

方法2. mk-heartbeat,Maatkit万能工具包中的一个工具,被认为可以准确判断复制延时的方法。

mk-heartbeat的实现也是借助timestmp的比较实现的,它首先需要保证主从服务器必须要保持一致,通过与相同的一个NTP server同步时钟。它需要在主库上创建一个heartbeat的表,里面至少有id与ts两个字段,id为server_id,ts就是当前的时间戳 now(),该结构也会被复制到从库上,表建好以后,会在主库上以后台进程的模式去执行一行更新操作的命令,定期去向表中的插入数据,这个周期默认为1 秒,同时从库也会在后台执行一个监控命令,与主库保持一致的周期去比较,复制过来记录的ts值与主库上的同一条ts值,差值为0表示无延时,差值越大表示 延时的秒数越多。我们都知道复制是异步的ts不肯完全一致,所以该工具允许半秒的差距,在这之内的差异都可忽略认为无延时。这个工具就是通过实打实的复 制,巧妙的借用timestamp来检查延时,赞一个!

 

 

解决方案一:

http://blog.csdn.net/allen_hdh/article/details/19854783

mysql主从同步延迟与系统时间的关系

Mysql主从同步延迟受到多种因素影响,比如大事务,从库查询压力,网路延迟等;这些比较常见;但还受到主从机器系统时钟差的影响,这一点可能容易被忽视。上周,就遇到了这样的情况,主库的系统时间由于某种原因落后于... 查看详情

mysql主从同步延迟与系统时间的关系

Mysql主从同步延迟受到多种因素影响,比如大事务,从库查询压力,网路延迟等;这些比较常见;但还受到主从机器系统时钟差的影响,这一点可能容易被忽视。上周,就遇到了这样的情况,主库的系统时间由于某种原因落后于... 查看详情

mysql主从同步延迟与系统时间的关系

Mysql主从同步延迟受到多种因素影响,比如大事务,从库查询压力,网路延迟等;这些比较常见;但还受到主从机器系统时钟差的影响,这一点可能容易被忽视。上周,就遇到了这样的情况,主库的系统时间由于某种原因落后于... 查看详情

mysql主从复制延迟解决方案

...并发控制(MVCC)实现原理​​,这一篇我们接着学习MySQL主从复制模式下的延迟解决方案。MySQL主从延迟是指从库的数据同步比主库略有延迟,造成数据差异。MySQL主从复制模式一般采用以下方法降低延迟:1、优化网络环境:主... 查看详情

mysql主从延迟现象及原理分析详解

...加索引,表数据量太大(1亿+数据,数据量50G以上),造成主从延迟几个小时,各个依赖从库的系统无法查询数据,最终影响业务。 现在就梳理下主从延迟的原理。 二、原理 根据MySQL官方文档MySQLReplicationImplementationDetails中的描述... 查看详情

导致mysql主从延迟的原因和现象

主从延迟监控showslavestatus方式可以看到很多主从相关值Seconds_Behind_Master值每个事务的binlog里面都有一个时间字段,用于记录主库上写入的时间;备库取出当前正在执行的事务的时间字段的值,计算它与当前系统时间的差值,得到... 查看详情

三思而后行:前期准备

...高质量的软件,软件开发过程必须由始至终关注质量。在项目初期关注质量,对产品质量的正面影响比在项目末期关注质量的影响要大。程序员的一部分工作是教育老板和合作者,告诉他们软件开发过程,包括在开始编程之前进... 查看详情

my16_sql_thread执行慢导致主从延迟高的一个情景

现象:从库延迟高,查看slavestatus发现sql_thread执行语句的速度比主库慢,这样的延迟会一直高下去,下面是排查的一些过程1.检查了从库的配置,磁盘的写入速度的确没有主库高2.iostat-m110查看磁盘写入,从库为2M/S,主库也就3M/S,... 查看详情

slave_exec_mode参数对主从复制的影响

主从复制中常会遇到的问题就是1062主键重复、1032slave上相关记录没找到如果在读写分离的架构中,slave同步失败会对业务造成很大的影响的(比如主写入了一条数据,从上无法读取到这样对业务影响很大)主从同步主要涉及一个... 查看详情

mysql主从同步原理解析!

大神请绕行!一、为什么要主从同步?我们会对数据库进行大量的读写操作,而如果数据库非常庞大的话,对我们的主机压力非常大,我们想到了一个解决的办法:两台服务器,一台只用来读取操作,一台只用来写入操作。二、... 查看详情

mysql主从同步原理解析!

大神请绕行!一、为什么要主从同步?我们会对数据库进行大量的读写操作,而如果数据库非常庞大的话,对我们的主机压力非常大,我们想到了一个解决的办法:两台服务器,一台只用来读取操作,一台只用来写入操作。二、... 查看详情

mysql主从同步原理解析!

大神请绕行!一、为什么要主从同步?我们会对数据库进行大量的读写操作,而如果数据库非常庞大的话,对我们的主机压力非常大,我们想到了一个解决的办法:两台服务器,一台只用来读取操作,一台只用来写入操作。二、... 查看详情

更改运行时库选项对运行时链接的影响

...问题描述】:在MicrosoftVisualStudio2015(v14.0)我有一个包含3个项目的解决方案。其中两个项目是DLL,另一个是可执行文件。可执行文件在运行时加载DLL并调用它们的函数并交换参数;使用Window的Load 查看详情

mysql主从同步延迟问题及解决方案

对于主从正常执行,相应的延迟几乎是不存在的。但是在高QPS下,主从同步却出现了比较明显的延迟情况。_________________________________________________________问题一:主库的从库太多,导致复制延迟从库数据以3-5个为宜,要复制的从节... 查看详情

mysql主从同步延迟问题及解决方案

对于主从正常执行,相应的延迟几乎是不存在的。但是在高QPS下,主从同步却出现了比较明显的延迟情况。_________________________________________________________问题一:主库的从库太多,导致复制延迟从库数据以3-5个为宜,要复制的从节... 查看详情

mysql主从同步延迟问题及解决方案

对于主从正常执行,相应的延迟几乎是不存在的。但是在高QPS下,主从同步却出现了比较明显的延迟情况。_________________________________________________________问题一:主库的从库太多,导致复制延迟从库数据以3-5个为宜,要复制的从节... 查看详情

mysql主从同步延迟问题及解决方案

对于主从正常执行,相应的延迟几乎是不存在的。但是在高QPS下,主从同步却出现了比较明显的延迟情况。_________________________________________________________问题一:主库的从库太多,导致复制延迟从库数据以3-5个为宜,要复制的从节... 查看详情

mysql主从同步延迟问题及解决方案

对于主从正常执行,相应的延迟几乎是不存在的。但是在高QPS下,主从同步却出现了比较明显的延迟情况。_________________________________________________________问题一:主库的从库太多,导致复制延迟从库数据以3-5个为宜,要复制的从节... 查看详情