1. ホーム
  2. データベース
  3. モンゴルディーブ

MongoDBプライマリシャード概要

2022-01-19 05:57:23

01 プライマリシャードとは何ですか?

  シャードクラスターの各データベースには、シャード化されていない現在のデータベース内のコレクションのデータを保持するプライマリシャードがあり、プライマリシャードとマスターノード(プライマリー)の間には関連性はありません。

   プライマリシャードは mongos によって選択されます。新しいデータベースが作成されるたびに、mongos はクラスタから最も少ないデータを含むシャードを新しいデータベースのプライマリシャードとして選択するという事実に基づいています。具体的には以下のように選択されます。

listDatabaseコマンドで返されるtotalSizeフィールドを選択基準として選択します。以下のようになります。

mongos> db.adminCommand("listDatabases")
{
  "databases" : [
    {
      xxxx
    },
    {
      xxxx
    },
    {
      xxxx
    }
  ],
  "totalSize" : 2842624,
  "totalSizeMb" : 2,
  "ok" : 1,
  "operationTime" : Timestamp(1610982469, 1),
  "$clusterTime" : {
    "clusterTime" : Timestamp(1610982469, 1),
    "signature" : {
      "hash" : BinData(0,"knqdZrxpyGFdSi0gljxCQG4LJ9U="),
      "keyId" : NumberLong("6894922308364795934")
    }
  }
}

   データベースのプライマリスライスを手動で選択したい場合は、movePrimaryコマンドを使用します。プライマリスライスの移行処理には時間がかかるので、移行が完了するまでデータベースや対応するコレクションにはアクセスしないようにしましょう。移行処理はクラスタ全体の運用に影響を与える可能性があるため、このコマンドは一般に自発的に使用すべきではありません。どうしても使用したい場合は、ネットワーク負荷への影響を必ず考慮してください。

   レプリカセットから変更した構成でシャードクラスターを展開した場合、レプリカセット上のそれらのデータベースのプライマリシャードは元のレプリカセットに残り、後から作成したデータベースのみが他のシャードにプライマリシャードを設定することができます。

02 マスターシャードを移行する方法

   ここでは、movePrimaryコマンドを使用して、データベースのプライマリシャードを移行する方法を説明します。

まず、新しいデータベースのテストコレクションの現在のプライマリスライスがsharding_yeyzスライス上にあることを確認しましょう。以下のように、new.testのプライマリスライスです。

mongos> sh.status()
--- Sharding Status --- 
 shards:
  { "_id" : "sharding_yeyz", "host" : "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020& quot;, "state" : 1, "tags" : [ "1_1000" ] }
  { "_id" : "sharding_yeyz1", "host" : "sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026& quot;, "state" : 1, "tags" : [ "1000_", "1000_2000" ] }
 
 databases:
   ...
  { "_id" : "new", "primary" : "sharding_yeyz", "partitioned" : true, "version" : { "uuid" : { "1000_", "1000_2000" } databases: ... "uuid" : UUID("68c70c64-f732-4478-8851-06dad4b94d6b"), "lastMod" : 1 } }
    new.test
      shard key: { "number" : 1 }
      unique: false
      balancing: true
      chunks:
        sharding_yeyz 3
        sharding_yeyz1 1
      { "number" : { "$minKey" : 1 } } -->> { "number" : 1 } on : sharding_yeyz Timestamp(2, 1) 
      { "number" : 1 } -->> { "number" : 1000 } on : sharding_yeyz Timestamp(1, 2) 
      { "number" : 1000 } -->> { "number" : 2000 } on : sharding_yeyz1 Timestamp(2, 0) 
      { "number" : 2000 } -->> { "number" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 5) 
       tag: 1_1000 { "number" : 1 } -->> { "number" : 1000 }
       tag: 1000_2000 { "number" : 1000 } -->> { "number" : 2000 }

{

次に、movePrimaryコマンドを使用します。これを使う前に、どのように実行されるかを知っておく必要があります。

1、まずクラスタメタデータのプライマリスライス情報を修正する

2. 次に、スライスを持たないすべてのコレクションを指定されたマスタースライスに移動させる

**mongos上でしか実行できません。

コマンドは次のように使用します。

db.adminCommand( { movePrimary: <databaseName>, to: <newPrimaryShard> } )

Example.
db.adminCommand( { movePrimary : "new", to : "sharding_yeyz1" } )

実行した後

db.adminCommand( { movePrimary : "new", to : "sharding_yeyz1" } )

その後、結果は以下のようになります。

mongos> sh.status()
--- Sharding Status --- 
 shards:
  { "_id" : "sharding_yeyz", "host" : "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020& quot;, "state" : 1, "tags" : [ "1_1000" ] }
  { "_id" : "sharding_yeyz1", "host" : "sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026& quot;, "state" : 1, "tags" : [ "1000_", "1000_2000" ] }

 databases:
  { "_id" : "new", "primary" : "sharding_yeyz1", "partitioned" : true, "version" : { "uuid" : UUID("68c70c64-f732-4478-8851-06dad4b94d6b"), "lastMod" : 2 } }
    new.test
      shard key: { "number" : 1 }
      unique: false
      balancing: true
      chunks:
        sharding_yeyz 3
        sharding_yeyz1 1
      { "number" : { "$minKey" : 1 } } -->> { "number" : 1 } on : sharding_yeyz Timestamp(2, 1) 
      { "number" : 1 } -->> { "number" : 1000 } on : sharding_yeyz Timestamp(1, 2) 
      { "number" : 1000 } -->> { "number" : 2000 } on : sharding_yeyz1 Timestamp(2, 0) 
      { "number" : 2000 } -->> { "number" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 5) 
       tag: 1_1000 { "number" : 1 } -->> { "number" : 1000 }
       tag: 1000_2000 { "number" : 1000 } -->> { "number" : 2000 }

ご覧の通り、メインスライスの移行が完了しました。

以上、MongoDBのプライマリシャードについてまとめました。MongoDBのプライマリシャードについての詳しい情報は、BinaryDevelopの他の関連記事にも注目してください。