2017-02-11 59 views
1

雖然我碰到下面的斷言來瀏覽MongoDB的分片教程:查詢基於片鍵擊中多個碎片

「如果你在查詢中使用片鍵,它會打少數碎片,經常只有一個「

另一方面,從我之前關於分片的一些基本知識來看,如果查詢是在Shard Key上觸發的,mongos路由服務可以唯一地指出目標分片。我的問題是 - 在什麼情況下,基於分片鍵的查詢有可能觸及多個分片?

回答

1

使用分片鍵的查詢將以分片的子集爲目標來檢索您的查詢的數據,但根據查詢和數據分佈情況,這可能少至一個或多至所有分片。

借用上shard keys從MongoDB的文檔一個有用的圖像: Shard key example from MongoDB documentation

MongoDB使用分片鍵自動數據劃分成稱爲片鍵值的邏輯範圍。每個塊默認代表大約64MB的數據,並且與當前擁有該分片鍵值範圍的單個分片相關聯。塊數爲balanced across available shards,並且不存在相鄰塊在同一分片上的期望。

如果查詢屬於單個區塊內的分片鍵值(或值的範圍),那麼mongos肯定可以定位到單個分片。

假設塊範圍如上圖所示:

// Targeted query to the shard with Chunk 3 
db.collection.find({ x: 50 }) 

// Targeted query to the shard with Chunk 4 
db.collection.find({x: { $gte: 200} }) 

如果查詢跨越多個區塊範圍內,mongos可以針對碎片包含有關文件的子集:

// Targeted query to the shard(s) with Chunks 3 and 4 
db.collection.find({x: { $gte: 50} }) 

兩個本例中的塊將位於同一個碎片或兩個不同的碎片上。您可以查看explain results以查詢有關訪問哪些碎片的更多信息。

它也可以構造查詢,將需要所有碎片數據(例如,基於大範圍的碎片的鍵值):

// Query includes data from all chunk ranges 
db.collection.find({x: { $gte: -100} }) 

注:以上信息描述基於範圍的分片。 MongoDB還支持基於散列的分片密鑰,這些密鑰將(在散列之後)(有意地)將相鄰的分片密鑰值分佈到不同的塊範圍。散列分片鍵上的範圍查詢預計包含多個分片。請參閱:Hashed vs Ranged Sharding