MongoDB 分片鍵
阿新 • • 發佈:2018-12-24
一. 概述
分片鍵確定集合文件在叢集分片中的分佈。分片鍵可以是集合文件中的單索引或者是混合索引。
MongoDB 使用分片鍵值的範圍在集合中分割槽資料。每個範圍定義一個分片鍵值不重疊並且關聯一個塊。
key )
限制 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。 參考資料:
MongoDB 嘗試在叢集中的分片上均勻地分佈塊。分片鍵直接關係到塊分佈的有效性。
- namespace 引數是 database.collection,指定目標集合完整的名稱空間
- 關鍵引數由包含欄位和該欄位的索引遍歷方向的文件組成。
- 如果集合為空,如果索引為空,則 sh.shardCollection() 在 shard key 上建立索引
- 如果集合不為空,你必須在使用 sh.shardCollection() 之前建立索引
- 你不能分片一個唯一索引在其他欄位上的集合
- 你不能在一個已分片的集合上建立不同欄位的唯一索引
- 如果集合為空,如果該集合的索引不存在則 sh.shardCollection() 在 shard key 上建立唯一索引
- 如果集合不為空,在使用 sh.shardCollection() 之前必須建立索引
限制 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。 參考資料: