1. 程式人生 > >MongoDB 分片鍵

MongoDB 分片鍵

一. 概述 分片鍵確定集合文件在叢集分片中的分佈。分片鍵可以是集合文件中的單索引或者是混合索引。 MongoDB 使用分片鍵值的範圍在集合中分割槽資料。每個範圍定義一個分片鍵值不重疊並且關聯一個塊。

MongoDB 嘗試在叢集中的分片上均勻地分佈塊。分片鍵直接關係到塊分佈的有效性。


重要:一旦對一個集合分片,分片鍵和分片值就不可改變。 如:不能給集合選擇不同的分片鍵、不能更新分片鍵的值。          二. 分片鍵規範 對集合分片,你必須使用 sh.shardCollection() 方法指定集合和分片鍵。 sh.shardCollection( namespace,
 key )
  • namespace 引數是 database.collection,指定目標集合完整的名稱空間
  • 關鍵引數由包含欄位和該欄位的索引遍歷方向的文件組成。
三. 分片鍵索引 所有的分片集合必須有一個支撐 shard key 的索引。
  • 如果集合為空,如果索引為空,則 sh.shardCollection() 在 shard key 上建立索引
  • 如果集合不為空,你必須在使用 sh.shardCollection() 之前建立索引
如果刪除分片鍵的最後一個有效索引,請通過僅在分片鍵上重新建立索引來恢復。 唯一索引 對於一個已分片的集合,只有 _id 欄位索引和 shard key 上的單索引或者混合索引 是唯一的索引
  • 你不能分片一個唯一索引在其他欄位上的集合
  • 你不能在一個已分片的集合上建立不同欄位的唯一索引
通過使用shard key上的唯一索引,MongoDB可以強制shard鍵值的唯一性。 MongoDB對整個key組合,而不是分片金鑰的單個元件實施唯一性。為了 shard 強制一致性,可以在 sh.shardCollection() 方法的 unique 引數傳入 true 值:
  • 如果集合為空,如果該集合的索引不存在則 sh.shardCollection() 在 shard key 上建立唯一索引
  • 如果集合不為空,在使用 sh.shardCollection() 之前必須建立索引
四. 選擇一個分片鍵 shard key 的選擇影響著「分片叢集均衡器」在可用分片上建立和分佈 chunks。這影響著分片叢集操作的整體效率和效能。 shard key 影響分片叢集所使用的分片策略效率和效能 理想化的 shard key 可以讓 documents 均勻地在叢集中分佈

限制 For restrictions on shard key, see Shard Key Limitations. 集合大小 當要分片的集合不為空的時候,shard key 可以限制集合的最大空間。 分片鍵基數 分片鍵基數決定著均衡器可以建立的最大 chunk 個數。這會減少或者移除叢集水平擴充套件的效率。 一個唯一 shard key 任何時候只能在最多一個 chunk 中出現。如果 shard key 的基數是 4,那麼叢集中 chunks 的個數不能超過 4,各儲存一個唯一 shard key 值。這將叢集中有效分片的數量限制為4 - 新增其他分片不會提供任何好處。 下圖顯示了使用欄位X作為分片鍵的分片叢集。 如果X具有低基數,插入的分佈可能看起來類似於以下:
在此示例中的叢集不會水平擴充套件,因為傳入寫入只會路由到分片的子集。 具有高基數的 shard key 不能保證跨分片簇的資料的均勻分佈,但是它更好地促進水平擴充套件。shard key 的頻率和變化率也有助於資料分發。 選擇分片鍵時請考慮每個因素。 如果您的資料模型需要對具有低基數的鍵進行分片,請考慮使用具有較高相對基數的欄位來使用複合索引。 分片鍵頻率(就是分片鍵的唯一性如何) 考慮一個表示分片鍵值範圍的集合 - 分片鍵的頻率表示給定值在資料中出現的頻率。 如果大多數文件僅包含那些值的子集,則儲存這些文件的塊變為叢集內的瓶頸。此外,隨著這些塊增長,它們可能變成不可分割的塊,因為它們不能被進一步分裂。 這降低或消除了群集內水平擴充套件的有效性。 下圖顯示了使用欄位X作為分片鍵的分片叢集。 如果X的值的子集以高頻出現,則插入的分佈可以看起來類似於以下:
具有低頻率的 shard key 不保證跨分片簇的資料的均勻分佈。 shard key 的基數和變化率也有助於資料分發。 選擇分片鍵時請考慮每個因素。 如果資料模型需要對具有高頻率值的鍵進行分片,請考慮使用唯一或低頻值使用複合索引。 單調改變的分片鍵 對單值增加或減少的值的分片鍵更可能將插入分發到叢集中的單個分片。 這是因為每個叢集都有一個捕獲上限為maxKey的範圍的塊。 maxKey總是比所有其他值高。 類似地,存在捕獲具有minKey的下限的範圍的塊。 minKey總是比低於所有其他值。 如果分片鍵值總是增加,則所有新插入都將路由到以maxKey作為上限的塊。 如果分片鍵值總是遞減,則所有新插入都將以minKey作為下限路由到塊。 包含該塊的分片成為寫入操作的瓶頸。 下圖顯示了使用欄位X作為分片鍵的分片叢集。 如果X的值單調遞增,插入的分佈可能看起來類似於以下:
不單調改變的分片鍵不保證資料跨分片簇的均勻分佈。 shard key 的基數和頻率也有助於資料分發。 選擇分片鍵時請考慮每個因素。 如果您的資料模型需要對單調變化的鍵進行分片,請考慮使用Hashed Sharding。 總結: 整篇其實就是為了說選擇分片鍵要選擇唯一性大的,隨機性大的,推薦使用 Hash Sharding。 參考資料: