2011-03-14 71 views
0

我在Web應用程序的高層次的設計,具有以下特點的工作:頻繁大,多記錄更新

  • 數百萬條記錄
  • 重索引/搜索按不同標準
  • 可變文檔架構
  • 定期更新的10K塊 - 一次
  • 數據需要更新
  • 期間保持高度可用200K記錄
  • 必須水平地擴展

今天,這個應用程序存在於MySQL和我們從幾個巨大的問題的困擾,特別是它是具有挑戰性的適應靈活的模式,而大批量更新鎖定數據10 - 每次15秒,這是不可接受的。在MySQL環境中,可以通過更好的數據庫設計來解決其中一些問題,但是,我正在尋找更好的「下一代」解決方案。

我從來沒有使用MongoDB,但它的功能集似乎與我正在尋找的最接近的匹配,所以這是我的第一個感興趣的領域。它有一些令我興奮的事情,比如數據分片,在單個語句中查找更新返回的能力,以及NoSQL的模式靈活性。

有兩件事情我不知道,不過,與MongoDB的:

  1. 我似乎無法找到有關的 更新大型數據集的併發性固體 信息(見我 以上使用情況),所以我有一個難 時間瞭解如何可能 執行。

  2. 我需要打開的文本搜索

這第二個要求給我帶來了Lucene的(或可能到Solr,如果我一直是外部的)作爲搜索商店。我讀過一些Lucene被完全用來代替MongoDB等NoSQL數據庫的例子,這讓我想知道,如果我試圖在單個應用中使用兩者,我是否過於複雜化 - 也許我應該直接存儲所有東西在Lucene中並運行它?

鑑於上述要求,是否看起來像MongoDB和Lucene的組合會使這項工作有效?如果沒有,嘗試在Lucene中完全解決它會更好嗎?

回答

1

目前在MongoDB中,更新鎖定在服務器級別。有幾個JIRA可以解決這個問題,計劃在v1.9-2.0。我相信目前的計劃是產生寫入以使讀取性能更好。如此說來,有很多很好的方法來擴展MongoDB以實現超高併發性 - 其中很多與MySQL相似。一個這樣的例子是使用RAID 10.另一個例子是使用從主機寫入的主從機從主機讀取數據。

您還需要考慮您的「寫入」數據是否需要1)耐用,並且2)可以立即通過從站訪問。mongodb驅動程序允許您指定是否要將數據立即寫入磁盤(或掛載到內存中以用於下一個fsync),並允許您指定數據應該寫入的從機數量。這兩個都會減慢MongoDB的寫入速度,正如上面提到的那樣會影響讀取性能。

MongoDB也幾乎沒有Solr \ Lucene擁有的全文搜索功能,而且您可能希望將它們一起使用。我目前正在同時使用Solr和MongoDB,並對此感到滿意。