私はCentOS/Linux/HAProxy/Keepalivedの初心者なので、過去数日間で学ぶことがたくさんありました。
AmazonAWSに2台のCentOS6.5サーバーが独自のEC2Microインスタンスで実行されています。また、ElasticIPを1つ設定しています。各インスタンスには、次のものがインストールされています。
両方のインスタンスにHAProxyをインストールして構成しました。テストの目的で、基本的なindex.htmlページを提供するためにApacheをインストールして、HAProxyがLBタスクを実行し、ラウンドロビンが正常に機能していることをテストできるようにしました。
私が達成しようとしているのは、Keepalivedを使用してLB1のhaproxyプロセスを監視することです(EIPが割り当てられています)。何らかの理由で失敗または停止した場合、AWS EC2APIツールを使用してElasticIPをに再割り当てするスクリプトを呼び出します。引き継ぐ2番目のロードバランサー。
これを実現するスクリプトを作成するためにグーグルでドキュメントを調べましたが、テストしてHAProxyサービスを停止すると、スクリプトが実行されません。
LB1-keepalived.confの内容
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101
vrrp_unicast_bind 10.xx.xx.01 # The IP of the Host this file is stored on
vrrp_unicast_peer 10.xx.xx.23 # The IP of the other Host
advert_int 1
track_script {
chk_haproxy
}
notify_fault /etc/keepalived/vrrp.sh
}
ログのテーリングからの出力
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: Opening file '/etc/keepalived/keepalived.conf'.
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: Configuration is using : 60618 Bytes
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: Using LinkWatch kernel netlink reflector...
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP sockpool: [ifindex(2), proto(112), fd(10,11)]
Jun 18 12:03:11 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Script(chk_haproxy) succeeded
Jun 18 12:03:12 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jun 18 12:03:13 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Instance(VI_1) Entering MASTER STATE
Jun 18 12:03:19 ip-10-xx-xx-xx Keepalived_vrrp[25199]: VRRP_Script(chk_haproxy) failed
私の第一印象は、haproxyサービスの障害を検出したが、vrrp.shスクリプトを実行していないようです。 (以下の内容)
#vrrp.sh
#!/bin/bash
cd $EC2_BASE/tools/bin
#DisAssociate EIP from this instance.
./ec2-disassociate-address 54.xx.xx.xx
#Mapping EIP to secondary server
./ec2-associate-address 54.xx.xx.xx -i [instance-id]
サーバー上でvrrp.shスクリプトを単独で実行すると、コマンドが実行され、EIPが正常に再割り当てされます。 keepalived.confスクリプトから呼び出されたときだけではありません。
何か案は!?私は一日中頭をかいていて、ラップトップが窓の外に発射されようとしています。
notify_fault
スクリプトは、keepalived
が障害状態に入ると呼び出されます。
を使用してスクリプトを構成する
notify_master /etc/keepalived/vrrp.sh
Backup.confファイルとslave.confファイルを貼り付けていただけますか?
また、次の2つの記事を確認する必要があります。
http://www.trk7.com/blog/keepalived-instance-not-entering-failed-state/ または http://comments.gmane.org/gmane.linux。 keepalived.devel/4102 ?
まず、スクリプトが実行されているかどうかを判断するために、#!/bin/bash
のすぐ下に次の行を追加します。
echo "----------vrrp.sh running ------" >> /var/log/messages
または、必要なものは何でも...アプリケーションがバックアップからマスターなどへの「状態」遷移を確認し、実際に意図したとおりにスクリプトを実行したという事実をログに記録するだけです。
スクリプトの最後に置くこともできます。重要なのは、スクリプトが呼び出されたことを確認することです。
もう一度テストしてから、cat /var/log/messages
を実行し、エコーを探します...表示されない場合は、実行されているもの、権限、ユーザーアカウントがいくつでもある可能性があります。スクリプトを確認してください。実行可能ファイルなど...おそらく最初のコメントに基づいて、期待どおりに実行されていないのではないかと思います。
したがって、エコーが表示された場合は、予想どおり、環境構成を確認します。テストのために、スクリプトでEC2変数と一緒にJava_HOMEをエクスポートします...後に追加します追加したエコーライン。明らかに、これはテスト目的のためだけであり、すべてが期待どおりに機能していることを確認したら、スクリプトからこれを削除して、環境を適切に構成する必要があります。ここでの私の最後の提案は、コマンドを変更することです...単一のコマンドでEIPの関連付けを解除して関連付けることができます。
これで、スクリプトは次のようになります。
#!/bin/bash
#vrrp.sh
echo "----------vrrp.sh running ------" >> /var/log/messages
cd /usr/local/ec2/ec2-api-tools-1.7.5.1/bin/
export Java_HOME="/usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/"
export EC2_BASE="/usr/local/ec2/ec2-api-tools-1.7.5.1/"
export EC2_URL=https://ec2.us-east-1.amazonaws.com
export AWS_ACCESS_KEY=AKIA3ROU5M3FQIQH4BNL
export AWS_SECRET_KEY=InBiqtOCfaJhCb3u3jE6gpmkW5shgjP8N++/7Huv
#Those are obviously not my access/secret keys, just providing an example
./ec2-associate-address -a eipalloc-s234523 -i i-023ksdfj --allow-reassociation
最後の注意:
認証するIAMユーザーアカウントに必要なIAMユーザーアカウントポリシーが添付されていることを確認してください...ポリシーの例を以下に示します。ポリシーを作成するには、ポリシーに移動する必要があります。作成したら、ユーザーと認証する特定のIAMユーザーアカウントと、作成したばかりのポリシーを添付します。ただし、フルアクセスアカウントを使用している場合は、その場合はお勧めしません。以下に概説するポリシーを使用してIAMユーザーアカウントを設定します。
arn:aws:iam :: 107890181863:policy/MOVE-EIPなど。
{
"Version": "2015-1-1",
"Statement": [
{
"Action": [
"ec2:AssociateAddress",
"ec2:DescribeAddresses",
"ec2:AllocateAddress",
"ec2:DisassociateAddress"
],
"Effect": "Allow",
"Resource": "*"
}
]
}