您可以對分區叢集執行個體中的集合設定資料分區,以充分利用Shard節點的儲存空間和計算效能。
背景資訊
如果沒有對集合設定資料分區,資料將被集中存放在一個Shard節點中,這將導致其他Shard節點的儲存空間和計算效能無法被充分利用。
前提條件
執行個體類型為分區叢集執行個體。
注意事項
片鍵一經設定,不可修改,不可刪除。
執行了資料分區操作後,均衡器會對滿足條件的資料進行拆分,這將佔用執行個體的資源,請在業務低峰期操作。
說明您可以在設定資料分區之前,調整均衡器的使用中視窗,指定它在業務低峰期執行均衡操作。詳情請參見設定Balancer的使用中視窗。
片鍵的選取將影響分區叢集執行個體的效能,關於片鍵選取的案例介紹,請參見如何選擇Shard Key和Shard Keys。
分區策略介紹
分區策略 | 說明 | 適用情境 |
基於範圍的分區 | MongoDB按照片鍵的值的範圍將資料拆分為不同的塊(chunk),每個塊包含了一段範圍內的資料。
| 片鍵的值不是單調遞增或單調遞減、片鍵的值基數大且重複的頻率低、需要範圍查詢等業務情境。 |
基於Hash值的分區 | MongoDB計算單個欄位的雜湊值作為索引值,並以雜湊值的範圍將資料拆分為不同的塊。
| 片鍵的值存在單調遞增或遞減、片鍵的值基數大且重複的頻率低、需要寫入的資料隨機分發、資料讀取隨機性較大等業務情境。 |
除了上述兩種分區策略,您還可以配置複合片鍵,例如由一個低基數的鍵和一個單調遞增的鍵組成,詳情請參見如何選擇Shard Key。
操作步驟
本文以mongodbtest資料庫,customer集合為例介紹操作流程。
對集合所在的資料庫啟用分區功能。
重要如果您的執行個體是MongoDB 6.0及以上版本,可跳過此步驟,更多資訊,請參見sh.enableSharding()。
sh.enableSharding("<database>")
參數說明:
<database>
為資料庫名。樣本:
sh.enableSharding("mongodbtest")
說明您可以通過
sh.status()
查看分區狀態。對片鍵的欄位建立索引。
db.<collection>.createIndex(<keyPatterns>,<options>)
參數說明:
<collection>
:集合名。<keyPatterns>
:包含用於建立索引的欄位和索引類型。常見的索引類型如下:
1:建立升序索引
-1:建立降序索引
"hashed":建立雜湊索引
<options>
:表示接收選擇性參數,詳情請參見db.collection.createIndex(),本操作樣本中暫未使用到該欄位。
建立升序索引樣本:
db.customer.createIndex({name:1})
建立雜湊索引樣本:
db.customer.createIndex({name:"hashed"})
對集合設定資料分區。
sh.shardCollection("<database>.<collection>",{ "<key>":<value> } )
參數說明:
<database>
:資料庫名。<collection>
:集合名。<key>
:分區的鍵,MongoDB將根據片鍵的值進行資料分區。<value>
1:表示基於範圍分區,通常能很好地支援基於片鍵的範圍查詢。
“hashed”:表示基於雜湊分區,通常能將寫入均衡分布到各Shard節點中。
基於範圍分區的配置樣本:
sh.shardCollection("mongodbtest.customer",{"name":1})
基於雜湊分區的配置樣本:
sh.shardCollection("mongodbtest.customer",{"name":"hashed"})
後續操作
經過一段時間的運行或資料寫入後,您可以在Mongo Shell中執行sh.status()
,查看資料在各Shard節點中的分布資訊。
您也可以通過執行db.stats()
查看該資料庫在各Shard節點的資料存放區情況。