mycat自动重启解决办法

简介:

mycat自动重启解决办法
前言
mycat是一个非常著名的分库分表中间件,但是很多使用过这个中间件的人都会遇到一个共通的问题,那就是mycat的进程总是会重启,同时重启的时候应用的代码里面也会报出 Java.lang.NullPoint_er_Exception , 今天就来分析一下这个问题,以及解决办法!

原理
这个mycat的重启问题可能一部分人遇到了,一部分人没有遇到过,这是为什么呢?

实际上这段mycat的bug代码是出现在了跨库结果集合并后,释放堆外内存的代码上面
有一部分有经验的人知道分库分表中间件是不太适用于跨库查询的,这些有经验的人会让业务代码去一个一个库查出数据库后,让业务代码自己去做数据合并,排序的逻辑,如果是这样的话就完美避开了这个问题。

比如我用mycat的注解

/#mycat: datanode=dn1/select * from ljj_table

/#mycat: datanode=dn2/select * from ljj_table

这样就强行指定了datanode的节点,就算我sql里面没有分库字段也可以去这个库里面查出数据。然后在业务里面把select出来的结果进行合并

但是对于很多中小型的公司来说,因为经验不足,以及代码的快速迭代,是允许mycat跨库查询的,这就导致了mycat内部需要做排序,这样做的话就有几率触发堆外内存重复释放的bug导致重启。

比如我直接执行

select * from ljj_table
这样的sql,mycat内部就会进行汇聚以及排序,就会导致空指针。

代码REVIEW以及修改方法
这个问题的代码主要问题就是出在了 MultiNodeQueryHandler

这个类上面,在这个类里面,有几个释放资源的类需要做出修改。

在方法 outputMergeResult(这个类里面有2个outputMergeResult,都要改!)

里面,我们需要调整释解锁与释放堆外内存的顺寻

原先是

lock.unlock();

dataMergeSvr.clear();
现在我们需要改成

dataMergeSvr.clear();

lock.unlock();
以及在这个类的clearResources方法里面,我们需要加上锁

原先是

if(dataMergeSvr!=null){

    dataMergeSvr.clear();

}
现在改成

lock.lock();

try{

if(dataMergeSvr!=null){

    dataMergeSvr.clear();

}

}finally{

lock.unlock();

}
这样改完后,我们就保证了dataMergeSvr.clear()这个方法的原子性。

还有在AbstractConnection这个类上面的cleanup方法上面加上sync的锁,这样mycat的重启问题就彻底修复了。

如果不修改源码重新打包?有什么简单的方法可以直接改掉这个类吗?(针对dba和运维)
答案是可以的!我知道很多公司维护mycat的都是dba和运维,这里可以利用mycat自带的wrapper功能(加载外部jar包)来进行直接修复

我把我改完的这2个类的jar(仅针对mycat1.6版本)已经上传到了网盘

链接:https://pan.baidu.com/s/1coay5H-QE7ED26UWuKsL5g
提取码:ygad

把我的这个jar包mycatExtend.jar放到mycat的lib目录下

比如Mycat-server-1.6mycatlib下面

然后在conf文件里面的wrapper.conf这个文件里面设置地址

# Java Classpath (include wrapper.jar)  Add class path elements as
#  needed starting from 1
wrapper.java.classpath.1=lib/mycatExtend.jar
wrapper.java.classpath.2=lib/wrapper.jar
wrapper.java.classpath.3=conf
wrapper.java.classpath.4=%REPO_DIR%
这样就大功告成啦~~~启动mycat!问题修复!!!!!

原文地址https://my.oschina.net/u/3736786/blog/3221601

相关文章
|
6月前
|
关系型数据库 MySQL Linux
linux环境下查看mysql服务状态和重启命令
linux环境下查看mysql服务状态和重启命令
485 0
|
关系型数据库 MySQL 数据库
MySQL “ 服务器无法启动,没有报任何错误 ”的解决方法
MySQL “ 服务器无法启动,没有报任何错误 ”的解决方法
153 0
MySQL “ 服务器无法启动,没有报任何错误 ”的解决方法
|
开发工具
Mycat启动失败解决方案
Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
521 0
Mycat启动失败解决方案
|
SQL 关系型数据库 MySQL
MySQL强制重启失败后无法启动问题解决
本文目录 1. MySQL重启失败 2. 急中生智 3. 神奇的360任务管理器 4. 总结
691 0
MySQL强制重启失败后无法启动问题解决
Mysql5.7异常关机启动报错
早上发现测试环境的机器关机了,手动去机房启动服务器,登录后发现无法启动数据库
555 0
Mysql5.7异常关机启动报错
|
关系型数据库 MySQL 测试技术
MySQL不停地自动重启怎么办
MySQL不停地自动重启怎么办 近期,测试环境出现了一次MySQL数据库不断自动重启的问题,导致的原因是强行kill -9 杀掉数据库进程导致,报错信息如下: 复制代码2019-07-24T01:14:53.
2381 0
|
关系型数据库 MySQL Windows
mysql 1053错误,无法启动的解决方法
mysql 1053错误,无法启动的解决方法 windows2003服务器中,服务器重启后Mysql却没有启动,手动启动服务时提示1053错误。 尝试了以下方法,终于解决。 1.在DOS命令行使用 第一步:mysqld-nt remove mysqlservice 的方式卸载此服务,它提示卸载成功,(是英文成功的意思) 第二步:mysqld-nt install mysqlservice 重新注册服务,一切恢复正常。
4767 0
|
关系型数据库 MySQL 数据库
MySQL无法启动,报1045的解决方法
MySQL无法启动,报1045的解决方法 问题:当我打开 phpstudy时,想测试一下 mysql 是否可以连接成功,出现以下报错:  windows下,以上错误的解决方法,如下: 1. 找到配置文件 my.ini, 将其打开,可用记事本打开 2. 打开后,搜索 mysqld 关键字,找到后,在 mysqld下面添加下面一行代码,并保存退出。
3054 0
|
MySQL 关系型数据库 Linux
Linux启动/停止/重启Mysql数据库的方法
1、查看mysql版本方法一:status;方法二:select version(); 2、Mysql启动、停止、重启常用命令a、启动方式1、使用 service 启动:[root@localhost /]# service mysqld start (5.
8525 0