設(shè)置數(shù)據(jù)分片以充分利用Shard性能
您可以對(duì)分片集群實(shí)例中的集合設(shè)置數(shù)據(jù)分片,以充分利用Shard節(jié)點(diǎn)的存儲(chǔ)空間和計(jì)算性能。
背景信息
如果沒有對(duì)集合設(shè)置數(shù)據(jù)分片,數(shù)據(jù)將被集中存放在一個(gè)Shard節(jié)點(diǎn)中,這將導(dǎo)致其他Shard節(jié)點(diǎn)的存儲(chǔ)空間和計(jì)算性能無法被充分利用。
前提條件
實(shí)例類型為分片集群實(shí)例。
注意事項(xiàng)
片鍵一經(jīng)設(shè)置,不可修改,不可刪除。
執(zhí)行了數(shù)據(jù)分片操作后,均衡器會(huì)對(duì)滿足條件的數(shù)據(jù)進(jìn)行拆分,這將占用實(shí)例的資源,請(qǐng)?jiān)跇I(yè)務(wù)低峰期操作。
說明您可以在設(shè)置數(shù)據(jù)分片之前,調(diào)整均衡器的活動(dòng)窗口,指定它在業(yè)務(wù)低峰期執(zhí)行均衡操作。詳情請(qǐng)參見設(shè)置Balancer的活動(dòng)窗口。
片鍵的選取將影響分片集群實(shí)例的性能,關(guān)于片鍵選取的案例介紹,請(qǐng)參見如何選擇Shard Key和Shard Keys。
分片策略介紹
分片策略 | 說明 | 適用場(chǎng)景 |
基于范圍的分片 | MongoDB按照片鍵的值的范圍將數(shù)據(jù)拆分為不同的塊(chunk),每個(gè)塊包含了一段范圍內(nèi)的數(shù)據(jù)。
| 片鍵的值不是單調(diào)遞增或單調(diào)遞減、片鍵的值基數(shù)大且重復(fù)的頻率低、需要范圍查詢等業(yè)務(wù)場(chǎng)景。 |
基于Hash值的分片 | MongoDB計(jì)算單個(gè)字段的哈希值作為索引值,并以哈希值的范圍將數(shù)據(jù)拆分為不同的塊。
| 片鍵的值存在單調(diào)遞增或遞減、片鍵的值基數(shù)大且重復(fù)的頻率低、需要寫入的數(shù)據(jù)隨機(jī)分發(fā)、數(shù)據(jù)讀取隨機(jī)性較大等業(yè)務(wù)場(chǎng)景。 |
除了上述兩種分片策略,您還可以配置復(fù)合片鍵,例如由一個(gè)低基數(shù)的鍵和一個(gè)單調(diào)遞增的鍵組成,詳情請(qǐng)參見如何選擇Shard Key。
操作步驟
本文以mongodbtest數(shù)據(jù)庫(kù),customer集合為例介紹操作流程。
對(duì)集合所在的數(shù)據(jù)庫(kù)啟用分片功能。
重要如果您的實(shí)例是MongoDB 6.0及以上版本,可跳過此步驟,更多信息,請(qǐng)參見sh.enableSharding()。
sh.enableSharding("<database>")
參數(shù)說明:
<database>
為數(shù)據(jù)庫(kù)名。示例:
sh.enableSharding("mongodbtest")
說明您可以通過
sh.status()
查看分片狀態(tài)。對(duì)片鍵的字段建立索引。
db.<collection>.createIndex(<keyPatterns>,<options>)
參數(shù)說明:
<collection>
:集合名。<keyPatterns>
:包含用于建立索引的字段和索引類型。常見的索引類型如下:
1:創(chuàng)建升序索引
-1:創(chuàng)建降序索引
"hashed":創(chuàng)建哈希索引
<options>
:表示接收可選參數(shù),詳情請(qǐng)參見db.collection.createIndex(),本操作示例中暫未使用到該字段。
創(chuàng)建升序索引示例:
db.customer.createIndex({name:1})
創(chuàng)建哈希索引示例:
db.customer.createIndex({name:"hashed"})
對(duì)集合設(shè)置數(shù)據(jù)分片。
sh.shardCollection("<database>.<collection>",{ "<key>":<value> } )
參數(shù)說明:
<database>
:數(shù)據(jù)庫(kù)名。<collection>
:集合名。<key>
:分片的鍵,MongoDB將根據(jù)片鍵的值進(jìn)行數(shù)據(jù)分片。<value>
1:表示基于范圍分片,通常能很好地支持基于片鍵的范圍查詢。
“hashed”:表示基于哈希分片,通常能將寫入均衡分布到各Shard節(jié)點(diǎn)中。
基于范圍分片的配置示例:
sh.shardCollection("mongodbtest.customer",{"name":1})
基于哈希分片的配置示例:
sh.shardCollection("mongodbtest.customer",{"name":"hashed"})
后續(xù)操作
經(jīng)過一段時(shí)間的運(yùn)行或數(shù)據(jù)寫入后,您可以在Mongo Shell中執(zhí)行sh.status()
,查看數(shù)據(jù)在各Shard節(jié)點(diǎn)中的分布信息。
您也可以通過執(zhí)行db.stats()
查看該數(shù)據(jù)庫(kù)在各Shard節(jié)點(diǎn)的數(shù)據(jù)存儲(chǔ)情況。