我是 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
我在两个实例上都安装并配置了 HAProxy。为了测试目的,我安装了 Apache 来提供基本的 index.html 页面,这样我就可以测试 HAProxy 是否正在执行 LB 任务,以及循环调度是否正常工作。
我想要实现的是使用 Keepalived 来监控 LB1 上的 haproxy 进程(已分配 EIP),如果它由于某种原因失败或停止,它会调用一个脚本,该脚本使用 AWS EC2 API 工具将弹性 IP 重新分配给第二个负载均衡器以接管..
我已经在 Google 上搜索并查看了文档以创建一个实现此目的的脚本,但是,当我测试它并且 HAProxy 服务停止时,它不会运行该脚本。
LB1- 内容keepalived配置文件
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 脚本调用时则不会。
有什么想法吗?我已经挠头一整天了,笔记本电脑马上就要被扔出窗外了。
答案1
当进入故障状态notify_fault
时调用该脚本。keepalived
您想使用以下方式配置脚本
notify_master /etc/keepalived/vrrp.sh
答案2
您能粘贴您的 backup.conf 和 slave.conf 文件吗?
另外,你应该查看这两篇文章:
http://www.trk7.com/blog/keepalived-instance-not-entering-failed-state/或者http://comments.gmane.org/gmane.linux.keepalived.devel/4102?
答案3
首先确定脚本是否正在执行,我会在下面直接添加以下行#!/bin/bash
。
echo "----------vrrp.sh running ------" >> /var/log/messages
或者任何你想要的东西...只是为了记录应用程序已经看到从备份到主或其他的“状态”转换,并且实际上已经按预期执行了脚本。
您也可以将其放在脚本的末尾,重点只是确保脚本被调用。
再次测试它,然后cat /var/log/messages
,寻找你的回声...你应该看到它,如果你没有看到它,那么它可能是任何数量的东西,权限,正在运行的用户帐户,确保脚本可执行,等等...可能基于你最初的评论,我怀疑它正在执行它只是没有做你期望的事情。
因此,如果您确实看到了 echo(正如我所料),那么我会查看您的环境配置,您可以做的(仅用于测试)是将 JAVA_HOME 连同脚本中的 EC2 变量一起导出... 将它们添加到您刚刚添加的 echo 行之后。显然,这只是为了测试目的,一旦您确认一切按预期工作,那么您应该将其从脚本中删除,并适当地配置您的环境。我在这里的最后一个建议是更改您的命令... 您可以在单个命令中解除关联并关联 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": "*"
}
]
}