XXL-JOB (2)---任务重复调度问题排查

背景

  1. 在将xxl-job-admin部署到正式环境后,发现存在重复调度的问题。系统部署在k8s中,共起了3个pods,后端存储为TIDB。
  2. 发现问题后,当即降pods的副本数降到1,可见重复调度问题消除。
  3. 打开xxl-job-admin的日志问题可以看到一直在刷Write conflict xxx等报错日志。

排查过程

 开源项目遇到问题第一步,先上GitHub上搜issue。果不其然被我搜索到一模一样的问题。(ISSUE)。根据issues的描述,这个错误可以与TIDB有关。结合自己使用的存储底层,着手向这方面进行了排查。

 接下来让我们再次回看下xxl-job-admin中竞争调度的代码,从下面的图片中可以看出流程主要分为这么几个部分

  • (1)先通过jdbc获取一个数据库连接。
  • (2)将事务自动commit关掉。
  • (3)通过select for update的方式来锁住一行(排它锁)
  • (4)执行事务逻辑。
  • (5)事务执行完毕手动提交事务。
xxl-job-admin竞争调度核心代码

 通过查询TIDB的相关文档,发现在TIDB版本<= v3.0.8之前使用的乐观事务模型,也就是说不会进行锁等待,只会在事务提交冲突的时候进行报错(Write conflict)。再结合文档中描述,发现有两处可以需要确认的地方

  • (1)使用的TIDB版本<= v3.0.8?不是,我使用的是4.0.6版本。当文档也提这么一句话:只有新创建的集群才会默认使用悲观事务模式,从旧版本升级上来的并不会修改事务类型
  • (2)是否在事务中使用了自动提交?从上面的代码上看,在获取JDBC的时候有显式的关闭的事务提交。


 于是问题就转行成确认我当前使用的TIDB是不是从低版本升级上来的,或者确认当前默认使用的是不是悲观事务模型。经过询问TIDB同事,告诉我当前就是默认悲观事务,但是我不信。

 既然不信,那Talk is cheap. Show me the code,手动写两个main方法来测试下吧!就认准一条准则,已经是悲观事务模式的话,那么tidb执行for update的结果应该跟mysql的一样(锁等待)。假设表kantlin中有(2,1)这行数据,事务执行时序大概如下:

 MySQL的结果是在Tx1和Tx2都可以成功提交, t7时刻, select执行结果为b=22,且但Tx2从t3时刻开始,会被阻塞,一直到t6时刻, Tx1完成提交后, Tx2才能提交,所有在mysql中执行select for update排它锁语句是会等待锁的,没问题。
 但是TiDB中, Tx1提交会失败(WriteConflict),到了t7时刻, select执行结果为b=21,所以证明当前的还是处于乐观事务模式。
 有了这些证据后,再次请TIDB同事确认,TIDB同事经过一番排除后发现确实是从旧版本升级上来的,应该没有改默认的事务类型,并帮我手动的指定事务级别为悲观事务模式。我接着再对系统增加pods副本,发现没有重复调度的问题,日志打印也正常了。

其它思考

使用乐观锁事务模型优缺点是什么?

 TiDB 使用 Percolator 事务模型, 冲突检测只在事务提交时才触发, 而MySQL则是通过锁等待机制(如SELECT … FOR UPDATE)解决冲突问题.TiDB这样设计有好有坏, 在冲突小的情况下,由于没有锁等待,系统的并发性能更好. 但在冲突严重的情况下, 会造成事务失败增多,影响并发性能。

如何使用TIDB?

 作为开发,当前正从mysql向tidb切换过度,总是很直接就认为当mysql来用就可以了,而没有过多的研究。从这次小小的掉坑,也学到不少tidb的知识。作为DBA的同事,他们确实是没有责任帮你升级事务模型,那么就全靠开发把握了,还好是很容易在测试期间就发现的问题,但是想象下如何是在生产发现,并且涉及到跟钱有关的批扣,那问题就大了。生产无小事!

其它的方式实现锁?

 如果你手头上真的只有一个<= v3.0.8版本的TIDB,但是又想多实例部署xxl-job-admin的话,那么其实基于DB实现分布式锁主要有三种,xxl-jobs使用的是排它锁,另外的唯一索引锁或CAS乐观锁也都可以实现的,保险点再弄个监控线程清理长期占用的锁就可以了。

参考文档

TiDB 悲观事务模式

乐观事务模型下写写冲突问题排查

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容