Mycat1.5前端idle timeout 分析之路一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhouhao88410234/article/details/80476683

一、Mycat的请求报文分析(分析协议)

 MySQL的协议版本同样的SQL返回的消息格式不一样的



客户端和Mycat的协议版本是不一样的对应返回消息的格式也是有所区别的,Mycat和Navicat是使用version 4

是在握手的时候Capabilities的CLIENT_PROTOCOL_41的使用的是4这样可以固定Mysql返回消息的格式

、Mycat的Idle time out 和sql time out(1.5的版本)

现象:前端发生 Communications link 导致前端卡死等待Mycat 的前端连接超时 在server.xml配置
<property name="idleTimeout">300000</property>
<property name="sqlExecuteTimeout">300</property>
默认sql timeout 的超时时间和前端的是一致的或者比前端是一致的

所以需要把sqlExecuteTimeout 改成280秒

进行日志分析

1.发现如果前端连接使用了批量的inset 或者 update 操作会引发mysql发送多个OK导致包乱掉



2.前端如果开启事务执行多个分片的inset 或者 update 操作在不同分片 在Commit的时候连接是不会回滚的

<property name="handleDistributedTransactions">1</property>
这是原因是Mycat对分布式事务处理有问题
NonBlockingSession类中判断是否是分布式
if (initCount > 1) {
	checkDistriTransaxAndExecute(rrs, 1, autocommit);
} else {
	singleNodeHandler.execute();
}

initcount表示事务中操作了多少分片 会容纳2个不同分片的sql语句就算是分布式事务即使关闭分布式事务的开关

在Commit的时候会判断 NonBlockingSession的 关闭分布式事务开关

 case 1:
//                        rollback();
 source.writeErrMessage(ErrorCode.ER_NOT_ALLOWED_COMMAND, "Distributed transaction is disabled!Please rollback!");
 source.setTxInterrupt("Distributed transaction is disabled!");
 break;

所以前端执行了Commit后端也是不会回滚了seesion一直绑定后端连接,等到sqlExecuteTimeout 超时就断开后端连接

但是前端的idleTimeout一般都是等于sqlExecuteTimeout所以看到的是前端Idle timeout

至于修改的方法已经修改可以咨询我


猜你喜欢

转载自blog.csdn.net/zhouhao88410234/article/details/80476683