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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
关系型数据库 MySQL 数据库
一文剖析MySQL主从复制异常错误代码13114
一文剖析MySQL主从复制异常错误代码13114
1625 0
|
SQL 关系型数据库 MySQL
如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
3469 0
|
SQL 存储 关系型数据库
MySQL主从同步延迟原因与解决方法
MySQL主从同步延迟原因与解决方法
1458 0
|
存储 关系型数据库 MySQL
XtraBackup支持哪些MySQL数据库版本?
【5月更文挑战第13天】XtraBackup支持哪些MySQL数据库版本?
1499 0
|
关系型数据库 数据库 MySQL
|
SQL 存储 容灾
关于主从延迟,一篇文章给你讲明白了!
在实际的生产环境中,由单台MySQL作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面 因此,一般来说都是通过集群主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力进行部署与实施总结MySQL主从集群带来的作用是:提高数据库负载能力,主库执行读写任务(增删改),备库仅做查询。提高系统读写性能、可扩展性和高可用性。数据备份与容灾,备库在异地,主库不存在了,备库可以立即接管,无须恢复时间。用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。可以简单理解为记录的就是sq
2244 0
|
存储 SQL 缓存
一文带你了解MySQL之InnoDB_Buffer_Pool
通过前边的学习我们知道,对于使用InnoDB作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只不过是InnoDB对文件系统上一个或几个实际文件的抽象,也就是说我们的数据说到底还是存储在磁盘上的。但是各位也都知道,磁盘的速度慢的跟乌龟一样,怎么能配得上“快如风,疾如电”的CPU呢?所以InnoDB存储引擎在处理客户端的请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中,也就是说即使我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中。
4666 2
|
关系型数据库 MySQL 数据库
MySQL GTID 主从复制错误修复方法
GTID 复制错误修复方法
9454 0
|
SQL 关系型数据库 MySQL
MySQL并行复制的深入浅出
一、并行复制的背景 首先,为什么会有并行复制这个概念呢?1. DBA都应该知道,MySQL的复制是基于binlog的。 2. MySQL复制包括两部分,IO线程 和 SQL线程。 3. IO线程主要是用于拉取接收Master传递过来的binlog,并将其写入到relay log 4. SQL线程主要负责解析relay log,并应用到slave中 5. 不管怎么说,IO和SQL线程都是单线程的,然后master却是多线程的,所以难免会有延迟,为了解决这个问题,多线程应运而生了。
13787 0
|
SQL 监控 关系型数据库
MySQL主从复制“死掉”!引发Slave库SQL线程异常的一次“血案”追踪
MySQL主从复制“死掉”!引发Slave库SQL线程异常的一次“血案”追踪
2829 0