Docs Menu
Docs Home
/
データベース マニュアル
/ /

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

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

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

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

注意

複数のシャードを削除する場合は、一度に 1 つずつではなく、同時に削除します。一度に 1 つのシャードを削除すると、バランサーは残りのシャードにデータを排除します。シャードは一度に 1 つのチャンク移行のみに参加できるため、1 つのシャードを削除すると データ移行のスループットが制限されます。

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 call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove",
"dbsToMove" : [
"db1",
"db2"
],
collectionsToMove: ["db1.collA"]
"ok" : 1,
"operationTime" : Timestamp(1575398919, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1575398919, 2),
"signature" : {
"hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="),
"keyId" : Long("6766255701040824328")
}
}

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

Tip

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

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

完全な手順については、シャードを追加および削除するための再シャーディング を参照してください。

4
  1. どのコレクションを移動する必要があるかを決定する

    シャード上のシャーディングされていないコレクションを一覧表示するには、集計ステージ $listClusterCatalog を使用します。

    use admin
    db.aggregate([
    { $listClusterCatalog: { shards: true } },
    { $match: {
    $and: [
    { sharded: false },
    { shards: '<shard_to_remove>' },
    { type: { $nin: ["timeseries","view"] } },
    { ns: { $not: { $regex: "^enxcol_\..*(\.esc|\.ecc|\.ecoc|\.ecoc\.compact)$" }}},
    { $or: [{ns: {$not: { $regex: "\.system\." }}}, {ns: {$regex: "\.system\.buckets\."}}]},
    { db: { $ne: 'config' } },
    { db: { $ne: 'admin' } }
    ]}},
    { $project: {
    _id: 0,
    ns: {
    $cond: [
    "$options.timeseries",
    {
    $replaceAll: {
    input: "$ns",
    find: ".system.buckets",
    replacement: ""
    }
    },
    "$ns"
    ]
    }
    }}
    ])
  2. コレクションを 1 つずつ移動します

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

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

    注意

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

  3. ステップ 1 に戻り、ドレインシャードにシャーディングされていないコレクションが残っていないことを確認します。

5

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

db.printShardingStatus()

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

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

警告

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

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

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

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

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

フィールド
説明

chunks

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

dbs

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

jumboChunks

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

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

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

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

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

シャード削除プロセスを終了するには、 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 })
}

戻る

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

項目一覧