Mongodb

超出 MongoDB ……現在呢?

  • September 13, 2019

我們將調試和事務日誌轉儲到MongoDB.

我們真的很喜歡MongoDB,因為:

  • 熾熱的插入性能
  • 文件導向
  • 能夠在需要性能時讓發動機掉落刀片

但是有一個大問題MongoDB:索引必須適合物理RAM。實際上,這將我們限制為 80-150 GB 的原始數據(我們目前在具有 16 GB RAM 的系統上執行)。

因此,要讓我們擁有 500 GB 或 1 tb 的數據,我們需要 50 GB 或 80 GB 的 RAM。

是的,我知道這是可能的。我們可以添加伺服器並使用MongoDB sharding. 我們可以購買一個可以佔用 100 或 200 GB RAM 的特殊伺服器盒,但這是在搖尾巴!FOSS當 SQL Server Express 可以在少得多的硬體上處理多得多的數據時,我們可以花費 boucoup $$$ 來執行硬體Mongo(SQL Server 不能滿足我們的架構需求,否則我們會使用它!)我們不會花費巨資$ 在這裡的硬體上,因為它只是因為Mongo架構才需要,而不是因為固有的處理/儲存需求。(還有分片?拋開成本不談,誰需要三個、五個或更多伺服器的持續複雜性來管理相對較小的負載?)

底線:MongoDBFOSS,但我們得花錢

$$ $$$$$ 在硬體上執行嗎?我們寧願買商業軟體! 我確信我們不是第一個遇到這個問題的人,所以我們問社區:

我們接下來要去哪裡?

(我們已經執行 Mongo v2)

我們在 Mongo 論壇上發布了同樣的問題,Mongo CTO 回复說要查看他關於如何優化索引的展示文稿

http://www.10gen.com/presentations/mongosf2011/schemascale

在本次演講中,Horowitz 先生明確指出,在許多情況下,分片/水平擴展可能是多餘的,並且設計方法(包括一些特定於 Mongo 的相當不直覺的方法)可以使給定的伺服器擴展得更遠。

這提出了一些有趣的概念,包括使用客戶端邏輯來優化數據庫以多種“非規範化”方式使用的方式。展示文稿有一個明確的潛台詞,大意是“如果你只是按照書本建構,你可以很容易地遇到與縮放相關的不需要的問題。” 例如,Horowitz 先生(10Gen 的首席技術官,MongoDB 的製造商)提出了一種“混合”設計,在該設計中,您在一個文件中放置了大約 100 個“記錄”,而不是每個“記錄”一個文件,從而形成“桶”類的方法。這樣做是為了減少索引佔用空間。這是在客戶端上編碼的東西,而不是 MongoDB 的“功能”。這種混合方法可能對我們有用,並且可以使我們的索引大小提高 4 倍或 8 倍。

他還討論了“右平衡”btree,它基本上是在優化索引設計,以便大多數查詢只訪問索引的“右手部分”(與跨索引的隨機訪問相反,後者為了表現良好,需要整個索引適合 RAM)。這種方法對我們沒有幫助,因為我們需要查詢整個索引。

我們將使用這些概念作為我們系統審查的一部分。

(有趣的是,在我發布這個問題的所有地方中,唯一有建設性回應的人是 MongoDB 本身的 CTO。)

更新(2017)

我們最終發現 Mongodb 不適合生產環境。每隔幾個月,它就會轉儲/丟棄整個數據庫,並且所有數據都會失去。(它不是一個主要的數據源,所以我們可以忍受這個問題,雖然不是很開心。)

我們現在已經完成了一個遷移到 elasticsearch 堆棧的項目,並且現在正在將其投入生產。(我們已經成功使用了 Elasticsearch 多年。)Elasticsearch 數據不如 Microsoft SQL Server 那樣持久(我們曾遇到過 Elasticsearch 集群因無法恢復的數據失去而失敗),但 Elasticsearch 至少是 10 倍(經驗上超過 100 倍) ) 比MongoDB更可靠。(Elasticsearch 智能地不假裝支持 Windows 作為生產平台,這是 Mongodb 的一大罪過。)

我們希望在接下來的幾週內清除整個 Mongodb 環境。

向前!

更新(2018-2019)

elasticsearch 堆棧已傳遞。我們發現它非常可靠,非常可擴展,並且根本沒有回頭。Mongo當時聞起來很香,但它已經消失了好幾年,而且很好擺脫它。我們一直在執行兩個彈性集群,一個用於日誌數據(它取代了我們的 Mongo 伺服器),另一個用於實際應用程序數據。每個集群有 1-2TB 的數據。需要大量的架構工作(特別是在應用程序方面)才能獲得彈性以適應規模和性能,但傳遞它確實如此。

如果您處於目前性能太慢或達到限制的地步,那麼您有三個選擇。它們適用於任何問題。

  1. 垂直擴展:意味著增加你的機器功率。更多 CPU 或更多 RAM。
  2. 橫向擴展:意味著增加工人的數量。更多程序、更多執行緒、更多機器。
  3. 改變設計:做不同的事。其他軟體、其他算法、其他儲存系統等等。

由於您從選項中排除了 1) 和 2),因此只剩下解決方案 3)。所以去吧…

引用自:https://serverfault.com/questions/335263