シャーディングされたクラスター 内の既存のシャードにメンバーを追加できます。 シャードにノードを追加する理由は、レプリカセットにノードを追加するのと同じ理由です。 たとえば、ノードの数を増やすと、フェイルオーバーが発生した場合にプライマリを置き換える候補が増えます。 ノードを追加すると、データの冗長性とレプリカセットの可用性も向上します。
詳細については、「レプリカセットの配置アーキテクチャ 」を参照してください。
このタスクについて
MongoDB 5.0 より前では、新しく追加されたセカンダリは、データの一貫性が確保されるまでは読み取りを処理できず、プライマリにもなれませんが、投票メンバーとしてカウントされます。MongoDB バージョン 5.0 より前のバージョンを実行中で、 votesとpriorityの設定が0より大きいセカンダリを追加すると、投票ノードの過半数がオンラインであるにもかかわらずプライマリを選出できない状況が発生する可能性があります。このような状況を回避するには、最初にpriority :0とvotes :0を使用して新しいセカンダリを追加することを検討してください。次に、 rs.status()を実行して、ノードがSECONDARY状態に移行したことを確認します。最後に、 rs.reconfig()を使用して優先順位と投票をアップデートします。
始める前に
シャード レプリカセットにノードを追加するには、次の手順が必要です。
アクティブなシャーディングされたクラスターのレプリカセット。
新しいノードの新しいホスト サーバー。 新しいホスト サーバーは、シャーディングされたデータセットをサポートし、アクティブなレプリカセットからネットワーク経由でアクセスできる必要があります。
MongoDB 8.0以降では、 directShardOperationsロールを使用して、シャードに対してコマンドを直接実行する必要があるメンテナンス操作を実行できます。
警告
directShardOperations ロールを使用して コマンドを実行すると、クラスターが正しく動作しなくなり、データが破損する可能性があります。Only use the directShardOperations ロール for maintenance purposes or under the ガイダンス of MongoDB support.メンテナンス操作の実行が終了したら、directShardOperations ロールの使用を停止します。
手順
データディレクトリの準備
次のいずれかの戦略を使用して、新しいノードのデータディレクトリを準備します。
既存のノードからデータディレクトリを手動でコピーします。 新しいノードはセカンダリ メンバーになり、レプリカセットの現在の状態に追いつきます。 データをコピーすると、新しいノードが他のレプリカセット ノードと同期するまでの時間が短縮される可能性があります。
データディレクトリを新しいノードにコピーし、 oplog によって許可されたウィンドウ 期間内にレプリケーションを開始できることを確認します。 それ以外の場合、新しいインスタンスで最初の同期を実行する必要があり、「 自己管理型レプリカセットのノードの再同期 」で説明されているように、データの完全な再同期が必要になります。
oplog に関するレプリカセット ノードの現在の状態を確認するには、
rs.printReplicationInfo()を使用します。
レプリケーション配置パターンの背景については、「レプリカセット配置のアーキテクチャ」ドキュメントを参照してください。
新しい mongodインスタンスを起動する
データディレクトリとレプリカセット名を指定します。 次の例えでは、 /srv/mongodb/db0データディレクトリとrs0レプリカセットを指定します。
mongod --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost,<ip address of the mongod host>
警告
インスタンスをパブリックにアクセス可能な IP アドレスにバインドする前に、クラスターを不正アクセスから保護する必要があります。 セキュリティ推奨事項の完全なリストについては、「自己管理型配置のセキュリティ チェックリスト」を参照してください。 最低限、認証を有効化し、ネットワーク インフラストラクチャの強化 を検討してください。
設定オプションの詳細については、 mongodマニュアル ページを参照してください。
レプリカセットのプライマリに接続する
ノードの追加は、プライマリーに接続している間のみ可能です。 プライマリに接続するには、 mongoshを使用します。 hostとportの値を配置に関連する値に置き換えます。
mongosh --host mongodb0.example.com --port 28015
どのメンバーがプライマリであるかわからない場合は、レプリカセットの任意のメンバーに接続してdb.hello()コマンドを発行します。
rs.add() を使用してレプリカセットに新しいノードを追加
member configuration documentを メソッドに渡します。 たとえば、ホストmongodb3.example.netにメンバーを追加するには、次のコマンドを発行します。
rs.add( { host: "mongodb3.example.net:27017", priority: 0, votes: 0 } )
次のステップ
新しく追加されたメンバーがSECONDARY状態に移行したら、必要に応じてrs.reconfig()を使用して、新しく追加されたメンバーのpriorityとvotesを更新します。
警告
rs.reconfig()shell メソッドを使用すると、現在のプライマリを強制的に降格させることができ、選挙が行われます。プライマリが降格すると、mongodはすべてのクライアント接続を閉じます。通常、この処理時間は 10 ~ 20 秒ですが、スケジュールされたメンテナンス期間中にこれらの変更を行ってください。MongoDB のバージョンによって検証ルールが異なる可能性があるため、異なるバージョンの MongoDB のノードを含むレプリカセットの再設定は避けてください。
例
rs.conf()がmongodb3.example.net:27017の構成ドキュメントをmembers配列の 5 番目の要素として返す場合、優先順位と投票を1に更新するには、次の一連の操作を使用します。
var cfg = rs.conf(); cfg.members[4].priority = 1 cfg.members[4].votes = 1 rs.reconfig(cfg)