分片叢集元件

wongchaofan發表於2024-07-08

MongoDB分片叢集由以下元件組成:

  • 分片 (shard):每個分片包含分片資料的子集。每個分片必須部署為副本集 (replica set)

  • mongosmongos充當查詢路由器,提供客戶端應用程式和分片叢集之間的介面。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> }
   ...

相關文章