记一次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

Flink CDC引起的Mysql元数据锁的更多相关文章

  1. 一步步搞懂MySQL元数据锁(MDL)

    某日,路上收到用户咨询,为了清除空间,想删除某200多G大表数据,且已经确认此表不再有业务访问,于是执行了一条命令'delete from bigtable',但好长时间也没删完,经过咨询后,获知dr ...

  2. 深入理解MYSQL的MDL元数据锁

    1 前言 2 MDL锁与实现 3 MDL锁的性能与并发改进 4 MDL锁的诊断 前言 好久没更新,主要是因为Inside君最近沉迷于一部动画片——<新葫芦娃兄弟>.终于抽得闲,完成了本篇关 ...

  3. Mysql元数据分析

    Mysql元数据分析 @(基础技术) 一.information_schema库 information_schema库中的表,保存的是Mysql的元数据. 官网元数据表介绍 InnoDB相关的表介绍 ...

  4. MySQL:锁

    根据加锁的范围,MySQL的锁可以分为全局锁,表级锁和行锁. 1. 全局锁 一般用于全局逻辑备份操作: 1.1 FTWRL MySQL提供了一个加全局读锁的方法.命令是:Flush tables wi ...

  5. MySQL 全局锁、表锁以及行锁

    1. 系统版本 MySQL 5.7.25 ubuntu 16.04 2. 全局锁 全局锁即对整个数据库实例加锁,使得整个库处于只读状态,会阻塞DML和DDL语句.使用如下命令(简称FTWRL)可为数据 ...

  6. SQLSERVER中的元数据锁

    SQLSERVER中的元数据锁 网上对于元数据锁的资料真的非常少 元数据锁一般会出现在DDL语句里 下面列出数据库引擎可以锁定的资源 资源 说明 RID 用于锁定堆(heap)中的某一行 KEY 用于 ...

  7. 修改字段字符集 mysql 修改 锁表 show processlist; 查看进程 Waiting for table metadata lock

    ALTER TABLE `question` MODIFY COLUMN `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unico ...

  8. MDL--元数据锁的锁请求与锁等待+元数据锁类对象

    1 元数据锁的锁请求与锁等待     元数据锁在MySQL Server层,依照锁的状态被细分为两种.一种是已经施加的锁.一种是等待施加的锁即锁请求,这样被区分的原因,如MySQL对"cla ...

  9. 深入理解MDL元数据锁

    前言:  当你在MySQL中执行一条SQL时,语句并没有在你预期的时间内执行完成,这时候我们通常会登陆到MySQL数据库上查看是不是出了什么问题,通常会使用的一个命令就是 show processli ...

  10. MySQL 全局锁和表锁

    根据加锁的范围,MySQL 里面的锁大致可以分成全局锁,表级锁,行锁. 行锁已经在前面几篇文章说过 1. 全局锁 全局锁就是对整个数据库实例加锁.MySQL 提供了一个加全局读锁的方法,命令是Flus ...

随机推荐

  1. Codeforce:1300B. Assigning to Classes (math)

    解题思路 题目说的意思是,给一个2n个数的数组,注意n为奇数,将这个数组平均分为2份,假设为c1和c2. c1和c2是奇数个元素的数组,比如数组[1,2,3],那么中位数就是2. 那么如何求得中位数差 ...

  2. [网络克隆]利用tiny proxy实现局域网内批量安装WINDOWS操作系统。

    说明:本文支持UEFI及BIOS系统克隆.支持UEFI及BIOS网络引导,适用于新旧几乎所有支持网络启动的电脑. 事前准备: 保证被克隆的电脑为同一配置,或者各硬件差异不大,比如CPU同如英特尔8代的 ...

  3. 2023陕西省大学生信息安全竞赛web writeup

    前言 早写好了,忘发了,题目质量还行,够我坐大牢 ezpop 简单的反序列化,exp如下 <?php class night { public $night; } class day { pub ...

  4. 成都站|阿里云 Serverless 技术实战营邀你来玩!

    活动简介 "Serverless 技术实战与创新沙龙 " 是一场以 Serverless 为主题的开发者活动,活动受众以关注Serverless 技术的开发者.企业决策人.云原生领 ...

  5. poi4版本处理word里表格中的文字换行问题和设置字体样式

    开发中遇到生成word文档的需求,其中里面存在表格,发现表格中一旦存在换行生成的模板就出现各种问题,反正就是出不来想要的结果.网上找了一些方法基本都不好用,最后找到一个靠谱点的方法 XWPFParag ...

  6. 解决pyintstaller 打包后程序报错 api-ms-win-core-path-l1-1-0.dll文件

    一.错误现象 1.api-ms-win-core-path-l1-1-0.dll错误日志如下: 2.重新打包查看有如下的警告信息: 二.解决方案: 1.网上下载:api-ms-win-core-pat ...

  7. zookeeper 节点介绍及节点常用命令总结

    本文为博主原创,未经允许不得转载: 目录: 1. znode 节点特性 2. zookeeper 的四种节点类型及适用场景分析 3. zookeeper 客户端常用操作命令 4. znode 数据增删 ...

  8. AI毕业设计生成器(基于AI大模型技术开发)

    这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码.它基于几百个github上面开源的java和python项目,运用tengsorflow技术,训练出了AI大模型.基本实现了计算机毕业 ...

  9. [转帖]终于!SOFATracer 完成了它的链路可视化之旅

    https://my.oschina.net/sofastack/blog/5283439 ▼ 背 景 有幸参与开源软件供应链点亮计划--暑期 2021 支持的开源项目,目前 SOFATracer 已 ...

  10. [转帖]Jmeter中如何读取MYSQL数据作为请求参数

    在项目测试过程中,我经常需要将数据库中的数据作为参数传递到请求中.Jmeter中MYSQL数据库连接操作过程如下: 1.下载/n导入mysql的jdbc驱动包 下载mysql驱动包地址: http:/ ...