当前位置: 首页 > 知识库问答 >
问题:

生产中rds的Mysql debezium连接器导致死锁

汪安然
2023-03-14

我们正在创建一条从RDS中的Mysql到弹性搜索的数据管道,用于创建搜索索引,并为此使用debezium cdc及其Mysql源和弹性接收器连接器。

现在,由于mysql在rds中,我们必须为我们想要cdc的两个表授予mysql用户锁表权限,如文档中所述。

我们还有其他各种mysql用户执行事务,这可能需要这两个表中的任何一个。

当我们将mysql连接器连接到我们的生产数据库时,就产生了一个锁,我们的整个系统都崩溃了。意识到这一点后,我们很快停止了Kafka,并移除了连接器,但是锁仍然在增加,只有在我们停止所有新的查询,停止生产代码运行并手动终止进程之后,锁才得以解决。

这种情况的潜在原因是什么,我们如何预防这种情况?

共有3个答案

罗业
2023-03-14

使用副本来防止执行lock table语句,为什么debezium需要lock table?所有CDC工具都从bin日志中获取事件。

郎正平
2023-03-14

如果锁定是一个问题,并且您无法在锁定与一致性之间进行权衡,那么请查看快照。锁定。模式config选项。

司立果
2023-03-14

我只是猜测,因为我不知道你的查询流量。我假设您看到的锁增加是等待表锁释放的积压查询。

我的意思是下面的顺序是我相信发生的:

>

  • Debezium会在你的两张桌子上启动桌子锁
  • 该应用程序仍在工作,并且正在尝试执行访问这些锁定表的查询。查询开始等待释放锁。他们最多会等待1年(这是默认的lock\u wait\u timeout值)
  • 当你花上几分钟试图找出你的网站没有响应的原因时,大量被阻止的查询就会累积起来。可能多达最大连接数。在所有允许的连接都充满了阻塞的查询之后,应用程序根本无法连接到MySQL
  • 最后,停止尝试读取数据初始快照的Debezium进程。它释放了表锁
  • 当表锁被释放时,等待的查询可以立即继续。

    • 但是,如果它们是INSERT/UPDATE/DELETE/REPLACE,或者如果它们是SELECT... FOR UPDATE或其他锁定语句,它们中的许多确实也需要获取锁。
    • 因为有这么多查询排队,所以它们更有可能请求重叠的锁,这意味着它们必须等待彼此完成并释放锁。
    • 另外,因为有数百个查询同时执行,它们对CPU等系统资源造成了过大的负担,导致系统html" target="_blank">负载过高,这也使它们都变慢了。因此,查询完成需要更长时间,因此如果它们相互阻塞,它们必须等待更长时间。

    与此同时,应用程序仍在尝试接受请求,因此正在添加更多要执行的查询。他们还面临排队和资源枯竭的问题。

    最终你会停止应用程序,这至少允许等待的查询队列逐渐完成。随着系统负载的下降,MySQL能够更有效地处理查询,并很快完成所有查询。

    另一个答案建议在Debezium快照中使用读取副本,这是一个很好的建议。如果您的应用程序可以从主MySQL实例读取一段时间,那么当Debezium锁定副本时,副本上的任何查询都不会被阻止。最终Debezium将完成读取所有数据,释放锁,然后继续只读取数据库日志。然后应用程序可以继续使用副本作为读取实例。

    如果您的binlog使用GTID,那么您应该能够让Debezium之类的CDC工具从副本读取快照,然后在完成后,切换到master读取binlog。但是如果你不使用GTID,那就有点棘手了。该工具必须知道与副本上的快照相对应的主服务器上的binlog位置。

  •  类似资料:
    • 本周早些时候,我在这里获得了一些关于Stackoverflow的帮助,这导致了一个生产者/消费者模式的发展,用于加载处理并将大型数据集导入RavenDb。CPU受限任务的并行化与IO受限任务的并行化 我现在希望限制生产商提前准备的工作单元的数量,以管理内存消耗。我已经使用一个基本信号量实现了节流,但在某个点上实现死锁时遇到了问题。 我无法找出导致死锁的原因。以下是代码摘录: 这是对LoadData

    • 我在运行以下代码时遇到了一个奇怪的问题: 首先,代码是用OpenJDK-11和OpenJFX-11编译的,在Windows中运行良好(即退出call)。 然而,如果我在Linux(特别是Ubuntu20.04)上运行这个程序,调用会锁定线程,程序永远不会退出。注释出调用将使其重新正常工作。 我只是在(这是SystemLookAndFeel返回的结果)或者我在这里做了什么错误/意外的事情?

    • 我在尝试部署Java应用程序时遇到了一个问题。 或者 在pom中。xml我有一个: 在tomcat用户中。xml我有一个: 同样在Maven/conf/settings中。xml我有: 当我想去 输入用户名和密码(admin)我有错误: 但我输入了tomcat用户。xml该用户管理员具有manager gui角色。我用的是Tomcat 7.0.56和Jenkins。还可以使用命令:clean和to

    • 我正在为此苦苦挣扎 - 我已经阅读了很多关于它的内容,但我仍然看不到我哪里出了问题。 我已经安装了MySQLWorkBench,连接到我的RDS的测试失败了。我已经在端口3306上测试了使用telnet到我的endpoint,它们也无法连接。 我已经在 Amazon VPC 中创建了经典的公有/私有子网,其中包括一个 DBServerSG 安全组,该安全组当前设置为允许所有入站流量并允许所有出站流

    • seata版本:1.4.0,但1.4以下的所有版本也都有这个问题 问题描述:在一个全局事务中,一个分支事务上的纯查询操作突然卡住了,没有任何反馈(日志/异常),直到消费端RPC超时 问题排查 整个流程在一个全局事务中,消费者和提供者可以看成是全局事务中的两个分支事务,消费者 --> 提供者 消费者先执行本地的一些逻辑,然后向提供者发送RPC请求,确定消费者发出了请求已经并且提供者接到了请求 提供者

    • 响应:{“errormessage”:“2018-06-06t11:28:53.775z任务在3.00秒后超时”} 我该如何解决这个问题??