自己管理型 PSA レプリカセットを安全に変更
Overview
プライマリ セカンダリ アービター(PSA)レプリカセットを再構成する場合、または PSA アーキテクチャに変更する場合は、次の場合に特別な注意が必要です。
PSA アーキテクチャを使用して、既存の 3 ノードのレプリカセット内のセカンダリを、優先順位が 0 以外の投票権のあるデータを保持するノードになるように再構成する場合。
1 つのプライマリと 1 つのアービタを含む既存の 2 ノードのレプリカセットに、優先順位が 0 以外の投票権のあるデータを保持する新しいノードを追加する場合。
警告
追加しているセカンダリが遅延しており、結果のレプリカセットが PSA 構成の場合、最初の構成変更によって、 "majority"
で変更をコミットする必要があるノードの数が変更されます。 この場合、コミット ポイントはセカンダリが追いつくまで遅延します。
このドキュメントでは、指定されたヘルパー メソッド を使用 せずrs.reconfigForPSASet()
に、これらの特定のケースでレプリカセットを再構成する手順について説明します。
手順
上記のいずれかの操作を実行している場合は、次の 2 つの手順でレプリカセットを再構成する必要があります。
{ votes: 1, priority: 0 }
を使用してセカンダリを追加または変更するには、レプリカセットを再構成します。追加または変更されたセカンダリがコミットされたすべての書込み (write) に追いつくと、セカンダリの優先順位がゼロ以外になるように再構成し
{ votes: 1, priority: <num> }
。
2 段階のアプローチにより、新しいセカンダリが以前のプライマリからのコミットされた書込み (write) をすべて完了する前に新しいセカンダリに フェイルオーバー が発生した場合に、コミットされた書込みをロールバックする可能性を回避できます。
rs.reconfigForPSASet()
メソッドを実行するには、レプリカセットのプライマリに接続する必要があります。
投票が 1 であるが優先順位が 0 のセカンダリを追加または変更する
投票権のあるデータを保持するノードを追加または変更するときにコミットされていない書込みをロールバックしないようにするには、最初に{ priority: 0 }
を持つノードを追加する必要があります。
mongosh
で、レプリカセット構成を変更します。 既存のレプリカセットを再構成するには、まずrs.conf()
を使用して現在の構成を取得し、必要に応じて構成ドキュメントを変更し、変更されたドキュメントをrs.reconfig()
に渡します。
cfg = rs.conf(); cfg["members"] = [ { // existing member or members }, { "_id" : <num>, // The array position of the new member in the // ``members`` array. "host" : <host>, "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 0, "tags" : { <tags> }, "secondaryDelaySecs" : <num>, "votes" : 1 }, { // existing member or members } ] rs.reconfig(cfg);
セカンダリの優先順位がゼロ以外になるように再構成する
セカンダリが追いつくと、比率を任意の数値に設定します。 この再構成が成功する前に、セカンダリは投票がゼロのときにコミットされたすべての書込み (write) を複製する必要があります。 これは、 rs.reconfig()
コマンドを発行すると自動的にチェックされます。
cfg = rs.conf(); cfg["members"] = [ { // existing member or members }, { "_id" : <num>, // The array position of the new member in the // ``members`` array. "host" : <host>, "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : <num>, "tags" : { <tags> }, "secondaryDelaySecs" : <num>, "votes" : 1 }, { // existing member or members } ] rs.reconfig(cfg);