云计算之路-阿里云上:rds数据库连接数过万引发故障,主备库切换后恢复正常
非常抱歉！今天 12:03-12:52 ,由于数据库连接数异常突增超过1万,达到了阿里云rds的最大连接数限制,影响了全站的正常访问。由此给您带来麻烦,请您谅解。 在发现数据库连接数突增的问题后,我们一开始怀疑可能是我们的某些应用中产生太多ado.net连接引起的,但是对嫌疑的应用们进行重启后,连接数依然高居不下。 后来,我们回想起去年9月份遇到的一次数据库问题,当时很多数据库查询超时,iops突增达到rds的最大限制。开始我们也是从应用层面下手,但怎么也解决不了,后来实在没办法,试了试主备库切换,切换后立马神奇地恢复正常,然后就一直相安无事,直到今天。 今天我们再试试这一招吧！12:38开始进行主备库切换,12:52左右连接数降到了1000以下,全站访问恢复正常,这一招又一次神奇地发挥了作用。 恢复正常后,我们分析了一下对应的应用日志。 在出现故障之前应用日志就已经记录了一些数据库查询超时: system.data.sqlclient.sqlexception (0x): timeo t expired. the timeo t period elapsed prior to completion of the operation or the server is not responding. this fail re occ red while attempting to connect to the principle server.  system.componentmodel.win32exception (0x): the wait operation timed o t 在故障期间出现了大量下面的错误日志: 1)无法与阿里云rds建立tcp连接 system.data.sqlclient.sqlexception (0x): a network-related or instance-specific error occ rred while establishing a connection to sql server. the server was not fo nd or was not accessible. verify that the instance name is correct and that sql server is config red to allow remote connections. (provider: sql network interfaces, error: 26 - error locating serverinstance specified) 2)达到ado.net连接池的最大连接数限制 system.invalidoperationexception: timeo t expired. the timeo t period elapsed prior to obtaining a connection from the pool. this may have occ rred beca se all pooled connections were in se and max pool size was reached. 3)达到阿里云rds的最大连接数限制,被拒绝登录 system.data.entity.core.entitycommandexec tionexception: an error occ rred while exec ting the command definition. see the inner exception for details.  system.data.sqlclient.sqlexception: logon failed for login xxx d e to trigger exec tion. 将这些错误日志联系起来,我们推断数据库连接数过万并不是应用中真的产生了大量的数据库连接(而且发生的时间点是在午饭时间的访问低峰),而是rds出现了我们所不知道的状况,造成大量数据库操作无法正常按时完成,所占用的数据库连接不能快速释放,或者甚至是建立或释放数据库连接操作本身出了问题,造成数据库连接越来越多。 看一下rds的连接数在7天内的监控图(见下图),从4.2开始,连接数就开始异常,4.2-4.4每天的访问量要明显低于3.31-4.1,然而4.2的连接数竟然高于3.31,之后越来越来高。可能我们所用的rds实例在4.2开始出现异常状况。 主备库切换是将当前的rds实例切换到了另外一台数据库服务器上,切换后立即恢复正常也说明了之前rds实例所在的服务器出了状况。而且,在今天下午的访问高峰,在切换后的新服务器器上的最高连接数不超过3000。 虽然我们的推断只是没有足够证据的猜想,虽然阿里云坚决认为是我们的应用产生了过多的数据库连接,但我们依然坚持对这个问题的推断-是rds的问题。我们无法去验证自己的推断,我们无法躲避下次的同样问题,但幸好还有个救命稻草-主备库切换,比提交工单还有效的救命稻草,当我们急如燃眉地提交工单,等收到回复时,我们已经完成了主备库切换,恢复了正常。 end.