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事务中.

results matching ""

    No results matching ""