2.5.6 检测疑似残留XA事务
2.5.6.1 介绍&背景
一、介绍Xid
Xid:一个发下至各个节点中的xa事务名称.
Sharding用户登陆的前端连接在开启XA事务(set xa = on)下会分配到一个Xid_Session(简称);
Xid_Session格式: Dble_Server.{instanceName}.{xaIDInc}
其中instanceName
为dble的实例命名, xaIDInc
全局自增id.
在路由准备下发至节点阶段中, 会在Xid_Session之后拼接具体db
(物理库名)获取最终的Xid, 用来下发至各个节点;
Xid格式: Dble_Server.{instanceName}.{xaIDInc}.{db}
xaIDInc
起始值的定义: 在dble启动时,xaIDInc起始值为1(默认情况); 但如果存在xaRecovery日志且其中有存留上次Xid记录场景下, xaIDInc初始值则为上次Xid中xaIDInc值+1.
注意:xaRecovery日志: {xaRecoveryLogBaseDir}/{XaRecoveryLogBaseName}.log, 默认为xalogs/xalog-1.log
二、背景
节点层面存留dble生成的Xid; 在xaRecovery日志清理的情况下启动dble, 意味着xaIDInc从1开始增长; 当增长到残留Xid中xaIDInc时, 会出现'The XID alread exists'报错; 此功能无需额外配置,可以在dble启动阶段、运行阶段将疑似残留XA事务问题很好的暴露出来.
2.5.6.2 检测机制
检测对象:被Sharding表关联dbGroup中的主节点
疑似残留Xid的格式: 符合Xid_Session或者Xid的格式
疑似残留Xid的正则表达式: Dble_Server.{instanceName}.(\d)(.[^\s]+)?
疑似残留Xid的日志关键字: Suspected residual xa transaction.....
一、启动阶段
只要满足疑似残留Xid的正则表达式, 则被视为疑似残留Xid, 直接启动失败;
二、运行阶段
满足疑似残留Xid的正则表达式且节点中的xaIDInc小于dble内部(正在使用)xaIDInc, 则被视为疑似残留Xid.
设置检测周期
默认每隔300s的定时检测任务,见bootstrap.cnf中-DxaIdCheckPeriod=300
管理端命令:
reload @@xaIdCheck.period=60; -- 表示开启(或者调整)以60s为周期的定时检测任务
reload @@xaIdCheck.period=0; -- 值小于等于0时,表示关闭定时检测任务
日志中关键字:Start XaIdCheckPeriod、Stop XaIdCheckPeriod
2.5.6.3 其他检测
一、查看所有节点下的xa情况
管理端, 查询dble_xa_recover表查看所有存活的主节点下XA情况.
二、查看dble中正在使用的Xid
管理端, 查询session_connections表(或show @@connection)的结果中xa_id字段, xa_id值为Xid_Session格式表示处于XA事务中.