非常非常抱歉!2016年3月7日15:44-16:39,由于阿里云RDS(云数据库)故障,造成全站不能正常访问,给您带来了很大很大的麻烦,恳请您的谅解!
故障是在15:44开始出现的,应用日志中出现大量这样的错误:
System.Data.SqlClient.SqlException (0x80131904): Logon failed for login '...' due to trigger execution.
当前命令发生了严重错误。应放弃任何可能产生的结果。
在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
...
System.Data.SqlClient.SqlException (0x80131904): Logon failed for login '...' due to trigger execution.
A severe error occurred on the current command. The results, if any, should be discarded.
15:55,我们向阿里云提交了紧急工单。
16:16,我们怀疑是数据库连接被RDS限制的原因,在工单中进一步提交了我们的怀疑。
16:17,20多分钟过去,阿里云客服竟然无任何响应,而且是紧急工单。无奈之下,进行一键投诉。
16:19,终于有客服响应了,本以为救星出现了,哪知是火上浇油!这时我们已经确认是数据库连接数限制的原因,可是客服的不专业让人有理说不清,当时那种“叫天天不应,叫地地不灵”的无助让人崩溃。
16:39,直到这时(已经过去了40多分钟),阿里云客服才确认是数据库连接数限制的问题并进行了调整,调整之后,立马恢复正常。
故障原因分析:
好端端的,为什么数据库连接数限制会被突然修改?
阿里云RDS实例对数据库连接数有着霸道的限制,这个限制只针对连接总数,却不区分是否活跃。对于访问量稍微大一点的网站,RDS的默认数据库连接数根本不够用,因为数据库连接池是网站应用的标配,每台服务器都要在连接池中保持一定数量的数据库连接,服务器越多,连接数就越多。为了解决这个问题,阿里云针对这样的客户对进行了特殊设置,我们就是这样的客户之一。但阿里云在发布RDS产品更新时,有时会不小覆盖会这个特殊设置,之前我们也遇到过一次,这次很可能是同样的原因。
来自阿里云的故障原因解释:
故障是因为我们在2015年12月22日对这个RDS实例进行了升级,升级时数据库连接数限制被自动重置为默认值(虽然我们在RDS控制台看到的一直是特殊设置值),今天下午正好连接数超过了默认限制值(虽然我们在RDS控制台系统资源监控中看到的连接数没有超过默认限制值,阈值报警没有触发)。
对故障根源的分歧:
阿里云认为错在我们使用了特殊设置,他们最多只需做好对特殊设置的兼容。
而我们认为错在RDS对数据库连接数限制的机制不合理,特殊设置是为之所迫,应该改进连接数限制机制,不要像现在这么霸道。