文章出處

 

非常抱歉!今天 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


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()