首页 > 数据库 >Flink CDC引起的Mysql元数据锁

Flink CDC引起的Mysql元数据锁

时间:2024-02-01 11:34:30浏览次数:31  
标签:CDC Flink Nacos Connection Mysql 数据

记一次Flink CDC引起的Mysql元数据锁事故,总结经验教训。后续在编写Flink CDC任务时,要处理好异常,避免产生长时间的元数据锁。同时出现生产问题时要及时排查,不能抱有侥幸心理。

1、事件经过

  1. 某天上午,收到系统的告警信息,告警提示:同步Mysql的某张表数据到Elasticsearch异常,提示连不上Mysql,当时没有太上心,以为可能是偶尔网络异常。

  2. 然后立马大量用户开始投诉系统使用有问题,同时听到有同事反馈内部系统数据导不出来。此时我慌了。

  3. 立马看了微服务网关、用户中心服务、部分流量比较大的BFF层服务,CPU、内存、磁盘等都是正常的。但是Pod出现了健康检查失败的情况。

  4. 于是又赶紧看了日志,出现了大量拿不到Mysql Connection异常。

  5. 又赶紧看了Mysql情况,CPU、内存、磁盘都是正常的,但是出现了许多奇怪的慢SQL。

  6. 此时我大概猜测到了可能是什么操作锁表了,导致大量Connection无法释放,又赶紧看了Mysql锁的情况,果然发现了大量的元数据锁,高达400多个Connection没释放。

2、处理步骤

  1. 既然出现了元数据锁,导致这么多Connection没有释放,那就找出占用时间最长的那个会话kill掉。陆续kill了几个会话后,系统恢复了。
  2. 系统恢复后,又去看了慢SQL,发现主要有两块高频慢SQL,一块是Flink相关的,另一块是Nacos相关的。后来经过分析:元数据锁是因为Flink CDC执行FLUSH TABLES WITH READ LOCK导致的,跟Nacos无关,Nacos只是个烟雾弹。
# Flink相关的:
SHOW CREATE TABLE `xxx_db`.`xxx_table`;
FLUSH TABLES WITH READ LOCK;

# Nacos相关的:
DELETE FROM config_info WHERE data_id='com.alibaba.nacos.testMasterDB';
  1. 防止事故再次发生,又把Flink CDC任务里的SQL方式换成了API方式。Flink CDC使用SQL方式时,会产生大量任务,占用更多的资源,也容易出现任务异常。

3、原因分析

3.1、元数据锁

  • 以上关于锁的截图,可以看到是元数据锁引发的Connection被耗尽,那什么是元数据锁:
    • 元数据锁(Meta Data Lock,MDL),用于锁定数据库对象的元数据,例如:表、索引、视图等的结构信息。通常用于保证并发的数据定义语言(DDL)操作的一致性,防止在修改表结构的过程中出现并发问题。
    • 其作用是用于解决DDL操作与DML操作的一致性;通常,DDL操作需要获取MDL写锁,并且MDL锁一旦发生,就可能会对数据库的性能影响,因为后续对该表的任何Select、DML、DDL操作都会被阻塞,造成Connection积压。
  • 为什么要有元数据锁:
    • 主要为了保证元数据的一致性,用于处理不同线程操作同一数据对象的同步与互斥问题。比如需要事务隔离场景、主从同步场景。
  • 元数据锁和Innodb锁的区别:
    • 元数据锁主要关注数据库对象的元信息,而InnoDB锁主要关注数据的一致性和隔离性。
    • MDL锁还能实现其他粒度级别的锁,比如:全局锁、库级别的锁、表空间级别的锁。这是InnoDB存储引擎不能直接实现的。
  • 锁表的原理是数据库使用独占式锁机制。锁表发生在 insert、update、delete中。比如:A程序执行了对table_1的insert、update、delete,并还未commit时,B程序也对table_1进行insert、update、delete时会发生资锁表。

3.2、Flink CDC为什么引起元数据锁事故

笔者使用Flink场景是,利用Flink CDC同步数据,然后做汇总统计。

MySQL CDC如何工作

  1. 在 CDC 过程中,Flink 需要定期读取数据源的变化并进行处理。需要元数据锁 确保在读取元数据(例如数据库表的结构信息)时,没有其他并发的操作修改了这些元数据,从而保证 Flink 的元数据和实际数据的一致性。
  2. 启动MySQL CDC源时,它将执行FLUSH TABLES WITH READ LOCK,获取一个全局读取锁,防止其他会话对这些表进行写操作,从而保证捕获的数据的一致性和准确性。该锁将阻止其他写入操作。
  3. 然后,它读取当前binlog位置以及数据库和表的schema。
  4. 之后,将释放全局读取锁。然后,它扫描数据库表并从先前记录的位置读取binlog。
  5. 如果发生故障,任务将重新启动。

元数据锁原因

  1. 因为Flink CDC启动时执行FLUSH TABLES WITH READ LOCK直接上读取锁,由于时间较长,此时有大量的insert、update、delete操作一直处于等待,导致Mysql Connection无法释放。
  2. 正好此时,Flink CDC执行同步任务时,又出现了异常,然后任务重启,重启后是上锁,结果出现了恶性循环。导致更多的的insert、update、delete操作处于等待,导致更多的Myql Connection无法释放,直接Connection全部耗尽。
  3. 然后所有应用都拿不到Mysql Connection,所以系统彻底不可用了。
  4. 至于Nacos为什么会执行DELETE FROM config_info WHERE data_id='com.alibaba.nacos.testMasterDB'呢?查阅资料后发现,Nacos也是从Mysql获取Connection的,当Mysql出现问题时,比如死锁、Connection耗尽、CPU打满时,都会执行这个SQL。

======>>>>>> 关于我 <<<<<<======

本篇完结!欢迎点赞 关注 收藏!!!

原文链接:https://mp.weixin.qq.com/s/36lqDS6Xli49LKyZQ56CcA

标签:CDC,Flink,Nacos,Connection,Mysql,数据
From: https://www.cnblogs.com/mangod/p/18000846

相关文章

  • 虹科分享 | Redis与MySQL协同升级企业缓存
    传统的MySQL数据库在处理大规模应用时已经到了瓶颈,RedisEnterprise怎样助力突破这一瓶颈?RedisEnterprise与MYSQL共同用作企业级缓存或副本数据库,会产生什么样的火花?二者联合的解决方案,如何加速应用程序,提升效率,实现可拓展性?使用RedisEnterprise与MYSQL共同用作企业级缓存或副......
  • java直连mysql操作数据
    连接器importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;/***@author:chenKeFeng*@date:2024/1/3010:21*/publicclassMySQLConnector{p......
  • 面试官:Mysql千万级大表如何进行深度分页优化?
    背景假如有一张千万级的订单表,这张表没有采用分区分表,也没有使用ES等技术,分页查询进行到一定深度分页之后(比如1000万行后)查询比较缓慢,我们该如何进行优化?数据准备订单表结构如下:CREATETABLE`t_order`(`id`BIGINT(20)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT......
  • Hive数据线下导入Mysql
    1.背景     最近在处理一个数据量级在1亿左右的数据,没办法mysql不好处理,只能把数据放到大数据集群进行处理,处理好后再把这亿级数据导入本地Mysql。2.实践(1)把需要处理的数据手动传到集群,上传的数据只有一万条左右,经过笛卡尔积以及各种运算后,结果数据条数有一亿左右,文件大小......
  • Flink之状态编程 值状态(ValueState)列表状态(ListState)映射状态(MapState)归约状态(Reducin
    Flink之状态编程值状态(ValueState)列表状态(ListState)映射状态(MapState)归约状态(ReducingState)聚合状态(AggregatingState)广播状态(BroadcastState)Flink之状态编程一、按键分区状态(KeyedState)1.1、值状态(ValueState)1.1.1、定义1.1.2、使用案例1.2、列表状态(ListState)1.2.1......
  • MySQL 期末总结
    MYSQL一、对表结构进行操作1.主键1)添加主键--1.主键/* 方式一:创建表的时候在字段后面+primarykey 方式二:写完字段之后在指定主键,创建标的字段下面 [constraint<约束名>]primarykey*/usemydb1;createtableemp1( eidint, enamevarchar(20), d......
  • java flink(二十六) 实战之电商黑名单过滤 Flink CEP编程实现、什么是CEP、CEP组合模式d
    javaflink(二十六)实战之电商黑名单过滤FlinkCEP编程实现、什么是CEP、CEP组合模式demo、CEP循环模式demo什么是CEP:1、复杂事件处理2、Flink中实现复杂事件处理库3、CEP允许在无休止的事件中检测事件模式,让我们有机会掌握数据中的重要部分4、一个或多个由简单事件构成的事......
  • flink定时器使用问题
    flink定时器使用问题        flink定时器的使用,需要涉及flinktime、watermark、keyStream、keyState等概述,尽管关于flinktime和watermark的文章烂大街,但还是有必要先简单介绍一下,有助于解释下面flink定时器使用遇到的问题。时间模型        flink在stream......
  • flink状态编程
    flink状态编程简单记录一下最近工作中常用的flink状态flink中可以创建不同类型的状态,如键控状态(KeyedState)和操作符状态(OperatorState)等。状态管理是在流处理的整个过程中保持状态的一种能力,它让我们能够在复杂的事件处理和流转换中保留重要的状态信息,例如:聚合结果、过滤条件......
  • seatunnel-2.3.3测试excel入库mysql
    1.背景客户需要excel导入功能,同时支持导入多种数据源,尝试用seatunnel数据集成工具来实现。2.步骤2.1配置文件./config/v2.excel2mysql.configenv{#YoucansetSeaTunnelenvironmentconfigurationhereexecution.parallelism=1job.mode="BATCH"}source......