这篇文章的起因是因为Cetus,都怪Cetus太流畅了,XA事务也玩的风生水起(以下内容均指两阶段提交In MySQL,详见下文小百科),但无奈XA不给力,自己容易出问题,那怎么办呢?这岂不是阻止了大哥Cetus前进的脚步么!为了不太拖后腿,我们开始对XA动刀了。
刀来了
XA诊断工具,助你延年益寿,消除百病
我们来看看为什么具有这么神奇的功效。众所周知,XA很少只发生在一个节点,因为不需要(如果你非要这么做,别人也阻止不了你),这就会涉及到多个节点的事务一致性问题,所谓事务一致性就是要么事务在所有节点都提交或者都回滚,但节点保不住会有crash的情况发生,此时XA悬挂事务就出现了,或者是已经Prepare了,但没有下文了,后续又需要执行Update修改这些记录,最后发现,锁超时失败了......此时如果你熟悉你的系统,就该有下边的流程,执行 XA Recover后,发现满屏的输出,当时心里还会默念无数遍“这个xx”,XA诊断工具此时此刻你还不出场,等死啊...... 别急,大哥,我来了!!
XA诊断工具
XA诊断工具可以帮助你迅速准确的处理这种问题,让你感到前所未有的顺畅,其实原理很简单,相信看到后边的内容,你也可以自己写一个出来。
原理
简述:连接每一个后端节点(MySQL),寻找XA事务列表,一一记录,并计算出合集(Union ALL),根据Timeout参数,来确定哪些已经悬挂,然后再依次查找所有后端,确定最终状态,并处理不一致的节点,达到一致状态。有兴趣的同学可以自行查看源码,也就几百行,不再赘述。
场景1
如果XA涉及4个后端backend1/backend2/backend3/backend4,其中backend1因某种原因crash了,而另三个已经成功commit,在backend1启动后会出现悬挂事务,经XA诊断一号脉,有了,于是就帮助它commit了。
场景2
如果XA涉及4个后端backend1/backend2/backend3/backend4,其中所有后端的XA都在那眼巴巴的干等着(Prepare状态),但后续一直没给通知,到底是死啊还是活啊,于是一等几年过去了......,经XA诊断一确诊,你们别等了,死心吧,于是制止了这场灾难。
其实大家看过后,也就明白了,这就是一个辅助工具,就是帮助DBA快速处理线上悬挂的XA事务,随着MySQL官网的发布,功能越来越强大,Bug也会越来越少,但线上环境可是不等人的,如果大家在实际中用到了XA事务,建议考虑一下该工具。
效果
实际执行后的效果如下
参考文档
这个工具到底能做什么,聪明的小伙伴早已经知道了
如果找不到,不要紧,请见下图,目前这上边是第一版,使用更简易的第二版会很快同步上来。
小百科
两阶段提交 In MySQL
上图两阶段提交是指,事务先经过PREPARE阶段,也称为第一阶段,数据库收到请求后执行数据修改等等一系列处理,涉及到的节点确认事务都可以正常执行,返回响应信息,如果在该阶段内有任何一个数据库的操作发生了错误,或者事务管理器收不到某个数据库的回应,则认为事务失败,回撤所有数据库的事务。当事务管理收到一致通过的表决后,进入COMMIT阶段,此阶段也称为第二阶段,通知所有节点,可以提交事务了。如果提交的时刻有的节点成功,有的节点失败,就会发生数据不一致。这个时候就需要查看所有节点此事务的最终状态,从而达到事务一致性。
--------------------------------------------------------------------------------------------------------
网易mysql中间件Cetus开源了,想你之所想。
github地址:https://github.com/Lede-Inc/cetus/blob/master/doc/cetus-quick-try.md
快来加stars星星
领取专属 10元无门槛券
私享最新 技术干货