chunk切分是根據(jù)分片策略進(jìn)行實(shí)施的,分片策略的內(nèi)容包括分片鍵和分片算法。
當(dāng)前,MongoDB支持兩種分片算法:
- 范圍分片(range sharding)
假設(shè)集合根據(jù)x字段來(lái)分片,x的完整取值范圍為[minKey, maxKey](x為整數(shù),這里的minKey、maxKey為整型的最小值和最大值),其將整個(gè)取值范圍劃分為多個(gè)chunk。
如:
chunk1包含x的取值在[minKey,-75)的所有文檔。
chunk2包含x取值在[-75,25)之間的所有文檔,依此類(lèi)推。

范圍分片能很好地滿足范圍查詢(xún)的需求,比如想查詢(xún)x的值在[-30,10]之間的所有文檔,這時(shí)mongos直接將請(qǐng)求定位到chunk2所在的分片服務(wù)器,就能查詢(xún)出所有符合條件的文檔。
范圍分片的缺點(diǎn)在于,如果Shard Key有明顯遞增(或者遞減)趨勢(shì),則新插入的文檔會(huì)分布到同一個(gè)chunk,此時(shí)寫(xiě)壓力會(huì)集中到一個(gè)節(jié)點(diǎn),從而導(dǎo)致單點(diǎn)的性能瓶頸。
一些常見(jiàn)的導(dǎo)致遞增的Key如下:
時(shí)間值。
ObjectId,自動(dòng)生成的_id由時(shí)間、計(jì)數(shù)器組成
UUID,包含系統(tǒng)時(shí)間、時(shí)鐘序列
自增整數(shù)序列
- 哈希分片(hash sharding)
哈希分片會(huì)先事先根據(jù)分片鍵計(jì)算出一個(gè)新的哈希值(64位整數(shù)),再根據(jù)哈希值按照范圍分片的策略進(jìn)行chunk的切分。

哈希分片與范圍分片是互補(bǔ)的,由于哈希算法保證了隨機(jī)性,所以文檔可以更加離散地分布到多個(gè)chunk上,這避免了集中寫(xiě)問(wèn)題。然而,在執(zhí)行一些范圍查詢(xún)時(shí),哈希分片并不是高效的。因?yàn)樗械姆秶樵?xún)都必然導(dǎo)致對(duì)所有chunk進(jìn)行檢索,如果集群有10個(gè)分片,那么mongos將需要對(duì)10個(gè)分片分發(fā)查詢(xún)請(qǐng)求。
哈希分片與范圍分片的另一個(gè)區(qū)別是,哈希分片只能選擇單個(gè)字段,而范圍分片允許采用組合式的多字段作為分片鍵。
哈希分片僅支持單個(gè)字段的哈希分片:
{ x : "hashed" }
4.4 以后的版本,可以將單個(gè)字段的哈希分片和一個(gè)到多個(gè)的范圍分片鍵字段來(lái)進(jìn)行組合,比如指定 x:1,y 是哈希的方式:
{x : 1 , y : "hashed"}
分片鍵選擇:
分片鍵的基數(shù),取值基數(shù)越大越有利于擴(kuò)展
分片鍵的取值分布應(yīng)該盡可能均勻
業(yè)務(wù)讀寫(xiě)模式,盡可能分散寫(xiě)壓力,而讀操作盡可能來(lái)自一個(gè)或少量的分片
分片鍵應(yīng)該能適應(yīng)大部分的業(yè)務(wù)操作
參考
全面剖析 MongoDB 高可用架構(gòu)
https://mp.weixin.qq.com/s/jLsviuQ0wCcsmkskXSFdEQ
MongoDB分片(Sharding)技術(shù)
https://blog.csdn.net/weixin_52622200/article/details/121613135
mongoDB高可用部署架構(gòu)——分片集群篇(Sharding)
https://developer.aliyun.com/article/879873