2014-01-12 28 views
0

我想抓取大量的網頁(1000 /秒)並將1-2個數字從這個網頁保存到數據庫中。我想用RabbitMQ來管理這個工人,但我也必須在某處寫數據。與ruby一起使用的高頻數據庫

Heroku PostgreSQL在其最便宜的生產層中具有60個請求的併發限制。 PostgreSQL是這份工作的最佳解決方案嗎? 是否可以設置Postgres數據庫在本地機器上每秒執行1000次寫入操作?

+0

您的耐用性要求是什麼?你介意如果你失去了最近100次撞車記錄?最後一小時的價值?自上次備份以來的整個數據集?這影響你可以做什麼,以及如何,很多。 –

+0

你的本地機器有多快?它有多少內存?你有多個驅動器?你沒有給我們任何必要的東西來以有意義的方式回答。 –

回答

1

是否可以設置Postgres數據庫在本地機器上每秒執行1000次寫入操作?

試試看看。如果你有SSD,或者不需要安全防護,那麼你幾乎可以肯定。

你會發現,什麼你選擇,你必須權衡耐久性和寫延遲。

如果您想要嚴格按照嚴格的順序逐個提交每條記錄,則應該可以在具有合適SSD的筆記本電腦上實現這一目標。不過,你不可能像便宜的AWS實例,帶有旋轉防鏽硬盤的服務器等等,因爲它們沒有足夠好的磁盤刷新率。 (pg_test_fsync是一個方便查看這個工具)。這對任何將單個記錄的真實原子落實到持久存儲的事情都是如此,而不僅僅是PostgreSQL - 關於您將獲得的最佳速率是最大磁盤刷新速率/ 2,除非它是純粹僅附加系統,在這種情況下提交率可以等於磁盤刷新率。

如果您想獲得更高的吞吐量,您需要批量寫入並將它們分組,以分散磁盤同步開銷。在PostgreSQL的情況下,commit_delay選項可以用於批量提交。更好的是,緩存客戶端的一些更改並執行多值插入。如果您不需要很嚴格的保證,那麼在將控制權返回給您的程序之前將其關閉即可關閉synchronous_commit

我還沒有測試過它,但期望Heroku將允許您在會話中使用SET synchronous_commit = offSET commit_delay = ...設置這兩個參數。你應該測試它並看看。事實上,你應該做一個模擬工作負載基準測試,看看你是否能夠足夠快地滿足你的需求。

如果您不能,您將可以使用替代託管,並進行適當的配置。

參見:How to speed up insertion performance in PostgreSQL

1

PostgreSQL是完全有能力處理這樣的工作。爲了給你一個想法,PostgreSQL 9.2預計到handle up to 14.000 writes per second,但這很大程度上取決於你如何配置,設計和管理數據庫以及可用硬件(磁盤性能,RAM等)。

我假設Heroku強加的限制是避免潛在的過載。您可能需要考慮在自定義服務器上安裝PostgreSQL或其他解決方案。例如,亞馬遜最近宣佈支持PostgreSQL on RDS

最後,我只想提到,對於大多數標準任務,「最佳解決方案」在很大程度上取決於您的知識。高效配置的MySQL比配置錯誤的PostgreSQL更好,反之亦然。

我知道通過高度優化發動機的設置和配置,能夠通過特定數據庫達到意想不到的結果的公司。確實有例外,但我認爲它們不適用於您的案件。

+1

完全同意,一旦核心功能要求得到滿足,最佳配置通常取決於知識。 PostgreSQL有經驗的用戶是否更喜歡使用Pg作爲圖形數據庫,或者學習圖形數據庫?可能不會。 –

+0

Postgres可以做到這一點並不是真正的問題,它可以在OP本地機器上完成,我們不知道機器是什麼或者它會做什麼。專用於該數據庫的計算機上的1000 /秒是好的,但如果它也在運行MQ並處理1000頁下載和每秒擦除次數,則不會。這是很多節點一次運行約1秒。延遲/請求充其量,我認爲結果會比1000 /秒少很多。 –

相關問題