Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

シャーディングされたクラスターからシャードを削除する

項目一覧

  • このタスクについて
  • 始める前に
  • 手順
  • 詳細

シャードを削除するには、シャードのデータがクラスター内の残りのシャードに移行されていることを確認する必要があります。 この手順では、データを安全に移行し、シャードを削除する方法について説明します。

  1. この手順では、 sh.moveCollection()メソッドを使用して、削除されたシャードからコレクションを移動します。 この手順を開始する前に、コマンドの動作を理解するためにmoveCollection考慮事項要件を確認してください。

  2. シャードを削除するには、まず を使用してクラスターの インスタンスのmongos 1mongosh つに接続します。

1

シャードからデータを移行するには、バランサープロセスを有効にする必要があります。 バランサーの状態を確認するには、 sh.getBalancerState()メソッドを使用します。

sh.getBalancerState()

操作がtrueを返す場合、バランサーは有効になっています。

この操作でfalseが返される場合は、 「 バランサーを有効にする 」を参照してください。

2

シャードの名前を見つけるには、 listShardsコマンドを実行します。

db.adminCommand( { listShards: 1 } )

shards._idフィールドにはシャード名が含まれます。

3

削除するシャードのremoveShardコマンドを実行します。

db.adminCommand( { removeShard: "<shardName>" } )

注意

"majority"は、mongos コマンドの書込み保証( writeremoveShard concern )を に変換します。

removeShard操作は以下を返します。

{
"msg" : "draining started successfully",
"state" : "started",
"shard" : "<shardName>",
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [
"db1",
"db2"
],
"ok" : 1,
"operationTime" : Timestamp(1575398919, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1575398919, 2),
"signature" : {
"hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

シャードはdraining状態になり、バランサーは削除されたシャードからクラスター内の他のシャードへのチャンクの移行を開始します。 これらの移行はクラスター全体への重大な影響を回避するために、低速で行われます。 ネットワークキャパシティーとデータ量に応じて、この操作が完了するまでに数分から数日かかる場合があります。

Tip

シャードがdraining状態の間、 reshardCollectionコマンドを使用して、削除されたシャードからデータを再配布できます。

reshardCollectionを使用してデータを移動すると、バランサーがチャンクを移行するのを待つよりも高速になる可能性があります。 このクラスターにより、ドレインシャードにデータが配置されないことが保証されます。 moveCollectionreshardCollectionの操作を同時に実行することはできません。

4

シャーディングされたシャーディングされたコレクションの名前空間のリストを返すには、 $shardedDataDistributionステージを使用してnsフィールドをプロジェクトします。

use admin
db.aggregate(
[
{ $shardedDataDistribution: { } },
{ $project: { ns: 1 } }
]
)

このチュートリアルの後半で参照するために出力を記録します。

5
db.adminCommand( { listDatabases: 1, nameOnly: true } )
6

admin と config を除くクラスター内の各データベースに対して、次の手順を実行します。

  1. データベースコレクションの一覧表示

    データベースのコレクションを一覧表示して、次のタイプのコレクションを省略します。

    • CSFLE をサポートする内部コレクション

    • システム コレクション

    • 時系列コレクション

    • ビュー

    use <databaseName>
    db.getCollectionInfos(
    {
    $and: [
    { type: { $nin: [ "view", "timeseries" ] } },
    { name: { $not: { $regex: "^system\." } } },
    { name: { $not: { $regex: "^enxcol_\..*(\.esc|\.ecc|\.ecoc|\.ecoc\.compact)$" } } }
    ]
    },
    { nameOnly: true }
    )
  2. 必要なコレクションの移動

    getCollectionInfos()によって返されるコレクションごとに、次の手順を実行します。

    注意

    一度に進行できるmoveCollection操作は 1 つだけです。 次のコレクションに移動する前に、すべてのサブステップを完了します。

    1. コレクションを移動する必要があるかどうかを判断してください。

      $collStats集計ステージを実行し、 フィールドとns shardフィールドをプロジェクトします。

      db.<collName>.aggregate(
      [
      {
      $collStats: { }
      },
      {
      $project: {
      ns: 1,
      shard: 1
      }
      }
      ]
      )

      次のいずれかの条件に一致する場合は、コレクションをスキップし、データベース内の次のコレクションのステップiに戻ります。

      • nsフィールドは、ステップ4の$shardedDataDistribution出力に存在します。

      • shardフィールドは、削除されるシャードではありません。

      前述の条件のいずれも満たされていない場合は、現在のコレクションに対してステップiiを続行します。

    2. コレクションを移動します。

      コレクション を移動するには、コレクションでsh.moveCollection()を実行しコレクション。

      sh.moveCollection( "<namespace>.<collection>", "<ID of recipient shard>" )

      注意

      moveCollection シャーディングされた名前空間でコマンドを実行すると、 は失敗します。 このエラー メッセージが表示された場合は、無視し、次のコレクションのステップiに戻ります。

    3. データベース内の各コレクションに対してステップiに戻ります。

  3. 他のデータベースに対してこの手順を繰り返します

    クラスター内の各データベースに対してステップ6 、 Move collections off of the shard (およびサブステップ)を繰り返します。

7

db.printShardingStatus()メソッドを実行します。

db.printShardingStatus()

コマンド出力のdatabasesセクションで、 database.primaryフィールドを確認します。 primaryフィールドが削除されたシャードである場合は、そのデータベースのプライマリを別のシャードに移動する必要があります。

データベースのプライマリシャードを変更するには、 movePrimaryコマンドを実行します。

警告

movePrimaryを実行すると、 Move collections off of the shardステップで移動されなかったコレクションは、 movePrimaryプロセスでは使用できなくなります。

db.adminCommand(
{
movePrimary: <dbName>,
to: <shardName>
}
)
8

移行の進行状況を確認するには、 adminデータベースからremoveShardを再度実行します。

db.adminCommand( { removeShard: "<shardName>" } )

出力では、 remainingフィールドには次のフィールドが含まれます。

フィールド
説明

chunks

現在シャードに残っているチャンクの数

dbs

プライマリシャードがシャードであるデータベースの数。 これらのデータベースはdbsToMoveの出力フィールドで指定されます。

jumboChunks

chunksの合計数のうち、ジャンボである数値。

jumboChunksが0より大きい場合は、 jumboChunksのみがシャード上に残るまで待ちます。 jumboチャンクのみが残ったら、ドレインが完了する前に ジャンボ フラグを手動でクリアする必要があります。 「 jumboフラグのクリア 」を参照してください。

jumboフラグがクリアされると、バランサーはこれらのチャンクを移行できます。 移行手順の詳細については、「範囲の移行手順 」を参照してください。

残りのチャンク数が0になるまで、 removeShardコマンドのステータスを確認し続けます。

db.adminCommand( { removeShard: "<shardName>" } )
9

シャード削除プロセスを終了するには、 removeShardコマンドを再実行します。

db.adminCommand( { removeShard: <shardName> } )

注意

DDL 操作

クラスターが DDL操作( reshardCollectionなどのコレクションを変更する操作)を実行しているときにシャードを削除すると、同時 DDL操作が完了した後にremoveShard操作が実行されます。

シャードが削除されている場合、コマンド出力は次のようになります。

{
msg: 'removeshard completed successfully',
state: 'completed',
shard: '<shardName>',
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1721941519, i: 7 }),
signature: {
hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
keyId: Long('0')
}
},
operationTime: Timestamp({ t: 1721941519, i: 7 })
}

戻る

シャードへのノードの追加