2009-12-08 81 views
7

我需要做什麼才能使每秒鐘的20k mysql插入成爲可能(在較慢時間內,在1k/sec的高峯時段)?我一直在做一些研究,並且看到了「INSERT DELAYED」建議,寫入一個平面文件「fopen(file,'a')」,然後運行一個chron作業將「需要」的數據轉儲到mysql等。我也聽說你需要多個服務器和「負載平衡器」,這是我從來沒有聽說過的,做出類似這樣的工作。我也一直在研究這些「雲服務器」的東西,它們的自動擴展性,但不確定實際可擴展性。PHP的最佳做法,每天跟蹤數百萬的展示次數

的應用僅僅是一個跟蹤腳本,所以如果我有100個網站,拿到3萬的頁面加載一天,有那麼一天大約3億插入。數據將通過一個腳本運行,腳本每15-30分鐘運行一次,這將使數據標準化並將其插入另一個mysql表中。

大狗如何做到這一點?小狗如何做到這一點?我買不起一個巨大的服務器了,所以任何直觀的方式,如果有在它會通過多種方式,你聰明的人能想到的。請讓我知道:)

+0

我是n00b,但我不明白爲什麼20k ins/sec是必要的?你不能只在PHP中的數組中存儲一堆數據,然後用looooooooooong mysql查詢字符串一次插入(n)行嗎?這會減少原始插入的數量。雖然我認爲處理時間仍然是個問題。 : -/ – Drew 2009-12-08 03:10:32

+0

從我讀的,它不是在一個腳本20K /秒。但是,20K /秒來自多個請求。 – ariefbayu 2009-12-08 03:26:19

+0

如果您還沒有真正開始實際開發網站,並且您目前只收到您期望的一小部分流量,那麼不要擔心優化的細節,直到您開始看到需要的增長和規模爲止。在真正需要之前,發展的最大缺陷之一就是過度優化。大部分的大魚開始在一個小池塘裏。只是我的建議。 – 2009-12-08 03:38:37

回答

2

那令人印象深刻。我的大部分數據都來自大量插入。我發現的一件事是大容量插入比單獨插入要好得多。另外,表格,索引等的設計與插入速度有很大關係。使用cron和批量插入的問題是邊緣情況。 (當它去做插入)。

此外與flatfiles。將插入內容寫入文件可以輕鬆解決併發問題。如果你正在寫1k +插入一個s,當文件寫入出現問題時,你很快就會遇到很多衝突和損失。

+0

嗯,我需要將它們分開進入任何介質拿走這些。然後我需要將這些數據歸一化,並將其放入一個非常小巧整潔的mysql表中。 – Mickey 2009-12-08 06:56:53

5

如何大狗做呢?

多臺服務器。負載均衡。

如何的小狗做呢?

多臺服務器。負載均衡。

你真的想要保存插入並將它們批量推送到數據庫。 20k個人插入第二個是頭頂上的一個crapton,並且簡化到每秒一個大插入消除大部分。

+1

我想這個問題是,「我如何保存它們?」。 – Mickey 2009-12-08 06:55:14

1

這不是您可以單獨在PHP中處理的問題。

如果你有20萬個請求第二打你的「低預算」 (我理解你的問題的底色)服務器,然後它會達到極限之前,他們大多達到PHP處理器(和,最終,MySQL)。

如果您有一個流量跟蹤器腳本,您很可能也會爲您跟蹤的所有站點導致問題。

+0

我想那是另一個問題。請問服務器能夠處理加載的PHP,這將使這種情況每秒發生20000次:( – Mickey 2009-12-08 06:59:01

+1

緩存,緩存,緩存。如果可以的話,把數據庫放在一臺服務器上,另一臺服務器上的php。只需要花錢投擲更大的東西,希望在增長的時候能夠彌補它的不足 – 2009-12-20 18:07:56

5

幾種方法:

首先,你會到達你需要進行分區或分片數據到它在多臺服務器分割點。這可以像server1上的A-C,server2上的D-F等一樣簡單。其次,推遲寫入數據庫。而是直接使用beanstalkd或memcached寫入快速內存存儲。讓另一個進程收集這些狀態並將彙總的數據寫入數據庫。定期將這些記錄合併爲彙總數據。

+1

每秒20K的插入只是臨時數據,一旦收集完成,我將運行腳本每隔15-30分鐘記錄所有數據,對其進行標準化(例如,如果相同的IP在同一個網頁上執行100次),那麼臨時表中將有100行數據,並且在標準化表中它將只更新一行以反映100額外vists。 – Mickey 2009-12-08 07:01:13

1

PHP並不適合大容量的Web流量恕我直言。但是,在PHP性能之前,數據庫可能會讓你感到沮喪 - 尤其是使用PHP的連接模型(爲每個請求打開一個新連接)。

我有兩個建議供您參考:

  1. 給SQL接力一看:http://sqlrelay.sourceforge.net/
  2. 檢查出一些PHP加速器:http://en.wikipedia.org/wiki/List_of_PHP_accelerators

SQL繼電器有效地允許PHP連接的蒂森克虜伯優勢這將爲高容量數據庫應用程序提供更好的性能。

PHP加速器(一般來說)緩存PHP操作碼,這節省了每次請求解釋PHP代碼的開銷。

祝你好運!

+0

人至少可以評論他們爲什麼認爲這是一個不好的建議,它看起來像很好的信息,謝謝! – Mickey 2009-12-08 07:03:50

+1

這可能是「PHP不適合高vo lume網站流量「,像Facebook這樣的網站反駁。 – ceejayoz 2009-12-20 18:05:53

+0

公平起見,我確實聲明這只是我的看法。但我應該更具體一些。 PHP並不像其他語言那樣高效,因此不適合大量的網絡流量(並非它不能或不會工作,它不是我認爲的最好的工具)。 http://slashdot.org/story/09/12/20/1433257/The-Environmental-Impact-of-PHP-Compared-To-C-On-Facebook – jckdnk111 2009-12-29 22:31:23

0

寫入文件非常好,但您仍然需要同步文件寫入,這可以讓您回到原來的狀態。

建議:

  • MQ系統,雖然有時數據庫可以更快,
  • 在MQ想法:在內存中的隊列。我知道你說的是PHP,但是我已經在Java/Servlets中看到這樣做很好,
  • 根據您要跟蹤的內容,可以將靜態文件部署到CDN中(您所談論的雲)並批量彙總訪問日誌。允許您租用擴展,
  • INSERT DELAYED好主意,但我不知道MySQL中的積壓/隊列大小是什麼? (任何人)
+0

感謝您的評論。我會研究這個。 – Mickey 2009-12-08 07:04:47

1

我也推薦memcaching。

將數據寫入memcache並定期運行作業將其聚合並進行插入。

寫入實際文件可能會降低您的性能,因爲文件系統訪問速度通常比與可以更有效地處理寫入訪問的數據庫交談要慢。

0

由於您正在跟蹤展示次數,因此如果嘗試僅保存一次,例如每5次保存一次。那麼您仍然有完全「隨機」樣本,並且可以將百分比應用於較大的數據集。

相關問題