chunk切分是根據分片策略進行實施的,分片策略的內容包括分片鍵和分片算法。
當前,MongoDB支持兩種分片算法:
- 范圍分片(range sharding)
假設集合根據x字段來分片,x的完整取值范圍為[minKey, maxKey](x為整數,這里的minKey、maxKey為整型的最小值和最大值),其將整個取值范圍劃分為多個chunk。
如:
chunk1包含x的取值在[minKey,-75)的所有文檔。
chunk2包含x取值在[-75,25)之間的所有文檔,依此類推。
范圍分片能很好地滿足范圍查詢的需求,比如想查詢x的值在[-30,10]之間的所有文檔,這時mongos直接將請求定位到chunk2所在的分片服務器,就能查詢出所有符合條件的文檔。
范圍分片的缺點在于,如果Shard Key有明顯遞增(或者遞減)趨勢,則新插入的文檔會分布到同一個chunk,此時寫壓力會集中到一個節點,從而導致單點的性能瓶頸。
一些常見的導致遞增的Key如下:
時間值。
ObjectId,自動生成的_id由時間、計數器組成
UUID,包含系統時間、時鐘序列
自增整數序列
- 哈希分片(hash sharding)
哈希分片會先事先根據分片鍵計算出一個新的哈希值(64位整數),再根據哈希值按照范圍分片的策略進行chunk的切分。
哈希分片與范圍分片是互補的,由于哈希算法保證了隨機性,所以文檔可以更加離散地分布到多個chunk上,這避免了集中寫問題。然而,在執行一些范圍查詢時,哈希分片并不是高效的。因為所有的范圍查詢都必然導致對所有chunk進行檢索,如果集群有10個分片,那么mongos將需要對10個分片分發查詢請求。
哈希分片與范圍分片的另一個區別是,哈希分片只能選擇單個字段,而范圍分片允許采用組合式的多字段作為分片鍵。
哈希分片僅支持單個字段的哈希分片:
{ x : "hashed" }
4.4 以后的版本,可以將單個字段的哈希分片和一個到多個的范圍分片鍵字段來進行組合,比如指定 x:1,y 是哈希的方式:
{x : 1 , y : "hashed"}
分片鍵選擇:
分片鍵的基數,取值基數越大越有利于擴展
分片鍵的取值分布應該盡可能均勻
業務讀寫模式,盡可能分散寫壓力,而讀操作盡可能來自一個或少量的分片
分片鍵應該能適應大部分的業務操作
參考
全面剖析 MongoDB 高可用架構
https://mp.weixin.qq.com/s/jLsviuQ0wCcsmkskXSFdEQ
MongoDB分片(Sharding)技術
https://blog.csdn.net/weixin_52622200/article/details/121613135
mongoDB高可用部署架構——分片集群篇(Sharding)
https://developer.aliyun.com/article/879873