drds连接池

DRDS连接池
drds是一款基于阿里云rds的数据库中间件,总结一下关于drds连接池的理解
drds连接池

从DRDS来看,有两个连接池:
*1、 应用到DRDS的连接池
2、 DRDS到后端RDS的连接池*

应用到DRDS的连接池
目的:提高应用性能,减轻数据库负载
作用:
1、资源复用:连接可以重复利用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,同时增进了系统的平稳性。

2、提高系统响应效率:连接的初始化工作完成后,所有请求可以直接利用现有连接,避免了连接初始化和释放的开销,提高了系统的响应效率。

3、避免连接泄漏:连接池可根据预设的回收策略,强制回收连接,从而避免了连接资源泄漏

某专有云采用的是德鲁伊连接池,这也是官网推荐的连接池类型。配置信息如下图:
drds连接池

drds之前出现过节点连接数不均衡问题,某几个节点的压力过大,导致docker连接异常。
解决过程:
1、修改应用到drds的探活语句,之前探活语句查看执行计划发现是打到了drds下面rds的 0 号库上,导致drds的0号库qps压力高。现在修改语句只探活到drds层面,这个主要是针对0号库压力高的问题。
2、升级德鲁伊版本,并且设置固定时间关闭连接的参数phyTimeoutMillis升级后观察连接数还是比较平均的。当然drds也有自己的slb负载均衡,通过相应的算法来将应用连接数分配到各个docker节点上。

DRDS到后端RDS的连接池
DRDS到后端的连接池是指:从每个DRDS节点到后端RDS每个分库的连接池。这个连接池是在drds的docker节点上的。
DRDS后端连接池的大小设置是与后端RDS的最大连接数相关的,参考最大连接处设置公式如下:

最大连接数=RDS实例最大连接数/DRDS节点数/RDS实例分库数(每个RDS上的物理分库数)

改值只是一个参考值

如何修改该值:
1、 通过drds manager中实用功能可以自定义该值,注意appname是show datasources中的schema字段,也可以通过drdsmanager查询该值。
2、 通过drds console进行调整实例连接池信息,会根据后端RDS实例进行调整,并且会reload从drd到rds的连接,这是自动调整的,无法自定义设置。

相关问题:
客户在进行压测的过程导致drds的0号库连接池被打满,具体报错理解为connection $RDS_0号库 full。想要咨询并且修改drds到后端rds的连接数。

针对该问题,首先建议客户需要优化对应的慢SQL,并且0号库rds的实例连接数相比其他的数据库连接数配置要低,连接池更容易因为慢sql而被打满,或者说有没有一些大事务、长事务等占用连接不释放等。

应用到drds和drds到rds的两段连接数是异步的,没有绑定关系的。前端到drds的连接数,drds首先接住这些连接,然后通过自己的转发机制,异步转发到节点上去执行,每个节点都会有一个连接池到rds上分库的连接,这样也不能保证是哪个节点的连接池被打满。这也跟业务相关,假如压测中很多场景是多访问0号库的业务,也会导致0号库出现这个问题,这些都是要去考虑的。

实例连接数是可以增加的,但是不能一味的增加连接数,首先应该从问题根源上确认是否有导致出现连接数打满的问题,需要去优化的要做好优化,最后考虑去升级规格。避免出现一直升级连接数还是被打满的问题。