Docs Menu
Docs Home
/

自己管理型シャーディングされたクラスターのレプリカセットへの変換

このチュートリアルでは、 のシャーディングされたクラスターをシャーディングされていないレプリカセットに変換する方法について説明します。レプリカセットをシャーディングされたクラスターに変換するには、「 自己管理型レプリカセットをシャードクラスタに変換 」を参照してください。シャーディングされたクラスターの詳細については、 シャーディング に関するドキュメントを参照してください。

このチュートリアルでは、次のタスクについて説明します。

  1. バランサーを無効にします。

  2. クラスターをレプリカセットに変換します。

  3. クラスターのロックを解除します(マルチシャード クラスターのみ)。

MongoDB 8.0 以降では、 directShardOperations ロールを使用して、メンテナンス操作を実行できます。その操作では、シャードに対してコマンドを直接実行する必要があります。

警告

directShardOperations ロールを使用して コマンドを実行すると、クラスターが正しく動作しなくなり、データが破損する可能性があります。Only use the directShardOperations ロール for maintenance purposes or under the ガイダンス of MongoDB support.メンテナンス操作の実行が終了したら、directShardOperations ロールの使用を停止します。

このチュートリアルの手順にはMongoDB 6.0 以降が必要です。

fsyncfsyncUnlockコマンドと コマンドには 認可アクションが必要です。このアクションは、fsync hostManagerロールまたはカスタムロールを通じて割り当てられます。

チャンクの移行、再シャーディング、スキーマ変換が通常実行されない場合は、 クラスターを変換します 。

MongoDB 8.3 以降では、以前にシャーディングされたクラスターであったレプリカセットをレプリカセットに変換することはできません。

シャーディングされたクラスターをレプリカセットに変換すると、 シャード ID documentなど、以前の配置のシャーディングメタデータが保持され、再度シャーディングされたクラスターになるのがブロックされます。自己管理型変換をシャーディングされたクラスターに戻しようとすると、 MongoDB はエラーを返します。

このようなレプリカセットをシャーディングされたクラスターに変換するには、テクニカル サポート にお問い合わせください。

シャードが 1 つしかないシャードクラスターの場合、そのシャードには完全なデータセットが含まれます。そのクラスターをシャーディングされていないレプリカセットに変換するには :

1

バランサーを無効にするには:

  1. mongoshmongosをシャーディングされたクラスター内の インスタンスに接続します。

  2. バランサー を停止するには、次のコマンドを実行します。

    sh.stopBalancer()
  3. バランサーが無効になっていることを確認するには、次のコマンドを実行し、出力が false であることを確認します。

    sh.getBalancerState()
2
  1. すべての mongos インスタンスを停止します。

  2. 新しいレプリカセットとなるシャードのレプリカセットに直接接続するようにアプリケーションを再構成します。

  3. レプリカセットのノードのローリング再起動を実行して、--shardsvr mongodから オプションを除きます。

    Tip

    --shardsvrオプションを変更すると、mongodが着信接続をリッスンするポートが変更されます。

単一シャード クラスターは、データセットに対する読み取りおよび書き込み (write) 操作を受け入れる非シャーディングのレプリカセットになりました。必要に応じて、コンフィギュレーションサーバーを廃止できます。

複数のシャードを持つシャーディングされたクラスターから完全に新しいレプリカセットに移行するには、次の手順に従います。

1

バランサーを無効にしてクラスターをロックには、次の手順に従います。

  1. mongoshmongosシャーディングされたクラスター内の インスタンスに を接続します。

  2. バランサー を停止するには、次のコマンドを実行します。

    sh.stopBalancer()
  3. バランサーが無効になっていることを確認するには、次のコマンドを実行し、出力が false であることを確認します。

    sh.getBalancerState()
  4. シャーディングされたクラスターをロック、データベースへの書込みを防ぐには、次のコマンドを実行します。

    db.getSiblingDB( "admin" ).fsyncLock()
  5. ロック を確認するには、次のコマンドを実行します。

    db.getSiblingDB( "admin" ).aggregate( [
    { $currentOp: { } },
    { $facet: {
    "locked": [
    { $match: { $and: [
    { fsyncLock: { $exists: true } }
    ] } }
    ],
    "unlocked": [
    { $match: { fsyncLock: { $exists: false } } }
    ]
    } },
    { $project: {
    "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] },
    "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] }
    } }
    ] )
  6. 出力で fsyncLockedtrue であることを確認します。これはクラスタがロックされていることを意味します。

    [ { fsyncLocked: true }, { fsyncUnlocked: false } ]
2
  1. シャーディングされたクラスター をロックし、バランサーを無効にした状態で、シャーディングされたクラスターに加えて新しいレプリカセットを配置します。レプリカセットには、現在のすべてのシャードからのすべてのデータファイルを組み合わせて保持できる十分なキャパシティーが必要です。 データ転送が完了するまで、アプリケーションを新しいレプリカセットに接続するように構成しないでください。

  2. アプリケーションを再構成するか、すべての mongos インスタンスを停止します。すべての mongos インスタンスを停止すると、アプリケーションはデータベースから読み取りません。すべての mongos インスタンスを停止する場合は、データ移行手順のためにアプリケーションがアクセスできない一時的な mongos インスタンスを起動します。

  3. mongodump と mongorestoreを使用して、 mongosインスタンスから新しいレプリカセットにデータを移行します。

    mongorestore を実行する場合は configデータベースを除外します。 --nsExcludeこの例に示すように、 オプションを使用します。

    mongorestore --nsExclude="config.*" <connection-string> /data/backup

    注意

    必ずしもすべてのデータベースのすべてのコレクションがシャーディングされているわけではありません。 シャーディングされたコレクションのみを移行しないでください。 すべてのデータベースとすべてのコレクションが正しく移行されていることを確認します。

  4. インスタンスの代わりに、シャーディングされていない レプリカセット mongosを使用するようにアプリケーションを再構成します。

    シャーディングされたクラスターをレプリカセットに変換した後、アプリケーションで使用される 接続文字string stringをレプリカセットの に更新します。次に、アプリケーションを再起動します。

アプリケーションでは、読み取りと書き込みにシャーディングされていないレプリカセットが使用されるようになりました。残っている未使用のシャーディングされたクラスター インフラストラクチャを廃止できるようになりました。

3

シャーディングされたクラスターをレプリカセットに変換した後、クラスターのロックを解除します。

  1. クラスターのロックを解除してデータベースへの書込みを再開できるようにするには、次のコマンドを実行します。

    db.getSiblingDB( "admin" ).fsyncUnlock()
  2. ロックを確認するには、次のコマンドを実行します。

    db.getSiblingDB( "admin" ).aggregate( [
    { $currentOp: { } },
    { $facet: {
    "locked": [
    { $match: { $and: [
    { fsyncLock: { $exists: true } }
    ] } } ],
    "unlocked": [
    { $match: { fsyncLock: { $exists: false } } }
    ]
    } },
    { $project: {
    "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] },
    "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] }
    } }
    ] )
  3. 出力に fsyncLockedfalse であることが表示されていることを確認します。これは、クラスタがロックされていないことを意味します。

    [ { fsyncLocked: false }, { fsyncUnlocked: true } ]

シャーディングされたクラスター バランサーの管理

戻る

クラスターメタデータのバックアップ

項目一覧