2013-05-27 126 views
1

通過10Gen手冊後,我可以瞭解到在以下情況下分片是如何工作的。我將使用具有userid,lastupdatetime,以下示例的數據的文檔:MongoDB複合密鑰分片和塊大小與磁盤大小

  1. 塊包含Shard ID的有序列表。所以如果我的碎片ID是用戶標識,我期望chunk1包含一個id列表:user1 ... user999(最高64mb限制),chunk2將保存user1000 ... user1999。那是對的嗎?

  2. 在前面的例子中,假設chunk1在shard1上,而chunk2在shard2上。如果user1(位於shard1上)有大量文檔,而其他所有用戶都有1-2個文檔,則會使shard1磁盤使用率比shard 2磁盤使用率大很多。如果這是正確的,那麼MongoDB的緩解在那種情況下是什麼?

  3. 複合碎片鍵是如何在塊內部排列的?例如,如果複合分片鍵是userid + lastupdatetime,假設以下內容(假設user1有大量文檔)是安全的: chunk1包含值列表:user1,10.00:00; user1,10:01:00 ...; user1,14:04:11 ..(高達64mb限制),chunk2將保存user1,14:05:33; user2,9:00:00 ... user34,19:00;;

    是否正確?

回答

1
  1. 是的,你是對的。
  2. 您的分片鍵決定了哪些塊可以拆分。如果您的分片鍵是「userid」,那麼它可以拆分的最小值就是userID。 MongoDB根據文檔大小自動調整塊大小。所以很可能chunk1(在shard1上)只有f.e.具有範圍爲1..10的用戶標識的文檔,以及用戶標識爲11..1000的文檔的塊2(在shard2上)。 MongoDB會自動選擇映射到每個塊的最佳擬合範圍。
  3. 這也是正確的。使用複合分片鍵,文檔可以分割的「單位」是兩個字段的組合。因此,您可以在組塊3中擁有{ MinValue }{ user1, 12:00:00 }塊,{ user1, 12:00:01 }{ user2, 04:00:00 }塊和{ user2, 04:00:01 }{ MaxValue }塊。 MinValueMaxValue是特殊值,比其他所有值都要小,或者更大。第一塊其實並不與第一個值開始(在你的榜樣{ user1, 10:00:00 }而是與MinValue
+0

關於2 - 它並不能完全回答這個問題 - 因此從理論上講,如果用戶1將有很多很多的文件mongo不會把它放在多於一個碎片上? – Alon1980