最近著手研究 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 用途,就自己來寫一篇了。
如果我有任何錯誤想修正,歡迎底下留言,謝謝大家觀看。