我們目前正在考慮將Postgres改爲CouchDB以用於使用情況監控應用程序。一些數字:CouchDB的推薦文檔結構
大約2000個連接,每5分鐘輪詢一次,每天大約600,000個新行。在Postgres裏,我們存儲這些數據,按天分區:
t_usage {的service_id,時間戳,DATA_IN,DATA_OUT}
t_usage_20100101繼承t_usage。
t_usage_20100102繼承t_usage。等等。
我們用樂觀的存儲過程編寫數據,假定存在分區並在必要時創建分區。我們可以很快插入。
對於數據,我們使用的情況下,在重要性和當前性能的順序讀是:
*單服務,單日使用方法:良好的性能
*多種服務,月使用方法:性能不佳
*單服務,月使用方法:性能不佳
*多服務,多月:非常差的性能
*多服務,單日:良好性能
這是有道理的,因爲分區幾天優化,這是迄今爲止我們最imp ortant用例。但是,我們正在研究改進二級要求的方法。
我們經常需要以小時爲參數來查詢查詢,例如,只在上午8點到下午6點之間給出結果,因此彙總表的用途有限。 (這些參數會以足夠的頻率更改,以至於無法創建多個數據彙總表)。
在這種背景下,第一個問題是:CouchDB是否適合這些數據?如果是這樣,在上述用例的情況下,如何最好地對CouchDB文檔中的數據建模?到目前爲止,我已經把一些選項,我們都在標杆的過程是(_id,_rev除外):
一個文檔每連接每一天
{
service_id:555
day:20100101
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
大約60,000個月新文檔。大多數新數據將是對現有文檔的更新,而不是新文檔。
(這裏,使用中的對象被鎖定在輪詢的時間戳上,並且值被字節輸入和輸出)。
一個文檔每連接每月
{
service_id:555
month:201001
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
約2,000個月新文檔。適度更新所需的現有文檔。
一個文檔中每個數據的收集行
{
service_id:555
timestamp:1265248762
in:584
out:11342
}
{
service_id:555
timestamp:1265249062
in:94
out:1242
}
大約有1500萬新文檔一個月。所有數據都將插入到新文檔中。插入速度更快,但是我對於一年或兩年後擁有數億份文檔的效率會有何疑問。文件IO看起來似乎過分(儘管我是第一個承認我沒有完全理解它的機制)。
我想在一個面向文檔的方式來處理這一點,雖然打破了RDMS習慣是很難:)你只能微創參數化的意見,以及有我有點擔心的事實。也就是說,以上哪一種最合適?有沒有其他格式我沒有考慮哪個會更好?
在此先感謝,
傑米。
CouchDB將爲視圖服務器啓動多個系統進程來處理視圖,因此它可以在多個內核之間進行縮放。 CouchDB的其餘部分在Erlang中,並且在使用多個內核方面也很出色。 – mikeal 2010-02-06 05:58:41
你說得對。我運行了一個測試,並且將這些大文檔中的2000個(每個插入100個同時進行的20個進程)插入v0.9 Couch實例。在4核心2.66G Mac Pro上,這些插件基本上是3分30秒。沙發佔了CPU的350%。最後磁盤文件是〜2G。即使壓實後,它幾乎沒有改變。相反,插入2000個「單日」文件需要18秒。當然,速度要快得多。 3分30秒太接近他們擁有的5米窗口。 18歲要好得多。雖然壓實需要近3百萬美元。 – 2010-02-06 09:17:56
非常感謝,因爲這是一個很好的開始。我們已經運行了一些基準測試,發現和你一樣。我們將要面對的主要問題是對數據的不斷更新 - 看起來對於「整個月份」文檔來說它會變得非常慢。只要我們能夠經常壓縮,希望我們會好起來的。 這是一個恥辱,我們不能去每個數據點的文件,但正如你懷疑文件IO似乎是禁止的。不幸的是要更新任何其他類型的文件,我們需要閱讀之前,我們可以寫,以獲得_rev ... – majelbstoat 2010-02-07 13:29:24