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的大量写入。对应已经出现的延迟,考虑到数据丢失的风险之后,可以设置 sync_binlog=1000,innodb_flush_log_at_trx_commit=2; 来加快sql_thread 应用relay-log的速度。 4. 主库写入频繁,从库压力跟不上导致延时 此类原因的主要现象是数据库的 IUD 操作非常多,slave由于sql_thread单线程的原因追不上主库。 解决方法: a 升级从库的硬件配置,比如SSD ,PCI-E SSD . b 使用@丁奇的预热工具-relay fetch 在备库sql线程执行更新之前,预先将相应的数据加载到内存中,并不能提高sql_thread线程执行sql的能力,也不能加快io_thread线程读取日志的速度。 c 使用多线程复制 阿里MySQL团队实现的方案--基于行的并行复制。 该方案允许对同一张表进行修改的两个事务并行执行,只要这两个事务修改了表中的不同的行。这个方案可以达到事务间更高的并发度,但是局限是必须使用Row格式的binlog。因为只有使用Row格式的binlog才可以知道一个事务所修改的行的范围,而使用Statement格式的binlog只能知道修改的表对象。 d 无法使用AliSQL的,可以升级到5.7版本多线程复制。

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

由于xtrabackup 工具备份到最后会执行flash tables with read lock ,对数据库进行锁表以便进行一致性备份,然后对于myisam表 锁,会阻碍salve_sql_thread 停滞运行进而导致hang 该问题目前的比较好的解决方式是修改表结构为innodb存储引擎的表。

6 网络丢包

该案例比较相对比较特别,是属于基础设施网络不稳定。解决方法要依靠大部门去申请更好的资源。

原文发表时间:2017-10-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

ERROR 126 (HY000) at line 1: Incorrect key file for table '/tmp/#sql_7b09_0.MYI'; try to repair it

我在slelect一个数据量很大的merge表时,并同时将select结果集insert到另外一张表中,报了如下错误:

11120
来自专栏流浪猫的golang

go 数据库框架xorm 的使用

golang 连接mysql 的博客可以看我前面的文章。这片文章主要讲xorm,我试过golang 的orm 框架 有beego自带的数据库orm框架htt...

42210
来自专栏杨建荣的学习笔记

巧用flashback database实现灵活的数据切换(r5笔记第9天)

今天是DTCC第二天了,抽空去听了下,因为手头有一些活,听到一半只能赶回公司继续工作。 客户今天有一个需求,因为开发现在在生产环境中遇到了一些困难,需要在测试生...

34950
来自专栏北京马哥教育

MySQL架构

1.MySQL整体逻辑架构 我们先下图看看MySQL整体逻辑架构(MySQL’s Logical Architecture) ? ...

37680
来自专栏Laoqi's Linux运维专列

MySQL性能调优 – 你必须了解的15个重要变量

2.6K20
来自专栏数据和云

升级迁移:利用DMU修改数据库字符集

何剑敏 Oracle ACS华南区售后团队,首席技术工程师 曾供职于中国联通信息计费部、卓望数码,系统支撑部首席DBA,负责中国移动全网梦网业务和移动应用商城数...

40790
来自专栏文渊之博

SQL Server中的锁的简单学习

简介     在SQL Server中,每一个查询都会找到最短路径实现自己的目标。如果数据库只接受一个连接一次只执行一个查询。那么查询当然是要多快好省的完成工作...

29450
来自专栏做全栈攻城狮

Python教程:连接数据库,对数据进行增删改查操作

本文章内容是基于上次课程Python教程:操作数据库,MySql的安装详解和python基础知识之上进行的。如想学习python基础请移步:Python开发实战...

14120
来自专栏「3306 Pai」社区

海豚 VS 大象 功能对比

MySQL为多线程架构后台有多个线程处理内部操作例如:刷脏、Undo purge、checkpoint等,整体上MySQL分为两层Server/存储引擎。存储引...

29930
来自专栏L宝宝聊IT

MySQL架构组成、逻辑模块组成

Mysql逻辑结构可以看成是二层架构,第一层通常叫做SQL Layer,在mysql数据库系统处理底层数据之前的所有工作都在这一层完成的,包括权...

10230

扫码关注云+社区

领取腾讯云代金券