非常抱歉!今天 12:03-12:52 ,由于数据库连接数异常突增超过1万,达到了阿里云RDS的最大连接数限制,影响了全站的正常访问。由此给您带来麻烦,请您谅解。

在发现数据库连接数突增的问题后,我们一开始怀疑可能是我们的某些应用中产生太多ADO.NET连接引起的,但是对嫌疑的应用们进行重启后,连接数依然高居不下。

后来,我们回想起去年9月份遇到的一次数据库问题,当时很多数据库查询超时,IOPS突增达到RDS的最大限制。开始我们也是从应用层面下手,但怎么也解决不了,后来实在没办法,试了试主备库切换,切换后立马神奇地恢复正常,然后就一直相安无事,直到今天。

今天我们再试试这一招吧!12:38开始进行主备库切换,12:52左右连接数降到了1000以下,全站访问恢复正常,这一招又一次神奇地发挥了作用。

恢复正常后,我们分析了一下对应的应用日志。

在出现故障之前应用日志就已经记录了一些数据库查询超时:

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.  This failure occured while attempting to connect to the Principle server. ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out

在故障期间出现了大量下面的错误日志:

1)无法与阿里云RDS建立TCP连接

System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)

2)达到ADO.NET连接池的最大连接数限制

System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.

3)达到阿里云RDS的最大连接数限制,被拒绝登录

System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Logon failed for login 'xxx' due to trigger execution.

将这些错误日志联系起来,我们推断数据库连接数过万并不是应用中真的产生了大量的数据库连接(而且发生的时间点是在午饭时间的访问低峰),而是RDS出现了我们所不知道的状况,造成大量数据库操作无法正常按时完成,所占用的数据库连接不能快速释放,或者甚至是建立或释放数据库连接操作本身出了问题,造成数据库连接越来越多。

看一下RDS的连接数在7天内的监控图(见下图),从4.2开始,连接数就开始异常,4.2-4.4每天的访问量要明显低于3.31-4.1,然而4.2的连接数竟然高于3.31,之后越来越来高。可能我们所用的RDS实例在4.2开始出现异常状况。

主备库切换是将当前的RDS实例切换到了另外一台数据库服务器上,切换后立即恢复正常也说明了之前RDS实例所在的服务器出了状况。而且,在今天下午的访问高峰,在切换后的新服务器器上的最高连接数不超过3000。

虽然我们的推断只是没有足够证据的猜想,虽然阿里云坚决认为是我们的应用产生了过多的数据库连接,但我们依然坚持对这个问题的推断——是RDS的问题(注:后来事实证明是我们推断错了,不是RDS的问题,是微软.NET Core的一个bug引起的,详见后续博文)。我们无法去验证自己的推断,我们无法躲避下次的同样问题,但幸好还有个救命稻草——主备库切换,比提交工单还有效的救命稻草,当我们急如燃眉地提交工单,等收到回复时,我们已经完成了主备库切换,恢复了正常。

【更新】

这个问题的后续进展详见 数据库连接数过万的真相,从阿里云RDS到微软.NET Core

云计算之路-阿里云上:RDS数据库连接数过万引发故障,主备库切换后恢复正常的更多相关文章

  1. 云计算之路-阿里云上:数据库连接数过万的真相,从阿里云RDS到微软.NET Core

    在昨天的博文中,我们坚持认为数据库连接数过万是阿里云RDS的问题,但后来阿里云提供了当时的数据库连接情况,让我们动摇了自己的想法. 帐户 连接数 A 4077 B 3995 C 741 D 698 E ...

  2. 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障

    3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...

  3. 云计算之路-阿里云上:OCS问题的进展以及11:30-11:50遇到的问题

    (上图是今天出问题期间Web服务器性能监控图,紫色表示的是Request Execution Time) 昨天我们发布了一篇博客分享了我们这两天遇到的OCS(开放缓存服务)问题,详见云计算之路-阿里云 ...

  4. 云计算之路-阿里云上:愚人节被阿里云OCS愚

    今天是愚人节,而我们却被阿里云OCS愚,很多地方的缓存一直不过期,造成很多页面中的数据一直不更新.这篇博文将向您分享我们这两天遇到的OCS问题. 阿里云OCS(Open Cache Service)是 ...

  5. 云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析

    在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. “黑色30秒”问题现象的主要特征是:排队的请求(Requests Queued)突增 ...

  6. 云计算之路-阿里云上:Web服务器遭遇奇怪的“黑色30秒”问题

    今天下午访问高峰的时候,主站的Web服务器出现奇怪的问题,开始是2台8核8G的云服务器(ECS),后来又加了1台8核8G的云服务器,问题依旧. 而且3台服务器特地使用了不同的配置:1台是禁用了虚拟内存 ...

  7. 云计算之路-阿里云上-新发现:又一种与虚拟内存有关的CPU波动情况

    在云上真是无奇不有,昨天偶然间发现在IIS的应用程序池回收设置中,仅仅设置了一下基于虚拟内存限制的回收,就引发了CPU有规律的波动.在这篇博文中,我们将向大家汇报一下云计算之路上的这个小发现. 在之前 ...

  8. 云计算之路-阿里云上:启用Windows虚拟内存引发的CPU 100%故障

    今天上午11:35~11:40左右,由于负载均衡中的两台云服务器CPU占用突然飚至100%,造成网站5分钟左右不能正常访问,请大家带来了麻烦,请谅解! (上图中红色曲线表示CPU占用) 经过分析,我们 ...

  9. 云计算之路-阿里云上:SLB会话保持的一个坑

    冒着被大家厌烦的风险,今天再发一篇“云计算之路-阿里云上”.这是在前一篇发过之后真实发生的事情,我们觉得定位问题的过程值得分享.而且估计园子里不少朋友被这个问题骚扰过,我们有责任让大家知道问题的真正原 ...

随机推荐

  1. web开发之Servlet 一

    因为最近在研究公司一套新的框架,发现这套框架的底层是对Struts2,Spring 封装后的WEB应用框架,而我发现如果仅仅是利用这个框架开发,确实很容易快速上手,做业务来说是没有问题的,但我觉得如果 ...

  2. python数据结构(一)------序列

    数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合:在Python中,最基本的数据结构是序列(sequence),序列中的每个元素被分配一个序列号--即元素的位置,也称为索引. p ...

  3. Redis之Sentinel高可用安装部署

    背景: 之前通过Redis Sentinel 高可用实现说明和Redis 复制.Sentinel的搭建和原理说明大致已经介绍了sentinel的原理和实现,本文再次做个简单的回顾.具体的信息见前面的两 ...

  4. maven引用net.sf.json-lib

    json-lib提供了两个jdk版本的实现, json-lib-2.1-jdk13.jar和json-lib-2.1-jdk15.jar <dependency>      <gro ...

  5. js文字滚动效果实现

    纯js实现,完整代码如下: <!doctype html> <html lang="en"> <head> <meta http-equi ...

  6. C++ traits技术浅谈

    前言 traits,又被叫做特性萃取技术,说得简单点就是提取"被传进的对象"对应的返回类型,让同一个接口实现对应的功能.因为STL的算法和容器是分离的,两者通过迭代器链接.算法的实 ...

  7. 使用yum安装cmake

    一.搜索yum源中的CMake,查看源中最新的版本是什么,使用命令[root@localhost ~]# yum search cmake ,如果搜索出的结果过多可以配合grep命令来控制搜索结果. ...

  8. Mvc动态注册HttpModule详解

    序言 注册Httpmodule可以让我们使用HttpApplication对象中的处理管道事件.目前大家所熟知的应该有2种方式来使用HttpApplication对象中的处理管道事件.第一种是通过Gl ...

  9. PHP字符串三种定义方式

    PHP的字符串有三种定义方式:单引号 .双引号 .定界符  1.单引号:指定一个简单字符串的最简单的方法是用单引号(字符 ')括起来. 在被单引号括起来的字符串中,要再表示一个单引号,需要用反斜线(\ ...

  10. 谈谈事件对象-event

    JavaScript 中的事件对象(event) 当我们每次触发一种事件(如点击事件),我们会在回调函数中传入事件对象event.今天就来来谈谈. 1.当我们想判断当前事件是我们想要的事件类型时,可以 ...