MYSQL vs JAVA 连接错误

MYSQL vs JAVA 连接错误

最近开发告诉我,他们在测试系统的时候,会经常有连接MYSQL的连接被踢掉。具体给我的解释是,JAVA的缓冲池连接MYSQL 保持连接,但再次使用的时候,报连接错误。

MYSQL vs JAVA 连接错误

对应应用程序的报错的时间点,查了一下 PROXYSQL  和 MYSQL 的错误日志,的确是有相关的错误。

PROXYSQL 错误日志

MYSQL vs JAVA 连接错误

MYSQL 的错误日志

MYSQL vs JAVA 连接错误

那么问题来了,到底为什么会 got timeout reading communication packets。

DBER可以冠冕堂皇的告知,这是JAVA 的问题,不是数据库的问题,但是如果作为 Architector of Databases,这样的回答的确是遭恨。

所以必须搞清楚到底是怎么回事,故事就开始了。首先JAVA 程序是有缓冲池来连接到 MYSQL 的 ProxySQL 的,而ProxySQL 作为MYSQL 的中间件和缓冲,会将JAVA的连接转接到 MYSQL (MGR  MTS)的主节点。

分析问题的一步步来,我们先从MYSQL 这个根上来

MYSQL vs JAVA 连接错误

从MYSQL 的角度来说,产生 Aborted_clients 和 Aborted_connects 有三个原因。

1  客户端的连接,在MYSQL中被意外的终止了,至于这个意外是什么,有可能是当前的连接被DBA 使用KILL 终止了,或者其他的PT-KILL工具之类的方式,让你的连接停掉了。

2 MYSQL 中的两个参数, wait_timeout 和 interactive_timeout ,wait_timeout 是如果连接处于 idle的状态多长时间,这个连接就会被踢掉。wait_timeout 和 interactive_timeout

wait_timeout 是你的连接的idle(空闲的时间),超过多少时间就被系统KILL 掉

interactive_timeout 是在程序和数据库交互中,的间隔时间,如果你间隔时间较长,让数据库等的不耐烦了,就给你清理掉你的连接的线程。

程序员可能会问,WHY, 这主要是每个连接都会HOLD住一定的内存,例如 sort buffer join buffer 之类的,如果这些BUFFER 初始的时候就给的挺大,那后面如果连接太多,系统就可能OOM, 所以系统必须管管那些不负责的连接,光知道开,不知道关。

那如何来确认你现在的MYSQL 的连接数,这里设置都是 1800秒,也就是30分钟。

MYSQL vs JAVA 连接错误

MYSQL vs JAVA 连接错误

说完这里,继续说PROXYSQL, 作为目前最好的开源的MYSQL 的中间件,用的人不少。

其实proxysql 也是有线程池的,我目前的PROXYSQL 就有一个主34个子线程组成。

MYSQL vs JAVA 连接错误

而proxysql 中的连接池也是保存空闲连接的,而多长时间PROXYSQL 会进行一个ping 保持与MYSQL之间的连接,的时间是通过 mysql-ping_interval_server_msec 来进行。

MYSQL vs JAVA 连接错误

而mysql-connection_max_age_ms 是当空连接在没有任何会话使用的情况下,空闲的时间超过了 mysql-connection_max_age_ms 的设置后PROXYSQL 会自动关闭这个连接。

MYSQL vs JAVA 连接错误

mysql-ping_timeout_server 则是PROXYSQL 为了维持和后端的空闲连接,每隔一段时间来发送PING 一次得到回复超时的时间

MYSQL vs JAVA 连接错误

写到这里,估计能送网上BAIDU到很多,关于这样的问题,而解决这样问题的方法,大部分是修改MYSQL的 两个timeout 的时间,默认为28800秒也就是 8个小时,他们建议将时间改为 31536000 秒,好吧我不打人,这样的程序员每月能赚2000块在北京都是多给。

最后我这个非JAVA Developer GOOGLE 出的解决方案是

在配置Druid DatasourceStat 

1 需要配置

validationQuery: select 1  (这样的语句去访问数据库避免引起性能的消耗)

testWhileIdle: true

timeBetweenEvictionRunsMillis: 的设置一定要小于 mysql 或者 proxysql 的 timeout 值

我这里 timeBetweenEvictionRunMills 的值应该是小于 3分钟。

到此 解决Communications link failure 的问题,告知段落,到目前为止还没有新的错误告诉我,阿弥陀佛。