使用EIP(基本EC2)在AWS EC2中设置HAProxy / Keepalived vrrp

我是CentOS / Linux / HAProxy / Keepalived的新手,所以在过去几天里我学到了很多东西!

我在Amazon AWS中有2个CentOS 6.5服务器运行在他们自己的EC2 Micro实例上。 我也有1个弹性IP设置。 每个实例都有以下安装:

  • Amazon EC2 API工具
  • HAProxy的
  • KEEPALIVED
  • Apache / httpd
  • Java OpenJDK 1.6

我已经在两个实例上安装并configuration了HAProxy。 出于testing的目的,我安装了Apache来提供一个基本的index.html页面,这样我就可以testingHAProxy正在执行LB任务,并且循环法工作正常。

我试图实现的是使用Keepalived来监视LB1(已分配EIP)上的haproxy进程,如果由于某种原因失败或停止,它将调用一个脚本,该脚本使用AWS EC2 API Tools将弹性IP重新分配给第二Loadbalancer接pipe..

我已经GOOGLE了,看文档来创build一个脚本来实现这一点,但是,当我testing它和HAProxy服务停止,它不运行脚本..

LB1keepalived.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 } 

来自Tailing日志的输出

 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脚本中调用。

有任何想法吗!? 我一整天都在摸头,笔记本电脑即将被推出窗外。

keepalived进入故障状态时,会调用notify_fault脚本。

你想使用configuration你的脚本

 notify_master /etc/keepalived/vrrp.sh 

你能粘贴你的backup.conf和slave.conf文件吗?

另外,你应该检查这两个文章:

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 

或任何你想要的东西…只是为了logging应用程序已经看到从备份到主或任何其他的“状态”转换的事实,并且事实上按预期执行了脚本。

你可以把它放在脚本的末尾,重点是确保脚本被调用。

再次testing,然后cat /var/log/messages ,并寻找你的回声…你应该看到它,如果你不这样做可以是任何数量的东西,权限,正在运行的用户帐户,确保脚本可执行文件等等…可能基于您的初始评论我怀疑它正在执行它只是没有做你期望的。

所以,如果你确实看到你的回声,那么我会看你的环境configuration,你可以做什么,只是为了testing,导出你的JAVA_HOME以及你的EC2variables在脚本中…添加它们之后你刚刚添加的回声线。 显然,这仅仅是为了testing的目的,一旦你确认它的所有工作正常,那么你应该从脚本中删除它,并适当地configuration你的环境。 我最后的build议是改变你的命令…你可以在一个命令中分离和关联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 

最后说明:

请确保您正在进行身份validation的IAM用户帐户具有附加的必要IAM用户帐户策略…策略的一个示例如下,您将不得不去创build策略,然后一旦创build刚刚获得的用户您正在validation的特定IAM用户帐户并附加您刚刚创build的策略,除非您使用的是完整访问帐户,在这种情况下,我会build议您不要这样做。 并使用以下策略设置IAM用户帐户:

arn:aws:iam :: 107890181863:policy / MOVE-EIP或其他。

 { "Version": "2015-1-1", "Statement": [ { "Action": [ "ec2:AssociateAddresss", "ec2:DescribeAddresses", "ec2:AllocateAddress", "ec2:EIPAssociation", "ec2:DisassociateAddress" ], "Effect": "Allow", "Resource": "*" } ] }