【MongoDB】Shard key

1. 使用Shell命令分區

MongoDB提供的分區功能,本節簡單介紹在mongo shell的分區命令。

  • sh.enableSharding(database) 指定database
  • sh.shardCollection(namespace, key, unique, options) 指定Collection
    這裏寫圖片描述

【注意】如果庫中還沒有指定的database則需要順序執行上面兩個命令,如果已經存在指定database,應該可以直接執行命令2。

還有一種命令格式是db.runCommand(),具體的參加官方文檔:
https://docs.mongodb.com/manual/reference/command/enableSharding/#dbcmd.enableSharding
https://docs.mongodb.com/manual/reference/command/shardCollection/

2. Sharding Strategy

有兩種常用的Sharding方式:hashed、ranged。

2.1 Hashed Sharding

Hashed Sharding方式使用在某一字段(Field)上指定哈希索引的方式指定其爲shard key。
指定shard key例子:sh.shardCollection(“ccse.stu”, {“name”:”hashed”})
這裏寫圖片描述

MongoDB自動計算哈希值,用戶不需要對shard key進行哈希。
【注】不清楚MongoDB自帶的哈希函數是什麼。

哈希分片的好處是使得數據分區更加均勻,但是不支持範圍查詢,做範圍查詢就是在所有片上進行搜索。

2.2 Ranged Sharding

基於範圍的分區的好處是能夠支持範圍查詢,指定shard key:sh.shardCollection(“ccse.stu”, {“name” : 1, “height” : 1})。

範圍分區可以指定多個字段,這和指定複合索引差不多。但是需要注意的是:
1. Hashed Sharding只能指定一個字段
2. Ranged Sharding不能同時指定hash字段,即像這樣:sh.shardCollection("ccse.stu", {"name" : 1, "height" : "hashed"}),是不允許的。

下面Ranged Sharding下選取shard key的一些官方建議:

2.2.1 Shard Key的基數

Shard Key的基數決定了Chunk最多有多少。因爲同一Shard Key的被存儲在一個Chunk中,Chunk分裂不會將同一Shard Key的拆分。

假如有如下模型的Document:
{
price : 20
month : 1
}

如果指定month爲shard key,那麼最多隻要12個chunk,如果數據一多,那麼只能是chunk不斷增長,就算增加分片也沒有意義。

如何想要指定的shard key的基數不大,可以考慮複合索引,再加一個基數大的字段。

2.2.2 Shard Key的頻率

再以上面那個例子說明,如果6月的數據特別多,而其他月份的數據很少,這樣就是頻率問題了,也是需要注意的。

2.2.3 Shard Key非單調變化

假如2.2.1節中的例子選擇price爲shard key,如果shard key單調遞增,那麼數據雖然會被分佈到不同節點,但在插入時有可能只會往一個節點上插入。因爲shard key相近的分佈在同一節點,這應該很好理解。
這裏寫圖片描述

2.2.4 Unique Shard Key

對於一個分區的Collection,只有可能存在以下兩種unique key:
1. _id
2. 在shard key上的建立的索引,或複合索引裏shard key包含在首位。

3. Shard Key 的限制

Shard Key size

一個 shard key 大小不能超過512個字節

Shard Key是不可變的

如果你想要換另一種shad key,官方建議以下步驟:

  • Dump all data from MongoDB into an external format.
  • Drop the original sharded collection.
  • Configure sharding using the new shard key.
  • Pre-split the shard key range to ensure initial even distribution.
  • Restore the dumped data into MongoDB.
    簡言之,就是先備份數據,然後刪除,重新選擇shard key,再導入數據。

Shard Key在文檔中的值是不變的

  • 不能換Shard Key
  • 不能更新Shard Key的值

4. 一些實際經驗總結

  • 插入時Shard Key不能重複,否則報錯_dup_key
  • 更新時update文檔必須指定Shard Key,如下圖測試
    這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

參考

https://docs.mongodb.com/manual/core/sharding-shard-key/#shard-key-indexes
https://docs.mongodb.com/manual/core/sharded-cluster-requirements/
https://docs.mongodb.com/manual/reference/limits/#limits-shard-keys

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章