關於 refineCollectionShardKey 的更多解釋

最近著手研究 MongoDB 4.4 的一些相關 function
尤其是 refineCollectionShardKey 的解釋讓我很……
一方面我才剛研究 MongoDB,可能也對此設計也不太理解,所以想做一下紀錄

此篇為新手向教學,並非 MongoDB 原始碼深入閱讀,高手們請直接左上離開謝謝。

先備知識

開始這篇文章的解釋之前,先來個先備知識
要使用此 function 之前,必須先知道 Sharding

MongoDB Shard

一組 MongoDB Cluster 都會有多個 Shard Server
每一台 Shard Server 會有多個 Chunk
每一組 Chunk 會有多筆資料

資料中被選定的 Shard Key 會決定資料放置位置

多台 Shard Server 的優勢:

  • 可以做水平擴展
  • Server 負載分擔

MongoDB Chunk

說完 MongoDB Shard 一定要來說說 Chunk 啦!

每個 Chunk 最大容量預設為 64 MB(可以自行調整)

只要 Sharding 功能有開啟,Chunk 的 Auto Split 就會自己打開。
Chunk 只要高達 64 MB,MongoDB 就會幫你 Split(當然你也可以選擇自己 Split)。

正式介紹 refineCollectionShardKey

因此前面冗長先備知識完後,就來正式介紹 refineCollectionShardKey

其實就是針對每個 Chunk 再做更細的區分資料。

假設今天的 Shard Key 選擇「整數 ID」,如果集中寫入 $30 \sim 50$ 之間,
至少可以從中間切開 $40$,讓 Chunk 變成 $30 \sim 40$ 跟 $41 \sim 50$。

可是如果今天大量資料的「整數 ID」集中在 $42$ 呢?如果達到 Chunk 容量上限,也不能做分割,就形成 Jumbo Chunk,不可讀也不可寫。

因此就會使用 refineCollectionShardKey 給下一個 Shard Key 參考去做切割,迴避掉 Jumbo Chunk 問題。

照著官網說明完成命令,也不會馬上變化太大,但資料會隨著未來改變,加了這步驟就是給系統一個參考的讀寫策略。

後記

最近剛結束實習,是時候來講講系上的實習心得了,可以說是還蠻好玩的。

發現很多中文資料都找不到有關 refineCollectionShardKey 用途,就自己來寫一篇了。
如果我有任何錯誤想修正,歡迎底下留言,謝謝大家觀看。