在生产环境上,由于数据库服务器升级,需要将数据服务切换至新的数据库服务,发现在切换过程中,存在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
可能与以下几个原因相关:
数据库宕机或服务切换时,Druid仍在重试获取连接
Druid有一个maxWait属性,默认2分钟,表示等待获取连接的最长时间。
所以当数据库宕机时,Druid会一直尝试重试,直到超时2分钟。
Druid配置了campaign时,Campaign批处理等待了2分钟
如果使用了Druid的Campaign特性批量申请连接,同样会等待maxWait时间。
数据库长时间无法访问,连接池中的连接已全部失效
在数据库不可访问的期间,连接池中的连接已经全部失效了。
Druid必须先从数据库重新获取一个新的连接,这个过程可能需要2分钟。
数据库并发连接数受限,Druid在排队等待
这个和socketTimeout配置有关系吧,创建连接是单线程的,这时候创建连接在置空的VIP上,堵住了
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。