このチュートリアルでは、AWS上でwatchdogを使う際の仮想IPの設定例を示します。
AWSで仮想IPを設定するにはいくつかの方法があります。この設定例では、以下の2つの方法について説明します。
この節では、Elastic IPアドレスを仮想IPとして使い、複数のEC2インスタンス間で付け替える方法を説明します。
この方法を利用する場合は、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-IIはpostgresユーザで起動します。
Elastic IPアドレスを確保します。 この設定例では、Elastic IPアドレスは"35.163.178.3"となります。
Pgpool-IIの設定を説明します。 この設定例は項8.2とほとんど同じになりますが、if_up_cmdとif_down_cmdを使ってElastic IPアドレスを付与・解除するのが異なります。
delegate_ipに仮想IPとして使用するElastic IPアドレスを指定します。
use_watchdog = on delegate_ip = '35.163.178.3'
if_up_cmdとif_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'
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
以上で、設定は完了です。
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"
この節では、ルートテーブルの書き換えにより、リーダーPgpool-II(watchdog)へのルーティングを制御する方法を説明します。
この方法では、プライベートIPアドレスを仮想IPとして使い、リーダーPgpool-IIインスタンスに付与します。 フェイルオーバー時に、仮想IPの付け替えを行い、ルートテーブルを書き換えることで、仮想IPへのトラフィックを新しいリーダーPgpool-IIインスタンスへルーティングすることが可能です。
この方法を利用する場合は、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-IIはpostgresユーザで起動します。
仮想IPの付与や解除にはroot権限が必要です。 一般ユーザでPgpool-IIを起動する場合、起動ユーザがパスワードなしでsudoできるようにsudoersファイルを設定する必要があります。 RPMからインストールした場合、postgresユーザの権限が自動的に設定されます。
あらかじめ仮想IPとして使うプライベートIPアドレスを決めておきます。 セカンダリIPアドレスはアベイラビリティーゾーンを跨ぐことができないため、VPCのCIDR範囲外のプライベートIPアドレスを仮想IPとして使用します。この設定例では、"20.0.0.50"を使用します。
この節では、Pgpool-IIの設定を説明します。
この設定例は項8.2とほとんど同じになりますが、if_up_cmdとif_down_cmdを使ってリーダーPgpool-IIインスタンスへのルーティングを切り替えるのが異なります。
delegate_ipに仮想IPとして使用するプライベートIPを指定します。
use_watchdog = on delegate_ip = '20.0.0.50'
if_up_cmdとif_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'
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
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
以上で、設定は完了です。
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"
"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.