【高併發簡單解決方案】redis快取佇列+mysql 批量入庫+php離線整合

發表於2016-04-10

需求背景:有個呼叫統計日誌儲存和統計需求,要求儲存到mysql中;儲存資料高峰能達到日均千萬,瓶頸在於直接入庫併發太高,可能會把mysql幹垮。

問題分析

思考:應用網站架構的衍化過程中,應用最新的框架和工具技術固然是最優選擇;但是,如果能在現有的框架的基礎上提出簡單可依賴的解決方案,未嘗不是一種提升自我的嘗試。
解決:

  • 問題一:要求日誌最好入庫;但是,直接入庫mysql確實扛不住,批量入庫沒有問題,done。【批量入庫和直接入庫效能差異參考文章】
  • 問題二:批量入庫就需要有高併發的訊息佇列,決定採用redis list 模擬實現,而且方便回滾。
  • 問題三:日誌量畢竟大,儲存最近30條足矣,決定用php寫個離線統計和清理指令碼。

done,下面是小拽的簡單實現過程

一:設計資料庫表和儲存

  • 考慮到log系統對資料庫的效能更多一些,穩定性和安全性沒有那麼高,儲存引擎自然是隻支援select insert 沒有索引的archive。如果確實有update需求,也可以採用myISAM。
  • 考慮到log是實時記錄的所有資料,數量可能巨大,主鍵採用bigint,自增即可
  • 考慮到log系統以寫為主,統計採用離線計算,欄位均不要出現索引,因為一方面可能會影響插入資料效率,另外讀時候會造成死鎖,影響寫資料。

二:redis儲存資料形成訊息佇列

由於高併發,儘可能簡單,直接,上程式碼。

三:資料定時批量入庫。

定時讀取redis訊息佇列裡面的資料,批量入庫。

四:離線天級統計和清理資料指令碼

五:程式碼部署

主要是部署,批量入庫指令碼的呼叫和天級統計指令碼,crontab例行執行。

總結:相對於其他複雜的方式處理高併發,這個解決方案簡單有效:通過redis快取抗壓,mysql批量入庫解決資料庫瓶頸,離線計算解決統計資料,通過定期清理保證庫的大小。

相關文章