记一次不常见到主从延迟问题

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: Slave_SQL_Running_State: Waiting for dependent transaction to commit 导致的主从延迟

一、问题:发现RDS实例主从数据不一致

二、分析:可能的原因
1.主从复制中断
2.主从延迟(DDL语句,大事务,只读实例负载高等)
3.实时性查询高
4.丢数据(binlog row格式可能性很小)

三、排查:
获取只读实例的复制状态,show slave status\G:

1. row **

           Slave_IO_State: Waiting for master to send event
              Master_Host: XXXXXXX
              Master_User: replicator
              Master_Port: XXXX
            Connect_Retry: 60
          Master_Log_File: mysql-bin.001798
      Read_Master_Log_Pos: 15683249
           Relay_Log_File: slave-relay.002090
            Relay_Log_Pos: 88207647
    Relay_Master_Log_File: mysql-bin.001797
         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes
          Replicate_Do_DB: 
      Replicate_Ignore_DB: 
       Replicate_Do_Table: 
   Replicate_Ignore_Table: 
  Replicate_Wild_Do_Table: 

Replicate_Wild_Ignore_Table:

               Last_Errno: 0
               Last_Error: 
             Skip_Counter: 0
      Exec_Master_Log_Pos: 128759954
          Relay_Log_Space: 147040856
          Until_Condition: None
           Until_Log_File: 
            Until_Log_Pos: 0
       Master_SSL_Allowed: No
       Master_SSL_CA_File: 
       Master_SSL_CA_Path: 
          Master_SSL_Cert: 
        Master_SSL_Cipher: 
           Master_SSL_Key: 
    Seconds_Behind_Master: 9366

Master_SSL_Verify_Server_Cert: No

            Last_IO_Errno: 0
            Last_IO_Error: 
           Last_SQL_Errno: 0
           Last_SQL_Error: 

Replicate_Ignore_Server_Ids:

         Master_Server_Id: XXXX
              Master_UUID: XXXX
         Master_Info_File: mysql.slave_master_info
                SQL_Delay: 0
      SQL_Remaining_Delay: 
  Slave_SQL_Running_State: Waiting for dependent transaction to commit
       Master_Retry_Count: 86400
              Master_Bind: 
  Last_IO_Error_Timestamp: 
 Last_SQL_Error_Timestamp: 
      Last_SQL_Error_Gtid: 
           Master_SSL_Crl: 
       Master_SSL_Crlpath: 
       Retrieved_Gtid_Set: 64f5764b-abfd-11e8-b97f-6c92bf4645d4:6903-76788620
        Executed_Gtid_Set: 64f5764b-abfd-11e8-b97f-6c92bf4645d4:1-76781839,

73e54b6b-abfd-11e8-9bb5-6c92bf3a3bee:1-131695420

            Auto_Position: 1
     Replicate_Rewrite_DB: 
             Channel_Name: 
       Master_TLS_Version: 

解读下:看到IO Thread和SQL Thread线程正常都是YES 复制正常。
Seconds_Behind_Master: 9366, Relay_Master_Log_File: mysql-bin.001797 和 Master_Log_File: mysql-bin.001798 可以判断主从复制相差一个binlog日志有延迟,延迟时间大概9366秒。

继续分析只读实例负载不高
image
image

慢日志里有delete操作,但执行时间不是特别长,可以先忽略。

show processlist 也并未发现DDL语句执行
image
继续看复制信息 Slave_SQL_Running_State: Waiting for dependent transaction to commit 等待依赖的事务提交,这里提醒了我们relay log在回放某个event的时候,在等待某个事务提交。所以查询下infomation_schema.innodb_trx 这个系统表,里面会记录未提交事务执行信息
image
image

从结果看确实有2个未提交事务已经跑了很久了,为了尽快解决生产问题,建议客户kill 掉了这2个sql,这里说下trx_mysql_thread_id 对应的是processlist表里的id,所以kill时候,可以kill trx_mysql_thread_id。

结果:kill掉这2个未提交事务之后,延迟恢复。

四.复现客户问题
观察到当时SQL线程回放event时候,在等待table flush
image

资料:
FLUSH TABLES
Closes all open tables, forces all tables in use to be closed, and flushes the query cache and prepared statement cache. FLUSH TABLES also removes all query results from the query cache, like the RESET QUERY CACHE statement. For information about query caching and prepared statement caching, see Section 8.10.3, “The MySQL Query Cache”. and Section 8.10.4, “Caching of Prepared Statements and Stored Programs”.
mysql官网说明:https://dev.mysql.com/doc/refman/5.6/en/flush.html#flush-tables

说明下,flush tables遇到前面有大事务执行不完,还会产生阻塞,线程状态就是waiting for table flush(阻塞仅限于该表)

基于这些信息我们还原下问题

4.1先在只读实例,开启一个性能差的大查询事务,SQL一直执行不完
image

4.2在只读实例另外开启一个会话执行flush tables tablename
image

4.3主实例插入一条测试数据
image

4.4查询只读实例的sql线程,可以看到SQL线程的状态waiting for table flush,第一个查询一值执行不完不提交,
第二步flush tables tablename就阻塞了第三步的sql
image

4.5查询只读实例的复制状态,同样可以看到:Waiting for dependent transaction to commit
image

4.6同样也可以查到未提交的这个大事务
image

总结:未提交事务和flush tables导致relay log回放event时候,产生了阻塞,复制不能继续,产生主从延迟

客户的问题还可以通过解析binlog定位到当时relay log 回放到binlog的event了,可以佐证该事务在等待这2个事务commit或rollback。解析时候分析这个位置Relay_Master_Log_File: mysql-bin.001797,Exec_Master_Log_Pos: 128759954,row格式使用命令:mysqlbinlog -vv --base64-output=decode-rows --start-position=128759954 mysql-bin.001797 | less

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
Kubernetes NoSQL Redis
单机模拟主从复制(一主三从)
单机模拟主从复制(一主三从)
|
4月前
|
SQL 存储 关系型数据库
MySQL主从同步延迟原因与解决方案
MySQL主从同步延迟原因与解决方案
162 0
MySQL主从同步延迟原因与解决方案
|
11月前
|
监控 数据库
主从延时问题的监控及处理建议
主从延时问题的监控及处理建议
|
11月前
|
监控 关系型数据库 MySQL
如何避免主从不同步
如何避免主从不同步
73 0
|
SQL 缓存 算法
主从不一致解决方案 && 如何降低主从延迟
主从不一致解决方案 && 如何降低主从延迟
主从不一致解决方案 && 如何降低主从延迟
|
SQL 存储 容灾
关于主从延迟,一篇文章给你讲明白了!
在实际的生产环境中,由单台MySQL作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面 因此,一般来说都是通过集群主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力进行部署与实施总结MySQL主从集群带来的作用是:提高数据库负载能力,主库执行读写任务(增删改),备库仅做查询。提高系统读写性能、可扩展性和高可用性。数据备份与容灾,备库在异地,主库不存在了,备库可以立即接管,无须恢复时间。用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。可以简单理解为记录的就是sq
|
存储 缓存 运维
【高并发/高可用/哨兵机制/集群模式/高可用与主备切换/主从复制/断点续传】
【高并发/高可用/哨兵机制/集群模式/高可用与主备切换/主从复制/断点续传】
156 0
【高并发/高可用/哨兵机制/集群模式/高可用与主备切换/主从复制/断点续传】
|
SQL 数据采集 算法
Mysql主从同步及主从同步延迟解决方案
Mysql主从同步及主从同步延迟解决方案
447 0
Mysql主从同步及主从同步延迟解决方案
|
消息中间件 关系型数据库 MySQL
数据量激增,导致MySQL主从同步延迟
数据量激增,导致MySQL主从同步延迟
227 0
数据量激增,导致MySQL主从同步延迟
|
SQL 关系型数据库 MySQL
只读实例(slave主从)延迟排查
本文分享的方法适用于实时查看只读延迟(主从延迟),即需要在延迟发生的时候查看才能确认问题,历史延迟不适用,以下环境已经开启并行复制。
只读实例(slave主从)延迟排查