Using Failover Manager with virtual IP addresses#

フェールオーバーマネージャーは、現在のプライマリノードに要求をルーティングするために仮想IPアドレスVIPとともに使用できます。

EFMエージェントのシャットダウン中の動作#

フェールオーバーマネージャーは、プライマリノードのエージェントがシャットダウンしても、プライマリノードから仮想IPアドレスをドロップしません。テストの便宜として、プライマリノードのエージェントは、ノードがVIPをまだ持っていない場合は、起動中にVIPを 取得 しますが、それ以外の場合、フェールオーバーマネージャーの起動と停止は、ノードが仮想IPアドレスを保持するかどうかに影響を与えません。

これにより、データベースへのアクセスを中断せずにEFMサービスのアップグレードとメンテナンスを実行できます。

ノードがスタンバイからプライマリに昇格する際の動作#

VIPは、最初にプライマリノードに割り当てる必要があります。 EFMは、プライマリノードのデータベースの障害を検出すると、VIPを解放し、スタンバイノードが新しいプライマリに昇格するときに割り当てます。

EFMは、 ping.server.command クラスタープロパティで構成されたコマンドを使用して、スタンバイの昇格中にVIPが現在使用されていないことを確認し、pingがVIPが到達不能であることを示すまで、新しいプライマリノードをプロモーションしません。 check.vip.before.promotion クラスタープロパティを使用してこの動作を無効にするか、 check.vip.timeout クラスタープロパティで待機する時間を増やすことができます。

!!!tip 「pingコマンドの終了コードの意味」 フェールオーバーマネージャーは、 pingコマンドの終了コードを使用して、アドレスに到達可能かどうかを判断します。ゼロの終了コードは、アドレスに到達可能であることを示しますこのコンテキストでは、これはVIPが割り当てられていることを意味します。ゼロ以外の終了コードは、アドレスに到達できないことを示しますこのコンテキストでは、これはVIPが割り当てられていないことを意味します。

これは、標準の ping(8) コマンドの動作と一致します。 ping.server.command クラスタープロパティを介して別のコマンドを構成する場合、それもこの動作に準拠する必要があります。

VIPを解放するときのプライマリエージェントの動作#

プライマリエージェントのデフォルト動作は、他のタスクの実行中にバックグラウンドでVIPを解放することです。一部の環境では、これにより、同時に作成されているエージェントからの新しいデータベース接続が妨げられる場合があります。これにより、たとえば、プライマリエージェントが、スイッチオーバー中にプロモートブルなスタンバイデータベースが複数ある場合、プロモートするスタンバイデータベースを選択できなくなります。 release.vip.* プロパティを使用してこの動作を変更するには2つの方法があります。

  1. release.vip.background=true のデフォルト値をそのまま使用し、 release.vip.pre.wait プロパティをゼロ以外の値たとえば5秒に設定します。この設定では、VIPをドロップする前にスタンバイが選択されるまでエージェントを待機させることにより、この問題を回避できます。

  2. release.vip.background のデフォルト値をfalseに変更し、release.vip.post.wait プロパティをゼロ以外の値1または2秒などに設定します。これらの設定により、エージェントはVIPをドロップし、プロモートするスタンバイの選択を続行する前に待機します。

これらのプロパティの効果は、スイッチオーバーを実行することによりテストできます。これにより、プライマリはVIPをドロップし、昇格したノードがそれを取得します。

ノードに複数のアドレスを使用する場合のPostgresの構成#

VIPアドレスまたはbind.address 以外のアドレスがノードに割り当てられている場合、オペレーティングシステムはデータベースへの接続時に使用されるソースアドレスを選択できます。すべての監視対象データベースのpg_hba.conf ファイルを変更して、レプリケーションシナリオ内のすべてのアドレスからの連絡を許可してください。

複数のインターフェイスを使用する#

VIPに使用されるネットワークインターフェイスは、Failover Managerエージェントの bind.address 値に使用されるインターフェイスと同じである必要はありません。プライマリエージェントは、フェールオーバー中に必要に応じてVIPをドロップし、フェールオーバーマネージャーは、スタンバイを昇格する前にVIPが利用できないことを確認します。バインドアドレスネットワークの障害は、プライマリの分離とフェイルオーバーにつながります。

VIPがbind.address とは別のインターフェイスを使用している場合、プライマリエージェントがドロップする前に、残りのクラスターが到達可能なVIPをチェックするタイミング条件が発生する場合があります。この場合、フェールオーバーマネージャーは node.timeout プロパティで指定された秒数VIPチェックを再試行して、フェールオーバーが予想通りに発生することを確認します。

efm_addressスクリプト#

フェールオーバーマネージャーはefm_address スクリプトを使用して、仮想IPアドレスを割り当てまたは解放します。

スクリプトは次の場所にあります: /usr/edb/efm-5.<x>/bin/efm_address

フェールオーバーマネージャーは、次のコマンドバリエーションを使用して、IPv4またはIPv6 IPアドレスを割り当てまたは解放します。

仮想IPv4 IPアドレスを割り当てるには

efm_address add4 <interface_name> <IPv4_addr>/<prefix>

仮想IPv6 IPアドレスを割り当てるには

efm_address add6 <interface_name> <IPv6_addr>/<prefix>

仮想アドレスを解放するには

efm_address del <interface_name> <IP_address/prefix>

そこで

<interface_name> は、クラスタープロパティファイルのvirtual.ip.interface プロパティで指定された名前と一致します。

<IPv4_addr> または<IPv6_addr> は、クラスタープロパティファイルのvirtual.ip プロパティで指定された値と一致します。

prefix は、クラスタープロパティファイルのvirtual.ip.prefix プロパティで指定された値と一致します。

仮想IPアドレスを記述するプロパティの詳細については、 The cluster properties file を参照してください。

rootユーザーとしてefm_address スクリプトを呼び出します。 efmユーザーはインストール中に作成され、sudoersファイルでefm_address スクリプトを実行する特権が付与されます。 sudoers ファイルの詳細については、 Extending Failover Manager permissions を参照してください。

VIPのテスト#

フェールオーバーマネージャーで仮想IPVIPアドレスを使用する場合、フェールオーバーマネージャーを開始する前にVIP機能を手動でテストすることが重要です。これにより、実際のフェイルオーバー中に問題が発生する前に、ネットワーク関連の問題をキャッチします。

!!!重要 VIPのテスト中に、フェールオーバーマネージャーが実行されていないことを確認してください。

次の手順では、フェールオーバーマネージャーが実行するアクションをテストします。この例では、次のプロパティ値を使用します。

virtual.ip=172.24.38.239
virtual.ip.interface=eth0
virtual.ip.prefix=24
ping.server.command=/bin/ping -q -c3 -w5

注釈

virtual.ip.prefix は、仮想IPアドレスの有効ビット数を指定します。

ノードからVIPをpingするように指示されたら、 ping.server.command プロパティで定義されたコマンドを使用し、適切なロールプライマリ/セカンダリ/監視用にEFMで構成されたマシンから実行します。

  1. すべてのノードからVIPにpingを実行して、アドレスがまだ使用されていないことを確認します。

/bin/ping -q -c3 -w5 172.24.38.239
__OUTPUT__
PING 172.24.38.239 (172.24.38.239) 56(84) bytes of data.
--- 172.24.38.239 ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss,
time 3000ms

アドレスが未使用の場合、100のパケット損失が表示されます。

!!!tip 到達不能アドレスのpingコマンド終了コードの意味 フェールオーバーマネージャーは、 pingコマンドの終了コードを使用して、アドレスに到達可能かどうかを判断します。この場合、終了コードはゼロではありません。 ping以外のコマンドを使用している場合、アドレスに到達できない場合は、ゼロ以外の終了コードを返す必要があります。

  1. プライマリノードとして構成されたマシンでefm_address add4 コマンドを実行してVIPを割り当て、IPアドレスで確認します。

efm_address add4 eth0 172.24.38.239/24
ip address
__OUTPUT__
<output truncated>
eth0 Link encap:Ethernet HWaddr 36:AA:A4:F4:1C:40
inet addr:172.24.38.239 Bcast:172.24.38.255
...
  1. 他のノードからVIPにpingを実行して、VIPに到達できることを確認します。

/bin/ping -q -c3 -w5 172.24.38.239
__OUTPUT__
PING 172.24.38.239 (172.24.38.239) 56(84) bytes of data.
--- 172.24.38.239 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.023/0.025/0.029/0.006 ms

0%のパケット損失が表示され、IPがプライマリノードとして構成されたマシンに到達したことを示します。

!!!tip 到達可能なアドレスのpingコマンド終了コードの意味 フェールオーバーマネージャーは、 pingコマンドの終了コードを使用して、アドレスに到達可能かどうかを判断します。この場合、終了コードはゼロです。 ping以外のコマンドを使用している場合、アドレスに到達可能なときにゼロ終了コードを返す必要があります。

  1. efm_address del コマンドを使用してプライマリノードのアドレスを解放し、VIPがip address コマンドで解放されたことを確認します。

efm_address del eth0 172.24.38.239/24
ip address
__OUTPUT__
eth0 Link encap:Ethernet HWaddr 22:00:0A:89:02:8E
inet addr:10.137.2.142 Bcast:10.137.2.191
...

この手順からの出力には、eth0インターフェイスのVIPアドレスは表示されません。

  1. 手順3を繰り返します。今回は、スタンバイと監視が使用中のVIPを認識しないことを確認します。

/bin/ping -q -c3 -w5 172.24.38.239
__OUTPUT__
PING 172.24.38.239 (172.24.38.239) 56(84) bytes of data.
--- 172.24.38.239 ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss,
time 3000ms

100のパケット損失が発生します。すべてのノードでこの手順を繰り返します。

  1. すべてのスタンバイノードで手順2、3、および4を繰り返し、VIPをすべてのノードに正常に割り当ておよび解放できることを確認します。任意のノードからVIPにpingを実行して、使用されていることを確認できます。

efm_address add4 eth0 172.24.38.239/24
ip address
__OUTPUT__
<output truncated>
eth0 Link encap:Ethernet HWaddr 36:AA:A4:F4:1C:40
inet addr:172.24.38.239 Bcast:172.24.38.255
...

これらのテスト手順の後、フェールオーバーマネージャーを起動する前に、非プライマリノードからVIPを解放します。