MongoDB分片叢集由以下元件組成:
-
分片 (shard):每個分片包含分片資料的子集。每個分片必須部署為副本集 (replica set) 。
-
mongos:
mongos
充當查詢路由器,提供客戶端應用程式和分片叢集之間的介面。mongos
可以支援 對沖讀取以最大限度地減少延遲。 -
配置伺服器:配置伺服器儲存叢集的後設資料和配置設定。從 MongoDB 3.4 開始,配置伺服器必須部署為副本集 (CSRS)。
mongos
路由器與配置伺服器頻繁通訊。隨著路由器數量的增加,效能可能會下降。如果效能下降,請減少路由器數量。您的部署不應超過 30 個mongos
路由器。
通常,不要直接在分片上執行操作,因為它們可能會導致資料損壞或資料丟失。使用者、客戶端或應用程式應僅直接連線到分片來執行本地管理或維護操作。
MongoDB 不保證任何兩個連續的 chunks 位於單個分片上。
主分片
分片叢集中的每個資料庫都有一個主分片,用於儲存該資料庫的所有未分片集合。每個資料庫都有自己的主分片。主分片與副本集中的主分片無關。
配置伺服器
配置伺服器儲存分片叢集的後設資料。後設資料反映了分片叢集內所有資料和元件的狀態和組織。後設資料包括每個分片上的塊列表以及定義塊的範圍。
每個分片叢集必須有自己的配置伺服器。不要對不同的分片叢集使用相同的配置伺服器。
分片叢集後設資料
配置伺服器將後設資料儲存在配置資料庫中。
在對配置伺服器進行任何維護之前,請務必備份config資料庫。
對集合進行分片
sh.shardCollection(<namespace>, <key>) // Optional parameters omitted
namespace 指定要分片的集合的完整名稱空間("<database>.<collection>")。 key 指定一個文件{ <shard key field1>: <1|"hashed">, ... } ,其中 1表示基於範圍的分片 "hashed"表示雜湊分片。
如果您的資料模型需要對單調變化的鍵進行分片,請考慮使用Hashed Sharding 。
分片鍵分析命令
-
db.collection.analyzeShardKey()
殼法
最佳化分片鍵
不要修改任何當前shard鍵欄位的範圍或雜湊型別。它會導致資料不一致。例如,不要將分片金鑰從{customer_id:1}修改為{customer_id:“hashed”,order_id:1}。
要最佳化集合的分片鍵,請使用該 refineCollectionShardKey
命令。該命令 refineCollectionShardKey
將一個或多個字尾欄位新增到現有鍵以建立新的分片鍵。
db.adminCommand( { refineCollectionShardKey: "test.orders", key: { customer_id: 1, order_id: 1 } } )
對集合進行重新分片
單開
尋找分片鍵
每個共享集合都有一個分片鍵。要顯示分片鍵,請連線到mongos
例項並執行該db.printShardingStatus()
方法:
db.printShardingStatus()
輸出類似於:
<dbname>.<collection> shard key: { <shard key> : <1 or hashed> } unique: <boolean> balancing: <boolean> chunks: <shard name1> <number of chunks> <shard name2> <number of chunks> ... { <shard key>: <min range1> } -->> { <shard key> : <max range1> } on : <shard name> <last modified timestamp> { <shard key>: <min range2> } -->> { <shard key> : <max range2> } on : <shard name> <last modified timestamp> ... tag: <tag1> { <shard key> : <min range1> } -->> { <shard key> : <max range1> } ...