在做一些MongoDB分片的初步測試時,我希望並期望執行查詢的時間只會觸及一個分片/機器上的單個數據塊,因爲更多的數據被加載時會保持相對恆定。但我發現一個顯着的放緩。MongoDB分片可擴展性 - 查詢單個塊的性能?
一些細節:
對於我的簡單測試,我用兩臺機器分片,並試圖查詢類似的藏品有2萬行和700萬行。這些顯然非常小的集合,甚至不需要分片,但我很驚訝已經看到只有一個塊的查詢有顯着的一致性放緩。查詢包括分片鍵,用於從10s到100000s的結果集,我測量了滾動整個結果集所需的總時間。還有一件事:由於我的應用程序實際上需要的數據量遠遠超過RAM,因此所有查詢都基於冷藏緩存進行計時。
任何想法,爲什麼會這樣?其他人是否觀察到相同或矛盾的結果?
進一步細節(由Theo提示):
對於這個測試,行太小(5列包括_id),和密鑰不是基於_id,而是基於一個多值文本列幾乎總是出現在查詢中。
db.printShardingStatus()命令顯示了有多少個塊以及用於分塊的精確鍵值。該數據集的平均塊包含超過100,000行,並且對關鍵值分割的檢查可驗證測試查詢是否正在創建單個塊。
就本次測試而言,我只測量讀數。沒有插入或更新。
更新:
在一些額外的研究,我相信我確定了放緩的原因:MongoDB的塊是純粹的邏輯,以及其中的數據不是物理上位於一起(來源:「縮放的MongoDB 「由克里斯蒂娜Chodorow)。這與在Oracle和MySQL等傳統數據庫中進行分區相反。這似乎是一個重要的限制,因爲分片會隨着碎片/機器的增加而水平放大,但在垂直維度上不太好,因爲將數據添加到具有固定數量碎片的集合中。
如果我正確地理解了這一點,如果我有一個包含10個分片/機器的十億行的集合,那麼即使是隻有一個分片/機器的查詢仍然從包含1億行的大集合中查詢。如果分片密鑰的值恰好位於磁盤上,則可能是好的。但是,如果不是,並且我獲取的行數超過了幾行(例如1000),那麼這可能會導致很多I/O問題。
所以我的新問題是:爲什麼不在物理上組織MongoDB塊以實現垂直和水平可伸縮性?