本篇文章旨在深入探讨如何在AWS EC2环境中配置和部署Keepalived,以实现高可用性解决方案。在当今的云计算时代,业务连续性和系统稳定性对于任何企业来说都是至关重要的。对于那些对服务可用性有着严格要求的客户来说,任何形式的服务中断都可能导致重大的经济损失和客户信任度下降。因此,构建一个能够在服务器故障时自动切换的高可用架构变得尤为重要。
在本篇文章中,我们将详细介绍如何利用Keepalived这一强大的工具,在AWS EC2实例上实现高可用性配置。Keepalived是一个开源的软件负载均衡器和高可用性解决方案,它能够在多个服务器之间共享虚拟IP地址,并在主服务器发生故障时自动将流量重定向到备用服务器。
1、登录并访问AWS完成VPC-子网的创建。注意不要创建相同的Ipv4 块,以免需要和其他VPC打通内网时出现冲突。

2、登陆EC2控制台,选择密钥对,并点击创建,之后开始启动实例。

3、选择创建的密钥对,并填入合适的实例类型。选择创建的VPC和合适的子网(需要公开访问的选择public子网,否则选择private子网),并禁用自动分配公网IP,填入新建安全组名称,或者选择已经存在的安全组。之后填入存储的大小。
由于测试,所以直接创建了2台服务器(Keep alive主从两台选择到同一个子网内部) 



4、如果是正式环境服务器建议点击勾选高级详细信息的终止保护,之后就可以点击启动实例了(如果需要启动多台,注意修改启动数量)。

5、为两台服务器申请并绑定弹性IP。



6、修改实例安全组,打开22端口,并对本VPC的网段完全放开。

1、通过Xshell连接登陆两台服务器(或AWS会话管理器等任何方法都可),之后更新yum源,并安装依赖,开启 IPv4 数据包转发功能。
yum update yum -y install lrzsz jq amazon-linux-extras install epel -y yum -y install keepalived nginx cat >/etc/sysctl.conf<<EOF # 开启 IPv4 数据包转发功能 net.ipv4.ip_forward=1 # 允许绑定非本机的IP net.ipv4.ip_nonlocal_bind=1 EOF sysctl -p |
使用具备充足EC2权限的用户进入IAM服务,如图创建密钥,之后分别在两台机器上执行aws configure并输入ak、sk、region等信息:

进入/etc/keepalived,备份初始文件,并编辑写入新配置文件和虚拟IP切换脚本:
(注意主备两台机器存在差异,请分别见附件):
mv keepalived.conf keepalived.conf.bk
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id LVS_Master
}
# VRRP 的实例 Group_LVS_1 配置
vrrp_instance Group_LVS_1 {
state BACKUP # 配置为主服务
interface eth0
virtual_router_id 51 # 虚拟路由标识
priority 90 # 定义优先级,数字越大,优先级越高
advert_int 1 # 主备服务器之间同步检查的时间间隔
track_interface {
eth0
}
# AWS 上 VRRP 协议的组播被禁止,因此这里配置心跳通知为单播模式
unicast_src_ip 10.101.1.142 # 本机 IP
unicast_peer { # 单播对象 IP,也就是备份机器IP
10.101.1.4
}
# nopreempt # 设置 HA 集群的不抢占功能
# preemtp_delay 300 # 设置抢占延时时间,单位是秒。
authentication { # 验证类型和密码,可以随意设置,主备一致即可
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { # 虚拟 IP 地址,需要同子网但是未曾使用
10.101.1.100
}
# 切换虚拟 IP 的脚本文件
notify_master "/etc/keepalived/assign_private_ip.sh 10.101.1.100 i-07bb3377ca5f786fa"
notify_backup "/etc/keepalived/unassign_private_ip.sh 10.101.1.100 i-07bb3377ca5f786fa"
}
|
vim /etc/keepalived/assign_private_ip.sh:
#!/bin/bash set -o errexit set -o nounset PRIVATE_IP=$1 INSTANCE_ID=$2 # 1.根据实例 ID 找到网卡 ID ENI=$(\ aws ec2 describe-instances \ --instance-ids $INSTANCE_ID | \ jq -r \ '.Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId' \ ) # 2.绑定辅助私有 IP 地址到网卡 aws ec2 assign-private-ip-addresses \ --network-interface-id $ENI \ --private-ip-addresses $PRIVATE_IP \ --allow-reassignment # 3.手动刷新添加辅助私有IP地址到网卡 #ip addr add $PRIVATE_IP/24 dev eth0 #sudo dhclient echo "Adding Private IP to ENI $ENI" |
vim /etc/keepalived/unassign_private_ip.sh
#!/bin/bash set -o errexit set -o nounset PRIVATE_IP=$1 INSTANCE_ID=$2 # 1.根据实例 ID 找到网卡 ID ENI=$(\ aws ec2 describe-instances \ --instance-ids $INSTANCE_ID | \ jq -r \ '.Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId' \ ) # 2.解绑辅助私有 IP 地址 aws ec2 unassign-private-ip-addresses \ --network-interface-id $ENI \ --private-ip-addresses $PRIVATE_IP # 3.手动刷新删除辅助私有 IP 地址 #ip addr del $PRIVATE_IP/32 dev eth0 #sudo dhclient -r echo "Removing Private IP from ENI $ENI" |
授权keepalied 配置文件:
chmod 755 /etc/keepalived/*
chmod 600 /etc/keepalived/keepalived.conf
启动Keep Alive:
systemctl start keepalived
systemctl enable keepalived
四、验证配置
1、新启动一台同内网机器作为Client,并在两台旧服务器中安装nginx,并修改配置文件和index:


2、启动nginx,并从client访问nginx 监听的端口:
systemctl start nginx
systemctl enable nginx
之后使用while true; do curl 10.101.1.100:8181; sleep 1; done命令每间隔一秒请求一次
之后停止keepalived 01机器,再继续访问: 
通过在AWS EC2上部署Keepalived,我们可以实现一个高可用性的环境,其中服务可以在服务器故障时自动切换,确保业务的连续性和稳定性。这种配置不仅提高了系统的可靠性,还减少了因服务器故障导致的服务中断时间。对于需要高可用性解决方案的企业来说,这是一个既经济又高效的选择。
注意事项:
1、关于辅助私有IP,建议绑定到eth0的网卡上
2、对于keepalived配置文件和执行脚本,请注意完成权限授予,否则无法完成Keep alived自动切换
3、两台机器一定要部署在同一个子网中,且辅助私有IP也要根据子网网段划分