問題
某日生產資料庫mysql突然查詢異常緩慢,應用層無法獲取連線, 所有介面都基本處於無法響應狀態。 檢視資料庫監控是cpu利用率100%。
騰訊雲mysql5.7
經驗教訓
- 排查問題的時候要有公允心,不要想隱瞞什麼。 不要想著包庇什麼。“存天理, 去人慾”
- 最終排查結論是因為慢sql引起的,然後併發比平常高。 另外,雲資料庫應該也存在一定問題,因為類似的場景,之前出現過,但是資料庫沒有崩潰。
- 造成資料庫cpu利用率100%的原因
- 慢sql and or 併發。 不要以為慢sql是什麼時候都很慢!!!!!!!!!!!!這次發現的慢sql,其實在cpu正常的時候執行, 只有3s,或者5.2s。但是在cpu100%的時候, 執行需要1300s。
- 併發: 哪怕sql能很快執行完, 1s以內, 但是隻要併發上去了, cpu也會被打滿。 !!!!!!!!!!!!
- 兩方面: 1、定時任務, 晚上刷資料的定時任務最好分散開, 如果是大任務,最好做切分, 或者完成一批之後,sleep一段時間。
2、被大批次介面呼叫。 這個要做好非同步,併發高的, 不要簡單暴露個介面出去就完事了。
- 兩方面: 1、定時任務, 晚上刷資料的定時任務最好分散開, 如果是大任務,最好做切分, 或者完成一批之後,sleep一段時間。
- 生產上一定一定要注意慢sql,控制好頁面能不能重複點選查詢。 發現一個頁面模糊搜尋,有使用者幾分鐘內點選了398次, cpu馬上上天了 。so, 如果有很多連表的情況, 一定要找時間最佳化, 不要看現在是4s,5s就不當回事。 這是資源換來的查詢效率, 只要併發上來了, 直接就掛。 因為每個查詢需要的資源很多!!!!!!!!!
- 後續如果發現這種問題,第一時間攔截掉慢sql對應的介面, 如果資料庫沒有好轉, 直接重啟資料庫。 本次資料庫問題持續了40分鐘, 但是後面30分鐘,應用層應該沒有請求發到資料庫上, 連線已經沒有了。 也就是說, 後30分鐘都在執行之前的查詢, hang住了。
雖然重啟可能會影響資料同步等等, 但是比起生產當機, 好的多 。