How*_*ard 0 high-availability amazon-ec2 amazon-web-services amazon-elastic-ip keepalived
问题是如果我想使用keepalived,我的两个 EC2 实例(ha 代理)需要绑定一个虚拟 IP ,但它们在 EC2 中是不可能的,因为在给定时间只有一个实例可以使用弹性 IP,所以它是不可能吧?
更新 2021。您可以使用它。但你可能不应该。现在几乎没有理由这样做。Elastic Load Balancer 应该可以完成大多数人需要的大部分工作。
接受的答案不再正确。
一般来说,您应该使用 ELB。但是,您可能会发现 ELB 无法满足的罕见需求,并且您更愿意使用 keepalived,即使它违背了最佳实践。
Keepalived 和 VRRP 在 Amazon VPC 中工作。它不适用于 ec2-classic。
使用 keepalived 中的notify或notify_master命令keepalived.conf。
然后通知脚本调用aws cliwithdisassociate-address和associate-addressoptions解除绑定再绑定地址,而不是通过keepalived本身的VIP机制。它工作正常。
这是一个示例通知脚本:
#!/bin/bash
TYPE=$1
NAME=$2
STATE=$3
function die
{
echo "${1-Died} at ${BASH_SOURCE[1]}:${FUNCNAME[1]} line ${BASH_LINENO[0]}."
exit 1
}
function master
{
# Check if an elastic IP is defined
test -n "$EC2_EIP" || die 'elastic ip not defined'
# Attempt to read the instance-id
EC2_INSTANCE_ID="`wget -q -O - http://instance-data/latest/meta-data/instance-id || die \"wget instance-id has failed: $?\"`"
test -n "$EC2_INSTANCE_ID" || die 'cannot obtain instance-id'
if [ -z $EC2_REGION ]; then
# Get the region if not set
EC2_AVAIL_ZONE=`wget -q -O - http://instance-data/latest/meta-data/placement/availability-zone`
EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
fi
# Call into ec2. Make sure ec2 output
echo "aws ec2 disassociate-address --public-ip $EC2_EIP --region=$EC2_REGION"
/usr/bin/aws ec2 disassociate-address --public-ip $EC2_EIP --region=$EC2_REGION
if [ $? -eq 0 ]; then
echo "disassocate-address: success"
fi;
echo "aws ec2 associate-address --public-ip $EC2_EIP --instance-id $EC2_INSTANCE_ID --region=$EC2_REGION"
/usr/bin/aws ec2 associate-address --public-ip $EC2_EIP --instance-id $EC2_INSTANCE_ID --region=$EC2_REGION
if [ $? -eq 0 ]; then
echo "associate-address: success"
fi;
}
case $STATE in
"MASTER") master
exit 0
;;
"BACKUP") exit 0
;;
"FAULT") exit 0
;;
*) echo "unknown state"
exit 1
;;
esac
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息和工作示例,请访问以下链接:
| 归档时间: |
|
| 查看次数: |
4267 次 |
| 最近记录: |