针对数据库连接池到DRDS连接探活的优化

针对数据库连接池到DRDS连接探活的优化
最新回答
恋初雪

2023-02-22 23:35:11

针对数据库连接池到DRDS连接探活的优化,核心在于调整探活SQL语句并优化连接池参数配置,以降低0号库压力并提升系统整体性能。

探活SQL优化
  • 问题原因在DRDS场景下,传统探活SQL(如SELECT 'x')会被转发至0号库执行,导致0号库压力显著高于其他实例。原因如下:

    DRDS将无表名的SQL(如SELECT 'x')和SHOW命令默认下发至0号库,而实际业务SQL可能被分发至其他分库。

    客户端探活SQL检测的是“客户端→DRDS→0号库”的链路,而非客户端与DRDS的直接连接状态,导致检测逻辑失效。

图3:客户端通过DRDS连接数据库的探活路径问题
  • 优化方案将探活SQL修改为SELECT 'x' FROM dual,使DRDS直接在逻辑层响应连接状态,避免下发至0号库。

    效果验证:修改后0号库的探活SQL执行记录消失,压力下降约80%。

图5:优化后探活SQL执行计划连接池参数配置优化
  • 问题根源应用侧配置testOnBorrow=true时,每次获取连接均触发探活SQL,导致DRDS实例整体压力升高。

  • 推荐配置以Druid连接池为例,调整以下参数以平衡性能与可用性:

    testWhileIdle=true:仅对空闲连接(闲置时间≥minEvictableIdleTimeMillis)进行探活检测,失败则移除连接。

    timeBetweenEvictionRunsMillis=60000:Destroy线程每60秒检测空闲连接。

    minEvictableIdleTimeMillis=60000:定义连接闲置1分钟为“空闲连接”。

  • 配置逻辑

    减少高峰期探活频率:通过testWhileIdle替代testOnBorrow,避免每次获取连接时执行检测。

    快速响应连接异常:缩短minEvictableIdleTimeMillis(如30秒),可更快发现网络闪断等问题,但需权衡性能开销。

优化效果
  • 0号库压力显著降低:探活SQL不再下发至0号库,其CPU、IO等指标下降约80%。

    图6:优化前后0号库压力对比
  • 系统性能与可用性平衡:通过调整空闲连接检测间隔和阈值,减少无效探活对DRDS实例的冲击,同时降低业务因连接问题出错的概率。

总结
  • 核心优化点

    修改探活SQL为SELECT 'x' FROM dual,避免下发至0号库。

    调整连接池参数(如testWhileIdle、minEvictableIdleTimeMillis),减少高峰期探活频率。

  • 适用场景:使用DRDS作为数据源且依赖连接池探活机制的应用,尤其需关注0号库压力异常的场景。