一、说明 

本篇文章旨在深入探讨如何在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的网段完全放开。

三、Keep Alive部署配置

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等信息:


  1. 登陆主服务器,配置keep alive:

进入/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也要根据子网网段划分

附件(内含代码)

Keep alived.zip

  • No labels