簡體   English   中英

將大量命中記錄到MySQL數據庫的最佳實踐

[英]Best practice to record large amount of hits into MySQL database

嗯,這就是事情。 假設我未來的PHP CMS需要每天驅動500k訪問者,我需要將它們全部記錄在MySQL數據庫中(引用者,IP地址,時間等)。 這樣我需要每分鍾插入300-500行並更新50行。 主要問題是每次我想插入新行時腳本都會調用數據庫,這是每次有人點擊一個頁面時。

我的問題是,有沒有辦法首先在本地緩存傳入的命中(對於那個apc,csv ......最好的解決方案是什么?)並定期每隔10分鍾將它們發送到數據庫? 這是一個很好的解決方案嗎?這種情況的最佳做法是什么?

每天500k,每秒只有5-7個查詢。 如果每個請求將在0.2秒內提供,那么您將同時擁有幾乎0個查詢,因此無需擔心。
即使你的用戶數量增加了5倍 - 一切都應該可以正常工作。
您可以使用INSERT DELAYED並調整您的mysql。
關於調優: http//www.day32.com/MySQL/ - 有非常有用的腳本(不會改變任何內容,只是向您展示如何優化設置的提示)。

您可以先使用memcache或APC在那里寫日志,但使用INSERT DELAYED MySQL將完成幾乎相同的工作,並且會做得更好:)

不要使用文件。 DB將比PHP更好地提供鎖。 編寫有效的互斥鎖並不是那么簡單,所以讓DB(或memcache,APC)完成這項工作。

經常使用的解決方案:

您可以在memcached中實現一個計數器,您可以在訪問時增加該計數器,並將每次100(或1000)次點擊的更新推送到數據庫。

我們這樣做是通過在每台服務器上本地存儲到CSV,然后有一個微小的cron作業將條目推送到數據庫中。 這是為了避免需要高度可用的MySQL數據庫 - 數據庫應該能夠毫無問題地處理該數量的插入。

將它們保存到基於目錄的數據庫(或平面文件,取決於)某處,並在某個時間,使用PHP代碼將它們插入/更新到MySQL數據庫中。 您的PHP代碼可以使用Cron定期執行,因此請檢查您的服務器是否具有Cron,以便您可以設置該計划,例如每10分鍾一次。

看看這個頁面: http//damonparker.org/blog/2006/05/10/php-cron-script-to-run-automated-jobs/ 有些代碼已經寫在雲端,可供您使用:)

一種方法是使用Apache access.log。 通過使用帶有apache的cronolog實用程序,您可以獲得非常好的日志記錄。 Cronolog將處理文件中大量行的存儲,並可根據卷日,年等旋轉它。使用此實用程序將阻止您的Apache遭受日志寫入。

然后正如其他人所說,使用基於cron的作業來分析這些日志,並在MySQL中推送您想要的任何匯總或原始數據。

您可以考慮使用專用數據庫(甚至數據庫服務器)進行具有特定設置的寫入密集型作業。 例如,您可能不需要InnoDB存儲並保留簡單的MyIsam。 你甚至可以想到另一個數據庫存儲(正如@Riccardo Galli所說)

如果您絕對需要直接登錄MySQL,請考慮使用兩個數據庫。 一個針對快速插入進行了優化,這意味着除了可能的auto_increment主鍵之外沒有其他鍵。 還有另一個帶有您要查詢的所有內容的按鍵,針對快速搜索進行了優化。 定時作業會定期將命中數據從僅插入數據庫復制到只讀數據庫,最終您將獲得兩全其美的效果。 唯一的缺點是您的可用統計信息僅與之前的“復制”運行一樣新鮮。

我之前也看到過一個系統,它將數據記錄到每個Web服務器上的本地磁盤上的平面文件中(如果使用多個過程,請小心只做原子附加),並使用守護進程定期將它們異步寫入數據庫或cron job。

這似乎是流行的優化解決方案; 如果審計數據庫已關閉,則您的Web應用程序仍然可用,如果數據庫因任何原因而變慢,則用戶不會遇到性能不佳的情況。

我唯一可以說的是,確保您對這些本地生成的文件進行監控 - 構建肯定表明存在問題,而您的Ops工程師可能不會注意到。

您可以使用beanstalk或IronQ使用隊列策略

對於大量的寫操作和這種數據,您可能會發現更合適的mongodb或couchdb

因為INSERT DELAYED僅受MyISAM支持,所以它不是許多用戶的選項。

我們使用MySQL Proxy來推遲匹配特定簽名的查詢的執行。

這將需要一個自定義的Lua腳本; 示例腳本在這里一些教程在這里

該腳本將實現用於存儲查詢字符串的Queue數據結構,以及用於確定要延遲的查詢的模式匹配。 一旦隊列達到一定大小,或者已經過了一定的時間,或者發生任何事件X,查詢隊列就會被清空,因為每個查詢都被發送到服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM