2012-02-28 63 views
1

我有一個運行Mongo和Rails應用程序的web服務器(40gig hd,1 gig ram)。用有限的資源來擴展Mongo的最簡單方法?

Mongo DB是Twitter推文和用戶的文檔商店,擁有數百萬條記錄。我對數據執行map-reduce查詢以提取諸如最常見的主題標籤,單詞,提及等(非常標準的東西)。每條推文的元數據已經存儲,因此map-reduce與單個收集一樣高效。但是,由於它運行在一個(相當)大的數據集上,因此無法實時完成 - 例如,我有一個報告生成器,可以計算出一大堆這些map-reduce排2萬分鍾,需要2萬分鐘的推文。

什麼是最快,最便宜的方式來縮放mongo,特別是在地圖縮減性能?我可以建立一個額外的服務器並分割負載,但是不知道我應該使用分片,複製還是兩者?對於這種情況,分片可能會過度。

會喜歡我的mysql-mongo連接上的一些輸入。 mysql包含存儲每個配置文件的twitter id的twitter配置文件。每個地圖縮短完成時間,它收集所有的ID被供給作爲選項加入到MapReduce的,即:在TwitterTweet

@profile_tweet_ids = current_profile_tweet_ids # array of ids 
@daily_trend = TwitterTweet.daily_trend :query => {:twitter_id => {"$in" => @profile_tweet_ids}} 

MapReduce的功能是這樣的:

def daily_trend(options={}) 
    options[:out] = "daily_trend" 

    map = %Q(function(){ 
       if (this.created_at != null) 
       { 
        emit(this.created_at.toDateString(), 1); 
       } 
      }) 

    result = collection.map_reduce(map, standard_reduce, options) 
    normalize_results(result) 
end 

任何建議表示讚賞!像MongoLab雲服務

回答

0

使用一個..取決於你的雖然價格低廉定義..

2

如果你正在做簡單的計數,求和,唯一等,您可能能夠避免使用完全的map-reduce 。您可以使用$ inc操作符來實時獲取所需的大部分內容。 我在我的博客文章real-time analytics with MongoDB中詳細解釋了這一點。

0

有關使用操作符而不是MapReduce的答案有好處,並且可能會更有利於您獲得實時響應的努力。 MongoDB上的Map Reduce不適用於產生實時響應。

此外,您還可以從新的彙總框架(http://www.mongodb.org/display/DOCS/Aggregation+Framework)中受益,一旦在下一版本中可用即可。

要回答關於如何擴展MapReduce的更一般問題,添加新服務器可能沒有幫助,如果您只是將其添加爲輔助,作爲輔助它將無法存儲您的M/R會產生一個集合,因此內聯是您唯一的選擇。如果您不需要將結果存儲在集合中,那麼這是您最簡單的方法。有關更多信息,請參閱此處的深入討論:http://groups.google.com/group/mongodb-user/browse_thread/thread/bd8f5734dc64117a

分片可以幫助擴展,但請記住,您需要通過mongos進程運行所有內容,配置服務器,並且mongos需要最終確定每個分片返回的結果集,因此,根據您的數據添加新的潛在瓶頸,並且您需要的不僅僅是一臺額外的機器,以使其可靠地工作。

2

聽起來像你的使用案例更多的是在線流/事件處理。 您可以使用mongo或其他數據庫/緩存產品來存儲參考數據,以及用於接收和處理事件的事件處理框架。有幾個工具可以幫助你 - 在我的腦海裏,有一些:Twitter Storm,Apache S4,GigaSpaces XAP(免責聲明 - 我爲GigaSpaces工作)和GridGain。

0

這是不同的數據項之間的連接是(他們讓公衆做分類的數據,更有價值的工作),最有價值的給他們,因此也是最危險的,你http://indresult.com