数据库发生死锁 xxl-job任务不自动执行

发现问题

业务同学反馈配置的xxl任务在18点45分之后就没有自动执行了,导致业务付款结果更新不及时
控制台手动执行任务是可以的在这里插入图片描述

XXL 原理

执行器注册和发现

  • xxl_job_registry:执行器的实例表,保存实例信息和心跳信息
  • xxl_job_group:每个服务注册的实例列表

执行器启动线程每隔30秒向注册表xxl_job_registry请求一次,更新执行器的心跳信息,调度中心启动线程每隔30秒检测一次xxl_job_registry,将超过90秒还没有收到心跳的实例信息从xxl_job_registry删除,并更新xxl_job_group服务的实例列表信息。

调度原理

调度器循环不停的:

  1. 关闭事务的自动提交
  2. 利用mysql悲观锁作为分布式锁,其他事务无法进入
select * from xxl_job_lock where lock_name = 'schedule_lock' for update
  1. 读取数据库中的任务信息
  2. 根据任务的调度时机,

排查思路

根据xxl的原理和业务反馈的问题,很容易想到可能出问题的点

  • 执行器注册问题:执行器是否注册
  • 任务状态问题:业务反馈的任务状态
  • 调度器问题:其他任务是否正常调度
    经过对基本的问题快速排查,发现了问题是出现在调度上

排查

查看日志,发现执行 select * from xxl_job_lock where lock_name = 'schedule_lock' for update时报错,事务等待超时

排查数据库事务等待情况

SELECT 
    r.trx_id waiting_trx_id,
    r.trx_mysql_thread_id waiting_thread,
    r.trx_query waiting_query,
    b.trx_id blocking_trx_id,
    b.trx_mysql_thread_id blocking_thread,
    b.trx_query blocking_query
FROM
    information_schema.innodb_lock_waits w
        INNER JOIN information_schema.innodb_trx b ON
            b.trx_id = w.blocking_trx_id
        INNER JOIN information_schema.innodb_trx r ON
            r.trx_id = w.requesting_trx_id;

发现schedule_lock表,正在被另一个线程锁定
在这里插入图片描述
再执行show processlist,查到了该连接的客户端地址,并且发现该客户端的连接已经存在了14778秒,约等于4个小时,和事故持续时间一致
在这里插入图片描述

排查异常连接客户端

  • 一方面联系dba将该客户端的连接全部kill
  • 一方面联系运维排查这个ip的来源
恢复

dba将该客户端的连接全部kill后,xxl调度恢复

排查异常连接来源

经过排查,该异常连接属于18:45分挂掉的pod,有一台k8s的worker有问题,节点被k8s驱逐,但实际物理机还在运行,停不掉应用,当前发现物理机节点磁盘有问题,还在排查中。

思考一下

  • xxl利用mysql悲观锁作为分布式锁,优缺点是什么呢
    优点:简单
    缺点:事务超时 & 续期 需要优化
  • 事务超时,告警需要优化
  • 任务执行状态异常监控告警
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在使用JMeter进行数据库压力测试时,有时会遇到死锁的情况。死锁是指两个或多个事务相互等待对方释放资源,导致无法继续执行的情况。然而,并不是所有的死锁都是由于数据问题引起的,有时候是数据库自身的保护机制导致的。 在进行数据库压力测试时,可以采取一些方法来解决死锁问题。首先,可以通过调整并发数和压测时间来减少死锁发生。降低并发数可以减少事务之间的竞争,从而减少死锁的可能性。此外,合理设置压测时间,避免长时间的高并发操作。 另外,对于表字段和表结构,也需要进行适当的优化。可以通过索引的使用、合理的表设计和查询优化等方式来提高数据库的性能,减少死锁发生。 总之,使用JMeter进行数据库压力测试是比较方便和常用的方法。在测试过程中,需要根据业务模型对JMeter脚本进行调整,考虑并发数、压测时间、表字段、表结构以及数据库本身性能相关参数。同时,需要注意死锁的可能性,并采取相应的措施来解决死锁问题。\[1\] #### 引用[.reference_title] - *1* *2* *3* [【性能测试】jmeter数据库性能测试](https://blog.csdn.net/test_dog/article/details/127933667)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lanicc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值