在這篇文章中,我們將詳細探討導致故障的可能原因以及解決方案,以便更好地理解故障排查的複雜性和艱鉅性,尤其是當出現與本次故障表現相似的問題時。
故障的表現
首先,讓我們回顧一下故障的表現。在客戶端呼叫介面時,發現一直在轉圈等待,而伺服器端卻收到了請求並在返回結果給客戶端時報了一些錯誤,包括java.io.IOException: Broken pipe錯誤和Connection reset by peer錯誤。儘管整個查詢鏈路所需時間並不長,大約在2秒左右,但透過使用grafana監控工具,我們發現Nginx的連線數超過了平時的6倍以上。儘管我們已經仔細檢查了各個方面的原因,但仍未找到根本問題所在。但是,我們最終注意到重啟服務可以解決問題,因此我們將目標問題的範圍鎖定在伺服器端。
pinpoint錯誤請求數及其分佈
Nginx當時的連線數:當時是個很正常日子,並沒什麼活動
問題排查
然而,為什麼會出現這樣的問題呢?主要原因在於監控手段不足,甚至無法生成基本的Java dump檔案。在排查過程中,我們只能看到現象而無法找到具體原因。透過pinpoint平臺(類似於skywalking),我們發現了三種基本錯誤。第一種是之前提到的java.io.IOException: Broken pipe,第二種是Connection reset by peer,第三種是伺服器訪問第三方伺服器時出現的connection timeout或refuse connection錯誤。雖然之前也發生過類似的問題,但都是偶爾出現,並沒有像這次一樣數量如此之多,佔用了訪問量的1/10。因此,在出現問題時,我們沒有立即重啟,而是進行了仔細排查。然而,最終我們以失敗告終,只能依靠重啟來解決問題。如果你有任何想法,請在下方評論區留言。
首先,我們排除了一些問題,如資料庫查詢、中間鏈路的轉發、第三方伺服器的呼叫等,均未發現問題。儘管我們確實可以確定問題出在伺服器節點上,但具體原因仍然是個謎。
在繼續探索之前,讓我們先了解一下故障排查的一般步驟。首先,我們需要收集足夠的資訊來了解故障的具體表現。這包括錯誤日誌、監控指標、效能資料等。在本次故障中,我們已經透過監控工具獲取了一些有用的資訊。接下來,我們需要分析這些資訊,並進行合理的假設和推斷。我們還可以嘗試在類似的環境中重現故障,以進一步觀察和分析。當我們找到可能的原因時,可以進行一系列的測試和驗證,以確定是否解決了問題。最後,我們需要記錄和總結我們的調查過程,以便於日後的參考和經驗積累。
在本次故障排查中,我們遇到了一些挑戰。首先是監控手段不足的問題,由於JDK版本的問題導致無法生成Java dump檔案。這使得我們無法深入瞭解故障的具體原因。因此,我們建議在類似的情況下,提前準備好足夠的監控工具和技術手段,以便更好地進行故障排查。
另一個挑戰是故障的復現。由於問題並非每次都發生,我們無法簡單地透過重現來解決。在這種情況下,我們嘗試了在生產環境協調客戶獲取賬號,並確實復現了問題所在,最終確定了是某一個節點連線數飆高導致無法處理請求導致的,但是為什麼會某一個節點單獨飆高就不得而知。
最後,我們需要注意故障排查的方法和技巧。在排查過程中,我們應該保持冷靜和耐心,避免盲目猜測和隨意嘗試。我們應該以科學的態度,根據收集的資訊進行分析和推理,不斷迭代和驗證。同時,我們還應該注重團隊合作和知識共享,透過不同的視角和經驗來解決問題。
總結
總之,本次故障排查雖然以失敗告終,但我們從中學到了很多經驗和教訓。故障排查是一項複雜而重要的任務,需要我們具備專業知識和技術手段。同時,我們還需要保持冷靜和耐心,以科學的態度進行分析和推理。只有這樣,我們才能更好地解決問題,併為日後的故障排查積累寶貴的經驗。