运维.售后
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
博客
Blog
ToB门户
了解全球最新的ToB事件
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
Flink CDC引起的Mysql元数据锁
Flink CDC引起的Mysql元数据锁
自由的羽毛
金牌会员
|
2024-4-18 02:48:14
|
显示全部楼层
|
阅读模式
楼主
主题
931
|
帖子
931
|
积分
2793
记一次Flink CDC引起的Mysql元数据锁事故,总结经验教训。后续在编写Flink CDC任务时,要处理好异常,避免产生长时间的元数据锁。同时出现生产问题时要及时排查,不能抱有侥幸心理。
1、事件经过
某天上午,收到系统的告警信息,告警提示:同步Mysql的某张表数据到Elasticsearch异常,提示连不上Mysql,当时没有太上心,以为可能是偶尔网络异常。
然后立马大量用户开始投诉系统使用有问题,同时听到有同事反馈内部系统数据导不出来。此时我慌了。
立马看了微服务网关、用户中心服务、部分流量比较大的BFF层服务,CPU、内存、磁盘等都是正常的。但是Pod出现了健康检查失败的情况。
于是又赶紧看了日志,出现了大量拿不到Mysql Connection异常。
又赶紧看了Mysql情况,CPU、内存、磁盘都是正常的,但是出现了许多奇怪的慢SQL。
此时我大概猜测到了可能是什么操作锁表了,导致大量Connection无法释放,又赶紧看了Mysql锁的情况,果然发现了大量的元数据锁,高达400多个Connection没释放。
2、处理步骤
既然出现了元数据锁,导致这么多Connection没有释放,那就找出占用时间最长的那个会话kill掉。陆续kill了几个会话后,系统恢复了。
系统恢复后,又去看了慢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';
复制代码
防止事故再次发生,又把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如何工作
在 CDC 过程中,Flink 需要定期读取数据源的变化并进行处理。
需要元数据锁
确保在读取元数据(例如数据库表的结构信息)时,没有其他并发的操作修改了这些元数据,从而保证 Flink 的元数据和实际数据的一致性。
启动MySQL CDC源时,它将执行FLUSH TABLES WITH READ LOCK,获取一个全局读取锁,防止其他会话对这些表进行写操作,从而保证捕获的数据的一致性和准确性。该锁将阻止其他写入操作。
然后,它读取当前binlog位置以及数据库和表的schema。
之后,将释放全局读取锁。然后,它扫描数据库表并从先前记录的位置读取binlog。
如果发生故障,任务将重新启动。
元数据锁原因
因为Flink CDC启动时执行FLUSH TABLES WITH READ LOCK直接上读取锁,由于时间较长,此时有大量的insert、update、delete操作一直处于等待,导致Mysql Connection无法释放。
正好此时,Flink CDC执行同步任务时,又出现了异常,然后任务重启,重启后是上锁,结果出现了恶性循环。导致更多的的insert、update、delete操作处于等待,导致更多的Myql Connection无法释放,直接Connection全部耗尽。
然后所有应用都拿不到Mysql Connection,所以系统彻底不可用了。
至于Nacos为什么会执行DELETE FROM config_info WHERE data_id='com.alibaba.nacos.testMasterDB'呢?查阅资料后发现,Nacos也是从Mysql获取Connection的,当Mysql出现问题时,比如死锁、Connection耗尽、CPU打满时,都会执行这个SQL。
======>>>>>>
关于我
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
自由的羽毛
金牌会员
这个人很懒什么都没写!
楼主热帖
JDBC p2 JDBC API
【MySQL】MySQL的安装、卸载、配置、登 ...
iOS 组件化及二进制化的探索 ...
.MD语法入门,教你写好readme文档 ...
Vue使用ajax(axios)请求后台数据 ...
线程本地存储 ThreadLocal
【python】标准库(第四讲)
go学习笔记(一)
如何使用 journalctl 查看和分析 syste ...
Linux【实操篇】—— Shell函数、Shell ...
标签云
存储
服务器
快速回复
返回顶部
返回列表