監測數據庫的健康和行為:有哪些重要指標?
我們沒有對數據庫討論過多少。在這個充滿監測儀器的時代,我們監測我們的應用程序、基礎設施、甚至我們的用戶,但有時忘記我們的數據庫也值得被監測。這很大程度是因為數據庫表現的很好,以至于我們單純地信任它能把任務完成的很好。信任固然重要,但能夠證明它的表現確實如我們所期待的那樣就更好了。
為什么監測你的數據庫?
監測數據庫的原因有很多,其中大多數原因與監測系統的任何其他部分的原因相同:了解應用程序的各個組件中發生的什么,會讓你成為更了解情況的,能夠做出明智決策的開發人員。
更具體地說,數據庫是系統健康和行為的重要標志。數據庫中的異常行為能夠指出應用程序中出現問題的區域。另外,當應用程序中有異常行為時,你可以利用數據庫的指標來迅速完成排除故障的過程。
問題
最輕微的調查揭示了監測數據庫的一個問題:數據庫有很多指標。說“很多”只是輕描淡寫,如果你是史高治(LCTT 譯注:史高治,唐老鴨的舅舅,以一毛不拔著稱),你不會放過任何一個可用的指標。如果這是摔角狂熱 比賽,那么指標就是折疊椅。監測所有指標似乎并不實用,那么你如何決定要監測哪些指標?
解決方案
開始監測數據庫的***方式是認識一些基礎的數據庫指標。這些指標為理解數據庫的行為創造了良好的開端。
吞吐量:數據庫做了多少?
開始檢測數據庫的***方法是跟蹤它所接到請求的數量。我們對數據庫有較高期望;期望它能穩定的存儲數據,并處理我們拋給它的所有查詢,這些查詢可能是一天一次大規模查詢,或者是來自用戶一天到晚的數百萬次查詢。吞吐量可以告訴我們數據庫是否如我們期望的那樣工作。
你也可以將請求按照類型(讀、寫、服務器端、客戶端等)分組,以開始分析流量。
執行時間:數據庫完成工作需要多長時間?
這個指標看起來很明顯,但往往被忽視了。你不僅想知道數據庫收到了多少請求,還想知道數據庫在每個請求上花費了多長時間。 然而,參考上下文來討論執行時間非常重要:像 InfluxDB 這樣的時間序列數據庫中的慢與像 MySQL 這樣的關系型數據庫中的慢不一樣。InfluxDB 中的慢可能意味著毫秒,而 MySQL 的 SLOW_QUERY
變量的默認值是 10 秒。
監測執行時間和提高執行時間不一樣,所以如果你的應用程序中有其他問題需要修復,那么請注意在優化上花費時間的誘惑。
并發性:數據庫同時做了多少工作?
一旦你知道數據庫正在處理多少請求以及每個請求需要多長時間,你就需要添加一層復雜性以開始從這些指標中獲得實際值。
如果數據庫接收到十個請求,并且每個請求需要十秒鐘來完成,那么數據庫是忙碌了 100 秒、10 秒,還是介于兩者之間?并發任務的數量改變了數據庫資源的使用方式。當你考慮連接和線程的數量等問題時,你將開始對數據庫指標有更全面的了解。
并發性還能影響延遲,這不僅包括任務完成所需的時間(執行時間),還包括任務在處理之前需要等待的時間。
利用率:數據庫繁忙的時間百分比是多少?
利用率是由吞吐量、執行時間和并發性的峰值所確定的數據庫可用的頻率,或者數據庫太忙而不能響應請求的頻率。
該指標對于確定數據庫的整體健康和性能特別有用。如果只能在 80% 的時間內響應請求,則可以重新分配資源、進行優化工作,或者進行更改以更接近高可用性。
好消息
監測和分析似乎非常困難,特別是因為我們大多數人不是數據庫專家,我們可能沒有時間去理解這些指標。但好消息是,大部分的工作已經為我們做好了。許多數據庫都有一個內部性能數據庫(Postgres:pg_stats
、CouchDB:Runtime_Statistics
、InfluxDB:_internal
等),數據庫工程師設計該數據庫來監測與該特定數據庫有關的指標。你可以看到像慢速查詢的數量一樣廣泛的內容,或者像數據庫中每個事件的平均微秒一樣詳細的內容。
結論
數據庫創建了足夠的指標以使我們需要長時間研究,雖然內部性能數據庫充滿了有用的信息,但并不總是使你清楚應該關注哪些指標。從吞吐量、執行時間、并發性和利用率開始,它們為你提供了足夠的信息,使你可以開始了解你的數據庫中的情況。
你在監視你的數據庫嗎?你發現哪些指標有用?告訴我吧!