开发者社区> 问答> 正文

数据库服务切换导致2分钟获取不到连接错误-版本1.1.14 / 1.1.20

在生产环境上,由于数据库服务器升级,需要将数据服务切换至新的数据库服务,发现在切换过程中,存在2分钟获取不到连接的情况,导致这2分钟的数据库操作全部失败。线下也多次测试,问题必现。 使用的腾讯云服务,整个切换过程大概是3~4秒,但是业务应用持续了2分钟sql报错,

切换主要步骤如下(腾讯云提供):

HA切换分为两种逻辑,分别是Master OK状态下的切换和Master Down状态下的切换。 MasterOK: 1. 置空VIP 2. kill老主库上的连接,客户端收到mysql返回的reset包;同时在TGW网关处标记访问老主库的五元组失效 3. VIP指向新主库 4.1 用户新连接指向新主库 4.2 没kill掉的老连接访问到TGW时,返回reset包,重新发起新连接访问新主库 MasterDown: 1. 置空VIP 2. 在TGW网关处标记访问老主库的五元组失效 3. VIP指向新主库 4.1 用户新连接指向新主库 4.2 老连接访问到TGW时,返回reset包,重新发起新连接访问新主库

一类是错误信息,持续时间与切换时间差不多,持续几秒

org.springframework.dao.RecoverableDataAccessException:

Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 另一类错误信息,持续2分钟

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 2000, active 0, maxActive 20, creating 1, createElapseMillis 124212 配置如下

原提问者GitHub用户ghost

展开
收起
山海行 2023-07-05 19:31:14 116 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    可能与以下几个原因相关:

    数据库宕机或服务切换时,Druid仍在重试获取连接
    Druid有一个maxWait属性,默认2分钟,表示等待获取连接的最长时间。

    所以当数据库宕机时,Druid会一直尝试重试,直到超时2分钟。

    Druid配置了campaign时,Campaign批处理等待了2分钟
    如果使用了Druid的Campaign特性批量申请连接,同样会等待maxWait时间。

    数据库长时间无法访问,连接池中的连接已全部失效
    在数据库不可访问的期间,连接池中的连接已经全部失效了。

    Druid必须先从数据库重新获取一个新的连接,这个过程可能需要2分钟。

    数据库并发连接数受限,Druid在排队等待

    2023-07-30 16:41:37
    赞同 展开评论 打赏
  • 这个和socketTimeout配置有关系吧,创建连接是单线程的,这时候创建连接在置空的VIP上,堵住了

    原回答者GitHub用户wenshao

    2023-07-06 11:01:54
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载