当前位置: 首页 > 科技观察

数据库连接配置策略与实践指南

时间:2023-03-20 18:33:38 科技观察

1前言数据库连接在应用程序执行SQL请求完成的过程中扮演着重要的角色。尤其是突然流量暴增,需要创建大量连接,或者网络异常导致重连,从业务端来说,SQL执行速度慢。这时候,SQL的执行速度就不算慢了。本文基于自身生产环境的Durid实践,仅供大家参考。当然,不同公司的链路/业务压力可能不同。具体到个别参数需要区别对待。2、具体实践从整体系统的角度,我们需要考虑几个点,比如合适的数据库连接数、空闲连接的超时时间、网络异常、如何高效地复用连接等。德鲁伊版本选择这几个方面来介绍。2.1如何设置合适的连接池大小,业务请求的QPS和单次请求的RT(毫秒)。基本公式:连接数=QPS/(1000/RT)+N=QPS*RT/1000+N注:这里QPS和RT是针对单个应用的统计。假设随着连接数的增加,客户端可以处理的请求数线性增加。比如一个请求耗时rt=2ms,每个连接能处理的请求数S=1000/2=500,业务层总请求量M=5000,那么合理的请求数连接数为M/S=5000/500=10为了避免连接数被占用,我们将上面的连接数加上N,最终的连接数为10+N。通过统计minIdle来计算此时的最大QPS和RT,并设置initialSize=minIdle。统计峰值时的QPS和此时的RT,计算出maxActive。可以通过jmx通过以下方法观察Druid的实际连接池状态,重点关注ActiveCount:活跃连接数,PoolingCount:池中连接数。并根据实际情况进行调整。java-XX:+UseConcMarkSweepGC-XX:+CMSClassUnloadingEnabled-XX:+TieredCompilation-XX:TieredStopAtLevel=1-Xverify:none-client-jar/PATH/cmdline-jmxclient-0.10.3.jar-127.0.0.1:7777'com.alibaba.druid:type=DruidDataSourceStat'DataSourceList|&grep-E'ActiveCount|PoolingCount'2.2如何设置超时时间连接池中的超时时间主要包括:connectTimeout建立TCP连接的超时时间maxWait最长时间等待从连接池获取连接的时间socketTimeout发送请求后等待响应的超时时间其中connectTimeout建议不要小于1200ms。TCP建立连接时,SYN包的超时重传时间为1s。如果connectTimeout设置的太短,很可能在应用释放时,由于网络抖动导致连接池初始化,或者中间网络设备丢包需要初始化触发超时,导致失败连接池初始化和释放失败。socketTimeout可以根据应用的最长查询返回时间来设置。太长会导致网络问题,或者数据库服务出现问题时出现雪崩;太短也会造成频繁的请求超时。不要让它短于300ms。TCP的最小RTO为200毫秒,并根据延迟进行动态调整。超时时间太短会导致单个丢包导致请求超时。生产环境数据库配置了SQLKiller,会自动杀死执行时间过长的请求。因此,设置太长的socketTimeout是没有意义的。maxWait可以根据应用程序的预期等待时间来设置。为避免出现网络问题或数据库服务问题时出现雪崩,时间设置不宜过大。下面的默认值800ms是一个保守的设置。应用程序可以设置更短的时间,比如300ms。如果时间太短,连接池中的连接数会不足,需要新连接时会导致大量超时。建议不要低于100ms。2.3如何设置连接保持时间设置连接保持时间需要考虑是直接连接还是通过数据库中间件代理连接。一般目前的生产环境多为:App->LVS->Proxy->DB,其中RDS应用的访问路径为App->LVS->Proxy。其中,LVS空闲连接保持时间为90s。为了避免访问关闭的连接,Proxy将自己的空闲连接保持[70,85)秒。因此,为了避免从连接池中获取到关闭的连接,应用程序应该自己设置保持空闲连接时间不超过70s。开启KeepAlive后的效果。当连接池初始化时,会被填充到minIdle数。如果连接池中minIdle数内的连接空闲时间超过minEvictableIdleTimeMillis,就会执行keepAlive操作。当ExceptionSorter检测到的死连接由于网络断开等原因被清除后,会自动将连接数补充到minIdle中。timeBetweenEvictionRunsMillis=10000,minEvictableIdleTimeMillis=44000,maxEvictableIdleTimeMillis=55000。2.4必备配置项以下默认配置可根据实际情况进行调整。1.0.28版本后新增keepAlive配置,默认关闭keepAlive功能。建议使用1.1.16或更高版本。一般业务不需要开启,除非分钟请求数是个位数或者启动时间过长导致初始连接过期。对于2.5的druid版本,建议使用最新版本,不要使用太旧的版本,以免遇到bug。例如Maven配置:com.alibabadruid1.0.27三小结论本文是数据库连接池配置(案例和故障排除指南),希望对需要注意数据库连接配置的朋友有所帮助。