2010-01-07 252 views
1

我必須實現一個由MySQL數據庫備份的跟蹤系統。系統將跟蹤許多應用程序,每個應用程序至少跟蹤5個事件(例如,有多少用戶點擊了鏈接x,有多少用戶訪問過網頁y)。一些應用程序將擁有數百萬用戶,因此幾千次更新/秒並不是一個遙不可及的假設。 系統的另一個組件必須計算一些應該每分鐘更新一次的統計信息。系統還應記錄這些統計值的過去值。MySQL跟蹤系統

的方法我的一個朋友建議是登錄日誌表的每一個事件,並有運行每分鐘,並計算所需的信息並更新統計數據表中的cron作業。

這聽起來對我來說很合理。有更好的選擇嗎?

謝謝。

回答

1

我已經記錄到一個與它嘎吱作響的cron日誌表。

我通常在我的應用程序中使用innodb表,但對於日誌表,我將它作爲myisam並使用insert DELAYED . . .查詢。

MyISAM不提供的InnoDB所有的好東西,但我相信它是(因爲這個原因)稍快。

你擔心的主要問題是數據庫鎖定,當你的cron運行,但使用「插入延遲」周圍的問題得到大部分。

+0

從你的經驗,這些效果會更好/更快:使用(使用延遲插入時AFAIK MySQL的隊列在內存中不成文的行)的memcached或內存緩存或有mysql的的另一種形式做通過INSERT類似的東西延誤嗎? – Alex 2010-01-07 09:04:12

+0

這兩個聽起來像有效的選項。爲了獲得最佳性能,關於使用已有的日誌分析器的答案有一個好處。我認爲你應該考慮方便而不是過度優化。我發現插入延遲到MySQL工作正常我的網站(每天登錄到一百萬插入),它是非常容易實現。 – Gattster 2010-01-07 09:11:13

+0

感謝您的輸入。 – Alex 2010-01-07 09:40:15

0

我真的建議你使用一個已經存在的日誌分析器來分析你的web服務器已經存在的日誌。一個例子是webalizer。我認爲更好的是外部系統,如google analytics。這樣做會更好,因爲它將繼續與中間系統(如負載平衡器和緩存)一起工作。

+0

問題是客戶端應用程序在不同的服務器上運行,所以我無法訪問日誌文件。 – Alex 2010-01-07 08:54:06

+0

谷歌分析通過向您想要跟蹤的每個頁面添加一些代碼來工作。非常簡單,只需放入標題即可。 – 2010-01-07 09:48:17

1

如果你的命中率太高,甚至插入到myisam表中去處理,你可能想要保持內存中最近的命中(memcache可以派上用場,或者你可以寫一個自定義的守護進程),並處理命中內存定期存入數據庫統計表(聚合)。

+0

這也是我想到的方法之一:)。 – Alex 2010-01-07 08:54:53

+0

我曾經想過自定義守護進程,但是我從來沒有寫過,因爲我認爲'插入延遲'基本上是一樣的。如果您不想超載主數據庫服務器,則可以在另一臺服務器上輕鬆設置另一個mysql副本。 – Gattster 2010-01-07 09:25:55

+0

它不完全相同,因爲插入延遲最終會打到磁盤。如果你只是想聚集一些數據並每隔一段時間刷新一次,你就不需要每次都打到磁盤上。 – 2010-01-07 18:15:13