MySql單表最大8000W+ 之資料庫遇瓶頸記

来源:http://www.cnblogs.com/mamingbo/archive/2017/07/15/7183226.html
-Advertisement-
Play Games

Windows Server 2012+ASP.NET +Mysql 最近用戶量突破10+以上,最大併發1300+ 資料庫CPU居高不下,一時達到100%臨界點,導致很多SQL命令執行發生錯誤,連接拒絕。 ...


前言

昨晚救火到兩三點,早上七點多醒來,朦朧中醒來發現電腦還開著,趕緊爬起來看昨晚執行的SQL命令結果。由於昨晚升級了阿裡雲的RDS,等了將近兩個小時 還在 升降級中,早上阿裡雲那邊回覆升級過程中出現異常,正在加緊處理。。。有點蛋疼

 

項目介紹

這個項目主要分為WEB、WEB-Manager、WEB-API、APP(ANDROID、IOS) 。

開發語言主要是ASP.NET 

資料庫MySql

架構採用了ASP.NET +EF+ORM   Unity依賴註入 採用了DDD的部分實踐 

ORM使用的是AutoMapper

使用了Redis緩存

Log4net記錄文件日誌,剛開始使用Mongodb記錄日誌,用了一段時候後取消了。

WEB端使用了angularjs    

API層通過JSON數據與APP進行交互,用戶狀態通過access_token進行傳遞

資料庫層目前是基於倉儲(Repositor)模式實現的

剛開始項目急於上線多數採用Linq +lambda 的查詢方式,在實踐過程中發現變態的業務調整和快速的請求響應,將其複雜的查詢改成了原生SQL,通過Context.DataBase.SqlQuery  執行

 

其他的技術就不一一介紹了

目前訪問量較大的是APP端, 最大併發 1300+

主要是API的壓力比較大,日均 100W+ 請求,API 目前 部署在Windwos server 2012上,  介面在50個以上

資料庫使用的是阿裡雲的單機MySql  RDS 5.6 版本,10盒12G,連接數2000,iops 6000  

目前 單表最大是8000W+數據。物理文件300G,APIlog日均100W+,API與業務系統完全獨立,除了DBLog日誌還有Log4g.net生成的文件日誌。

目前採用的是阿裡雲的負載,一主一從  購買的阿裡雲負載      兩台應用均為 8盒16G ,10M帶寬 ,資源文件上了CDN。

主的上面部署了WEB端和WEB管理後臺,從的上面只有API。

資料庫遇瓶頸

        最近用戶量突破10+以上,最大併發1300+  從前天晚上開始資料庫CPU居高不下,一時達到100%臨界點,導致很多SQL命令執行發生錯誤,鏈接拒絕。阿裡雲的報警簡訊也隨之而來,隨即我停掉了IIS應用,因為不停止應用MySql資料庫很難複蘇,大概過了5分鐘之後資料庫恢復正常,然後再開啟IIS應用。蛋疼的是阿裡雲的負載健康檢查也提示異常,但有點不解的是健康狀態顯示異常,請求仍然在繼續分發,很是不解。立馬我將IIS 應用程式池資源回收,停止然後再重啟,這裡給個提示  重啟IIS應用程式池的時候最好先停止掉IIS應用,然後再重啟IIS應用程式池,不然訪問量大的情況下很難起起來。過了幾分鐘之後負載上的健康檢查顯示正常。

       上阿裡雲後來看了下各個監控指標,顯示流量從前一個小時開始 突然猛增,我以為是有攻擊,但跟蹤了幾個連接發現是正常請求,但360的防禦助手顯示確實有幾個攻擊,但那幾個請求根本不足以拉跨資料庫,大概也就幾十個請求,   幾個簡單的  XSS攻擊 這裡貼下:攻擊的數量不是太多,但主要攻擊的內容和參數就這個幾種類型

url/'%22/%3E%3C/script%3E%3Cscript%3Ealert()%3C/script%3E
url/'%22+onmouseover=alert()+d='%22

url/matrix_callback.php    

url/index.php?option=com_fields&view=fields&layout=modal&list%5Bfullordering%5D=updatexml(0x3a,concat(1,md5(233)),1)

後來發現是資料庫遇到危機了,CPU幾度達到了100%,活躍連接數和非活躍連接數都比平時都要高很多。目前資料庫中有一張最大的表超8000W條數據,超300W以上的也有十幾張,是查詢拖垮了資料庫,平時開發的時候我們都是要求查詢類的SQL要求0.03秒之內完成。但涉及到這幾張大表的查詢我們設定到0.5秒之內返回。今天肯定是查過0.5秒了,

我查了下阿裡雲控制台的慢SQL日誌,眼下系統運行還稍微正常,就拿那些慢SQL 一個一個的優化,不能立馬發版,也就是不能改寫SQL代碼,只能從索引上進行優化了。就這樣把慢SQL逐一過了一遍,大約有20多個  超2秒執行的,最慢的達到了10秒,最大的解析行數達到了10W行以上,哎 應該是下麵的兄弟寫sql不嚴謹,否則不會出現解析行數超10W+的,但兄弟挖的坑 我哭著也要去填。就這樣用explain 調整索引的方式逐一過了一遍,之前通過表空間已經做過一次優化了。

到昨晚又到了高併發的時候,資料庫又報警了,還好只是報警沒有給我crash掉。與客戶那邊溝通下來,決定進行資料庫擴容。現在擴容到了16盒64G 連接數14000 iops16000。

增加了一個應用幾點,現在是一主兩從

應該能撐一段時間了

 

接下來需要著手上讀寫分離, 針對比較大的表進行拆分,代碼和資料庫繼續優化。儘量做到最優。

再下來著手上分散式   因為架構的演變是根據市場營銷情況而定,不能走太前更不能走到市場的後面

周末比較累 寫的比較簡短,有時間再續

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近配置虛擬機的靜態地址,老是記不住步驟,特此記一下,下次直接對照著做就可以啦 ...
  • ———————————————————————————————————————————— 常用庫及部分元件名中英文對照表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
  • bash編程也叫shell編程 預定義變數 $? 最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確的執行;如果這個變數返回的值非0(具體是那個數,有命令自己來決定),則證明上一個命令執行不正確。 $$當前進程的進程號(PID) $!後臺運行的最後一個進程的進程號(PID) 運算... ...
  • FPM工具 支持的源類型包 dir 將目錄打包成所需要的類型。可以用於源碼編譯安裝後的軟體包 rpm 對rpm進行轉換 gen 對rubygem包進行轉換 python 將python模塊打包成相應的類型 支持的目標類型包 rpm 轉換成rpm包 deb 轉換成deb包 solaris 轉換成sol ...
  • 剛接觸MVC+EF框架不久,但一直很困惑的就是控制器能否及如何向視圖傳遞匿名類數據。寶寶表示很討厭去新建實體類啦,查詢稍有不同就去建一個實體類不是很麻煩嗎,故趁陽光正好,周末睡到自然醒後起來嘗試了之前一直在博客園看到的實現方式:英明神武的Tuple類,第一次對微軟欽佩之至。故做如下記錄,方便自己之後 ...
  • 博客里的好多文章都是本人看著比較好,就轉過來的,好少自己親自去寫點什麼,也很少把自己學的一點心得於大家分享,今天特別想聊一下,關於本人做Net開發時的那段回憶! 一、關於知識的回憶 還記得Handlere嗎? 我記得Handler做圖片防盜鏈時,有這麼一個功能! 還記得Module嗎?那時我們做過I ...
  • 這個月我們做了一件別人看起來很瘋狂的事情,就是讓一批95後的實習生實行遠程辦公,效果還不錯,於是寫此文總結一下。我們還會繼續對asp.net mvc\C#技術棧的95後實習生實行遠程辦公的 ...
  • 今天在用python實現爬蟲的時候,就想看一下用c#實現同樣的功能到底會多出來多少code,結果寫著寫著乾脆把頁面也簡單的寫一個出來,方便調試, 大致流程如下: 1.分析拉勾數據 2.查找拉勾做了哪些反爬蟲限制 3.抓取數據,show page 過程中用到一個HtmlAgilityPack第三方庫, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...