mysql常见slave延迟原因有哪些

发布时间:2021-11-06 14:08:55 作者:小新
来源:亿速云 阅读:264

这篇文章主要介绍了mysql常见slave延迟原因有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一  序言

在运维线上M-M 架构的MySQL数据库时,接收的比较多关于主备延时的报警:

  1. check_ins_slave_lag (err_cnt:1)critical-slavelag on ins:3306=39438

相信slave 延迟是MySQL dba 遇到的一个老生长谈的问题了。先来分析一下slave延迟带来的风险

  1. 异常情况下,主从HA无法切换。HA 软件需要检查数据的一致性,延迟时,主备不一致。 

  2. 备库复制hang会导致备份失败(flush tables with read lock会900s超时)

  3. 以 slave 为基准进行的备份,数据不是最新的,而是延迟。

二  如何解决

面对此类问题我们如何解决 ,如何规避?分析一下导致备库延迟的几种原因

1. ROW模式无主键、无索引或索引区分度不高.有如下特征

   a. show slave status 显示position一直没有变

   b. show open tables 显示某个表一直是 in_use 为 1

   c. show create table 查看表结构可以看到无主键,或者无任何索引,或者索引区分度很差。

解决方法:

   a. 找到表区分度比较高的几个字段, 可以使用这个方法判断:

    select count(*) from xx; 

    select count(*) from (select distinct xx from xxx) t;

    如果2个查询count(*)的结果差不多,说明可以对这些字段加索引

   b. 备库stop slave;

    可能会执行比较久,因为需要回滚事务。

  c. 备库

    set sql_log_bin=0;

    alter table xx add key xx(xx);

   老的版本slave应用binlog时只会选择第一个索引,需要把新加的索引放在最前面,可以先把老的索引删掉,建新的索引,再把老的索引建上。可以放到一个sql中执行。

  d. 备库start slave

    如果是innodb,可以通过show innodb status来查看 rows_inserted,updated,deleted,selected这几个指标来判断。

    如果每秒修改的记录数比较多,说明复制正在以比较快的速度执行。

2 MIXED模式无索引或SQL慢

   在从库上show full processlist 查看到正在执行的SQL。

解决方法:

  a.  SQL比较简单, 则检查是否缺少索引,并添加索引。

  b. 另一类是 insert into select from的语句,如果select 里包含group by,多表关联,可能效率会比较低。

      这类可以到主库把binlog_format改成row。

3 主库上有大事务,导致从库延时

现象解析binlog 发现类似于下图的情况看

解决方法:

与开发沟通,增加缓存,异步写入数据库,减少直接对db的大量写入。

4. 主库写入频繁,从库压力跟不上导致延时

  此类原因的主要现象是数据库的 IUD 操作非常多,slave由于sql_thread单线程的原因追不上主库。

 解决方法:

 a 升级从库的硬件配置,比如ssd,fio.

 b 使用@丁奇的预热工具-relay fetch

   在备库sql线程执行更新之前,预先将相应的数据加载到内存中,并不能提高sql_thread线程执行sql的能力,也不能加快io_thread线程读取日志的速度。

 c 使用多线程复制 阿里MySQL团队实现的方案--基于行的并行复制。

   该方案允许对同一张表进行修改的两个事务并行执行,只要这两个事务修改了表中的不同的行。这个方案可以达到事务间更高的并发度,但是局限是必须使用Row格式的binlog。因为只有使用      Row格式的binlog才可以知道一个事务所修改的行的范围,而使用Statement格式的binlog只能知道修改的表对象。

5. 数据库中存在大量myisam表,在备份的时候导致slave 延迟

 由于xtrabackup 工具备份到最后会执行flash tables with read lock ,对数据库进行锁表以便进行一致性备份,然后对于myisam表 锁,会阻碍salve_sql_thread 停滞运行进而导致hang

该问题目前的比较好的解决方式是修改表结构为innodb存储引擎的表。

 三 拓展阅读

 [1] 怎样解决MySQL数据库主从复制延迟的问题 

 [2] 三种MySQL并行复制方案的分析                

 [3] 一种MySQL主从同步加速方案-改进

 [4] MySQL多线程同步MySQL-Transfer介绍


6、如何确认真正延迟多少?
seconds_bebind_master这个参数不准,有时显示为0,但是有数据延迟的情况,在stop slave和start slave后,数据就同步过来了,因为slave有时候检测网络正常失败,可以使用脚本来实现监控,在salve和master节点分别部署。
先在两个节点都创建监控表

  1. <span style="font-size:16px;">#filename: run_mysql_replication_heartbeat.py  

  2. #encoding=gbk  

  3. import datetime,time  

  4. import os,sys  

  5. from public import db  

  6.   

  7. import db_conf  

  8.   

  9. source_folder = db_conf.SOURCE_FOLDER  

  10.   

  11.   

  12. def init_eviroment_path():  

  13.     print sys.path  

  14.     python_path = (source_folder)  

  15.       

  16.     for i in python_path:  

  17.         if i not in sys.path:  

  18.             sys.path.append(i)  

  19.       

  20.     print sys.path  

  21.   

  22. def main():  

  23.     conn, cursor = db.GetMysqlCursor('update')  

  24.       

  25.     cursor.execute("insert into heartbeat (master_datetime,slave_datetime) values(now(),sysdate())")  

  26.       

  27.     cursor.close()  

  28.     conn.close()  

  29.   

  30. if __name__ == '__main__':  

  31.     init_eviroment_path()  

  32.     os.system("title MySQL Replication心跳")  

  33.     count = 1  

  34.     while True:  

  35.         main()  

  36.         print "(%d)%s"%(count,datetime.datetime.now())  

  37.         count+=1  

  38.         time.sleep(60)<span style="font-size: 24px;">  

  39.  

修改master端的binlog模式为statement(默认为mix)

所以这么修改是因为必须是statement的SQL语句同步模式才行,否则mix下有可能是ROW的结果数据同步模式就不行,这个我也是通过master>show binlog events才找到这个原因。

如果要立刻看到结果,只要把master端的时间修改一下,例如提前一个小时,执行:

insert into heartbeat (master_datetime,slave_datetime) values(now(),sysdate())在slave上就可以看到类似如下结果:

感谢你能够认真阅读完这篇文章,希望小编分享的“mysql常见slave延迟原因有哪些”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

推荐阅读:
  1. 找出MySQL主从延迟的原因
  2. mysql无法联接常见故障及原因有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql slave

上一篇:怎么样备份MySql数据库

下一篇:什么是JavaScript闭包

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》