微服务架构下,MySQL读写分离后,Druid连接池参数优化实战

数据库 MySQL 架构
最近利用MHA做好Mysql读写分离后,时不时有用户反馈后台发布文章时,报程序“通用异常",经问题排查,里面涉及应用JDBC连接池参数及Mysql参数调整问题。

 前言

最近利用MHA做好Mysql读写分离后,时不时有用户反馈后台发布文章时,报程序“通用异常",经问题排查,里面涉及应用JDBC连接池参数及Mysql参数调整问题。

[[277851]]

问题回顾

异常日志描述:

微服务架构下,Mysql读写分离后,Druid连接池参数优化实战

从异常信息反映来看,问题关键有两点

  1. 数据库连接池超时设置大于wait_timeout
  2. 日志提示,可以通过验证数据库连接或者设置:autoReconnect=true 来避免此异常

从以上两点可以推测

第一、应用程序数据库连接池超时参数设置有问题

第二、安装Mysql数据库时,对于Mysql的内在参数wait_timeout没有做实际场景的优化处理

问题定位

wait_timeout参数具体用途

wait_timeout具体含义是服务器关闭非交互连接之前等待活动秒数。MySQL缺省配置情况下,wait_timeout的初始值是28800秒,也就是8小时。如果wait_timeout超时时间设置过大,在MySQL管理系统里会产生大量的SLEEP进程无法及时释放,会导致服务器系统性能下降;同时该参数设置过小,会导致Mysql处理某些事务未处理,连接不可用状态。

也就是说如果在wait_timeout设置期间内,数据库连接Connection一直处于空闲等待状态,mysql内部会自动关闭此连接,而应用程序无法感知到,依然认为连接池合法持有该连接。当应用端再次用该连接来进行数据库操作时,就产生上述异常错误。

应用端Druid数据库连接池参数排查

微服务架构下,Mysql读写分离后,Druid连接池参数优化实战

发现连接池有个MaxWait参数设置过大:60000毫秒

  1. druidDataSource.setMaxWait(60000) 

然后在CSDN上,发现有个同行碰到同样的问题:

发现数据库等待超时时间(wait_timeout)是28800s,也就是8小时,而应用程连接池参数max-wait: 30000,所以导致项目判定该链接可用,而mysql判定该连接不可用导致连接失败。

解决办法

根据上面的分析思路,我们排查了Mysql生产库,发现默认Mysql超时时间(wait_timeout)也是28800s,但是应用层连接池MaxWait参数设置成60000,于是我把MaxWait参数设置成10000,小于Mysql超时时间(wait_timeout):28800 ,在测试环境等待8小时后,报错消失了。

其他扩展思路(来源网络)

思路一:在jdbc-url后添加 &autoReconnect=true,使用后无效,查的该方案只适用于Mysql4之前的版本有效

思路二:将mysql回收空闲连接的时间变长,mysql默认回收时间是8小时,可以在mysql目录下的my.ini中增加下面配置,将时间改为1天。单位是秒,最大好像是24天。 此配置会拖累数据库性能,随弃用该方案。

思路三:配置druid链接池,使用 validation-query test-on-borrow: true test-while-idle: true 三种属性,每次获取数据库连接时判断该连接是否可用。同时设置druidDataSource.setPhyTimeoutMillis参数

连接最大存活时间,默认是-1(不限制物理连接时间),从创建连接开始计算,如果超过该时间,则会被清理druidDataSource.setPhyTimeoutMillis(15000);

参考例子

目前项目中趋于稳定的连接池参数优化实战,参考如下:

微服务架构下,Mysql读写分离后,Druid连接池参数优化实战

Druid连接池参数官方说明:

微服务架构下,Mysql读写分离后,Druid连接池参数优化实战

 

责任编辑:华轩 来源: 今日头条
相关推荐

2021-03-24 09:06:01

MySQL长连接短连接

2011-05-13 09:34:51

TomcatMysql连接池

2019-09-17 11:18:09

SQLMySQLJava

2022-02-21 07:48:54

Mysql数据库SpringBoot

2011-06-01 13:54:10

MySQL

2018-01-01 05:23:13

服务化读写分离架构

2019-12-30 15:30:13

连接池请求PHP

2021-07-07 14:20:15

高并发服务数据库

2022-11-11 09:41:04

连接池微服务数据库

2022-08-16 08:50:40

微服务动态读写分离

2011-09-08 10:30:42

Druid数据库连接池

2010-05-17 16:38:08

MySQL 连接池

2009-11-11 14:04:14

ADO.NET连接池

2022-05-13 07:31:58

数据库连接池druid

2023-09-07 11:09:59

连接池本地端口号

2010-11-08 16:46:57

2010-06-12 13:04:03

MySQL连接池

2009-07-09 17:36:44

JDBC连接池配置

2009-06-16 09:25:31

JBoss配置

2017-06-22 14:13:07

PythonMySQLpymysqlpool
点赞
收藏

51CTO技术栈公众号