8.4. AWS設定の例

このチュートリアルでは、AWS上でwatchdogを使う際の仮想IPの設定例を示します。

AWSで仮想IPを設定するにはいくつかの方法があります。この設定例では、以下の2つの方法について説明します。

8.4.1. Elastic IPアドレスの付け替え

この節では、Elastic IPアドレスを仮想IPとして使い、複数のEC2インスタンス間で付け替える方法を説明します。

8.4.1.1. AWSのセットアップ

この方法を利用する場合は、Pgpool-II EC2インスタンスをパブリックサブネットに配置し、クライアントはインターネット経由でPgpool-IIに接続することを想定しています。 この方法はMulti-AZ構成に対応しています。

この設定例では、3ノードのPgpool-II(watchdog)クラスタを使います。 そこで、3つのEC2インスタンスと、1つのElastic IPアドレスを作成します。

以下のステップを実施してください。

  • EC2インスタンスを3つ起動します。

  • これらのインスタンスのセキュリティグループを設定します。 Pgpool-IIを動かすために必要な最低限の設定は、以下のように設定してください。

    • Pgpool-IIとwatchdogが使用するポートへのインバウンドトラフィックを許可します。

    • Pgpool-II(watchdog)が仮想IPに対してpingを実行し疎通確認を行うため、Elastic IP(送信元)からのICMPトラフィックを許可します。

  • Pgpool-IIをすべてのインスタンスにインストールします。

  • AWSのEC2インスタンス上でAWSサービスを操作・管理するために、AWS CLIを使用します。 すべてのPgpool-IIのインスタンスにAWS CLIをインストールします。

    また、Pgpool-IIの起動ユーザでAWS CLIを実行できるように、Pgpool-IIの起動ユーザでaws configureを実行し認証情報設定を行います。 RPMからインストールした場合、デフォルトでPgpool-IIpostgresユーザで起動します。

  • Elastic IPアドレスを確保します。 この設定例では、Elastic IPアドレスは"35.163.178.3"となります。

8.4.1.2. Pgpool-IIの設定

Pgpool-IIの設定を説明します。 この設定例は項8.2とほとんど同じになりますが、if_up_cmdif_down_cmdを使ってElastic IPアドレスを付与・解除するのが異なります。

delegate_ipに仮想IPとして使用するElastic IPアドレスを指定します。

use_watchdog = on
delegate_ip = '35.163.178.3'
   

if_up_cmdif_down_cmdにElastic IPアドレスを付与・解除するスクリプトを以下のように指定します。 if_up_cmdは、watchdogがリーダーノードになったときに、Elastic IPアドレスを付与するためにwatchdogが実行します。 if_down_cmdは、watchdogがリーダーノードを退任するときに、Elastic IPアドレスを解除するためにwatchdogが実行します。

if_up_cmd = '<path to script> up $_IP_$ <path to awscli>'
if_down_cmd = '<path to script> down $_IP_$ <path to awscli>'
   

  • <path to script>: 仮想IPの付与・解除を行うスクリプトのパスを指定します。

  • <path to awscli>: AWS CLIのパスを指定します。

この設定例では、以下のように指定します。環境に合わせて、設定してください。

if_up_cmd = '/etc/pgpool-II/aws_eip_if_cmd.sh up $_IP_$ /usr/local/bin/aws'
if_down_cmd = '/etc/pgpool-II/aws_eip_if_cmd.sh down $_IP_$ /usr/local/bin/aws'
   

arpingコマンドは実行不要なので、常に成功させるようにtrueに設定します。

arping_cmd = 'true'
   

8.4.1.3. Elastic IPアドレス付与・解除用のスクリプト

if_up_cmd/if_down_cmdで実行するスクリプトをすべてのPgpool-IIインスタンス上に作成します。

この設定例では、サンプルスクリプトaws_eip_if_cmd.shを使用します。必要に応じて、編集してください。

(すべてのPgpool-IIインスタンスで実行)
# cp -p /etc/pgpool-II/sample_scripts/aws_eip_if_cmd.sh.sample /etc/pgpool-II/aws_eip_if_cmd.sh
   

以上で、設定は完了です。

8.4.1.4. 実行してみる

Pgpool-IIを起動し、ローカル環境からElastic IPアドレスを使ってPgpool-IIに接続してみます。

[user@someserver]$ psql -h 35.163.178.3 -p 9999 -U postgres -c "show pool_nodes"
   

リーダーPgpool-IIを停止し、Elastic IPアドレスが新しいリーダーに付与され、Elastic IPアドレスを使ってPgpool-IIに接続できることを確認します。

[user@someserver]$ psql -h 35.163.178.3 -p 9999 -U postgres -c "show pool_nodes"
   

8.4.2. ルートテーブルの書き換え

この節では、ルートテーブルの書き換えにより、リーダーPgpool-II(watchdog)へのルーティングを制御する方法を説明します。

この方法では、プライベートIPアドレスを仮想IPとして使い、リーダーPgpool-IIインスタンスに付与します。 フェイルオーバー時に、仮想IPの付け替えを行い、ルートテーブルを書き換えることで、仮想IPへのトラフィックを新しいリーダーPgpool-IIインスタンスへルーティングすることが可能です。

8.4.2.1. AWSのセットアップ

この方法を利用する場合は、Pgpool-II EC2インスタンスがプライベートサブネットに配置されており、クライアントアプリケーションも同一VPC内に存在することを想定しています。 この方法はMulti-AZ構成に対応しています。

この例では、複数のアベイラビリティゾーンを跨いだ3ノードのPgpool-II (watchdog)クラスタを使います。

以下のステップを実施してください。

  • 1つのパブリックサブネットと3つのプライベートサブネットを持つVPCを作成し、各プライベートサブネットは異なるアベイラビリティーゾーンに属しています。 詳細については、こちらのドキュメントを参照してください。

  • パブリックサブネットに関連付けるルートテーブルとプライベートサブネットに関連付けるルートテーブルをそれぞれ作成します。 エントリの設定については、こちらのドキュメントを参照してください。

  • 1つのアプリケーションEC2インスタンスと3つのPgpool-II EC2インスタンスを起動します。 アプリケーションインスタンスをパブリックサブネットに配置し、それぞれのPgpool-IIインスタンスを異なるプライベートサブネットに配置します。

  • Pgpool-II EC2インスタンスのセキュリティグループを設定し、VPCのCIDR範囲内にあるIPアドレスからPgpool-IIとwatchdogが使用するポートへのトラフィックを許可します。

  • すべてのPgpool-IIインスタンスにPgpool-IIをインストールします。

  • AWSインスタンス上でAWSサービスを操作・管理するために、AWS CLIを使用します。 すべてのインスタンスにAWS CLIをインストールします。

    また、Pgpool-IIの起動ユーザでAWS CLIを実行できるように、Pgpool-IIの起動ユーザでaws configureを実行し認証情報設定を行います。 RPMからインストールした場合、デフォルトでPgpool-IIpostgresユーザで起動します。

  • 仮想IPの付与や解除にはroot権限が必要です。 一般ユーザでPgpool-IIを起動する場合、起動ユーザがパスワードなしでsudoできるようにsudoersファイルを設定する必要があります。 RPMからインストールした場合、postgresユーザの権限が自動的に設定されます。

  • あらかじめ仮想IPとして使うプライベートIPアドレスを決めておきます。 セカンダリIPアドレスはアベイラビリティーゾーンを跨ぐことができないため、VPCのCIDR範囲外のプライベートIPアドレスを仮想IPとして使用します。この設定例では、"20.0.0.50"を使用します。

8.4.2.2. Pgpool-IIの設定

この節では、Pgpool-IIの設定を説明します。

この設定例は項8.2とほとんど同じになりますが、if_up_cmdif_down_cmdを使ってリーダーPgpool-IIインスタンスへのルーティングを切り替えるのが異なります。

delegate_ipに仮想IPとして使用するプライベートIPを指定します。

use_watchdog = on
delegate_ip = '20.0.0.50'
   

if_up_cmdif_down_cmdにルートテーブルの書き換えを行うスクリプトを以下のように指定します。 if_up_cmdは、watchdogがリーダーノードになったときに、ルートテーブルの書き換えおよび仮想IPの割り当てを行うためにwatchdogが実行します。 if_down_cmdは、watchdogがリーダーノードを退任するときに、ルートテーブルの書き換えおよび仮想IPの解除を行うためにwatchdogが実行します。

if_up_cmd = '<path to script> up $_IP_$ <interface> <route table ID> <path to awscli>'
if_down_cmd = '<path to script> down $_IP_$ <interface> <route table ID> <path to awscli>'
   

  • <path to script>: ルートテーブルの書き換えを行うスクリプトのパスを指定します。

  • <interface>: 仮想IPを割り当てるネットワークインターフェイスを指定します。

  • <route table ID>: 書き換え対象(接続元のアプリケーションやPgpool-IIインスタンス)となるルートテーブルIDを指定します。カンマ区切りで複数のルートテーブルIDを指定できます。

  • <path to awscli>: AWS CLIのパスを指定します。

この設定例では、以下のように指定します。環境に合わせて、設定してください。ルートテーブルIDにパブリックサブネットおよびプライベートサブネットのルートテーブルIDを指定します。

if_up_cmd = '/etc/pgpool-II/aws_rtb_if_cmd.sh up $_IP_$ eth0 rtb-012345abcd,rtb-67890abcd /usr/local/bin/aws'
if_down_cmd = '/etc/pgpool-II/aws_rtb_if_cmd.sh down $_IP_$ eth0 rtb-012345abcd,rtb-67890abcd /usr/local/bin/aws'
   

arpingコマンドは実行不要なので、常に成功させるようにtrueに設定します。

arping_cmd = 'true'
   

8.4.2.3. ルートテーブル書き換え用のスクリプト

if_up_cmd/if_down_cmdで実行するスクリプトをすべてのPgpool-IIインスタンス上に作成します。

この設定例では、サンプルスクリプトaws_rtb_if_cmd.shを使用します。必要に応じて、編集してください。

(すべてのPgpool-IIインスタンスで実行)
# cp -p /etc/pgpool-II/sample_scripts/aws_rtb_if_cmd.sh.sample /etc/pgpool-II/aws_rtb_if_cmd.sh
   

8.4.2.4. 「送信元/送信先チェック」の無効化

AWSのネットワークインターフェイスのデフォルト設定では、トラフィックの送信元または送信先をチェックします。 ルーティングの設定を行うインスタンスでは、この設定を無効にする必要があります。

すべてのPgpool-IIインスタンスのネットワークインターフェイスの設定で「送信元/送信先チェック」を無効にします。 AWSコンソールまたは AWS CLIを使用して設定可能です。 AWS CLIを使って設定を行う場合、以下のコマンドを実行します。 LOCAL_INTERFACEに仮想IPを割り当てるネットワークインターフェイスを指定します。 この設定例では、eth0を指定します。

$ sudo su - postgres
$ TOKEN=$(curl -sX PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
$ LOCAL_INTERFACE=eth0
$ MAC_ADDR=$(ip -br link show dev ${LOCAL_INTERFACE} | tr -s ' ' | cut -d ' ' -f3)
$ EC2_NETWORK_INTERFACE_ID=$(curl -H "X-aws-ec2-metadata-token: ${TOKEN}" -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC_ADDR}/interface-id)
$ aws ec2 modify-network-interface-attribute --network-interface-id ${EC2_NETWORK_INTERFACE_ID} --no-source-dest-check
   

以上で、設定は完了です。

8.4.2.5. 実行してみる

Pgpool-IIを起動し、アプリケーションインスタンスから仮想IPアドレスを使ってPgpool-IIに接続してみます。

[user@someserver]$ psql -h 20.0.0.50 -p 9999 -U postgres -c "show pool_nodes"
   

リーダーPgpool-IIを停止し、仮想IPが新しいリーダーに付与され、仮想IPを使ってPgpool-IIに接続できることを確認します。

[user@someserver]$ psql -h 20.0.0.50 -p 9999 -U postgres -c "show pool_nodes"
   

AWSコマンドリファレンス

"Configure AWS CLI", AWS Documentation: Configuring the AWS Command Line Interface.

"associate-address", AWS Documentation: associate-address reference.

"disassociate-address", AWS Documentation: disassociate-address reference.

"create-route", AWS Documentation: create-route reference.

"replace-route", AWS Documentation: replace-route reference.

"delete-route", AWS Documentation: delete-route reference.

"modify-network-interface-attribute", AWS Documentation: modify-network-interface-attribute.