使用Keepalived在VPC实现高可用架构
更新时间:2026-10-05
概述
本文档介绍如何使用 Keepalived 检测服务器状态,并通过辅助 IP 切换实现高可用服务。Keepalived 通常用于搭建 Nginx、MySQL 等高可用服务。
需求场景
当主服务器发生故障无法对外提供服务时,动态将辅助 IP 切换到备服务器,继续对外提供服务。
方案概述
通常高可用主备集群包含 2 台服务器,一台主服务器处于某种业务的激活状态,即 Active 状态;另一台备服务器处于该业务的备用状态,即 Standby 状态。主服务器上绑定了一个辅助 IP,当主服务器出现问题时,主服务器释放该辅助 IP,然后备用服务器绑定该辅助 IP 继续提供服务。
示例场景:
3台云主机,其中2台作为主备,其中一台进行流量测试。弹性网卡辅助IP为172.16.0.100。
| 云主机名称 | 虚机ID | 网卡ID | 内网IP | 角色 |
|---|---|---|---|---|
| VM1 | i-U63mWIg9 | eni-jdbx8ddgpsz1 | 172.16.0.202 | 主 |
| VM2 | i-jW72IAK8 | eni-1jvkdmai1iu1 | 172.16.0.203 | 备 |
| VM3 | i-Y99AbvOF | eni-h5242i8788v0 | 172.16.0.201 | 测试机 |
配置步骤
1.在主服务器和备服务器上搭建Keepalived,使用 yum 方式安装软件包。
Plain Text
1 yum install keepalived -y
2.设置抢占默认,配置脚本来check服务。keeplived check脚本/tmp/check_status.sh如下:
Plain Text
1#!/bin/sh
2if [ ! -f /tmp/down ]; then
3 exit 1
4fi
5exit 0
如何获取AKSK
生成POST token的文件 post_sign.py
生成DELETE token的文件 delete_sign.py
地址切换脚本changed_ip.sh如下:
Plain Text
1 #!/bin/bash
2
3 STATUS=$1
4 MASTERENI=$2
5 BACKUPENI=$3
6 IP=$4
7
8 set_master_eni_ip()
9 {
10 TOKEN=`cat /proc/sys/kernel/random/uuid`
11 SIGN=`python /root/post_sign.py $MASTERENI $TOKEN`
12 curl -H "Host:<BCC API 域名>" -H "Content-Type:application/json;charset=UTF-8" -H "Authorization:$SIGN" -X POST --data '{"privateIpAddress":"'$IP'"}' "http://<BCC API 域名>/v1/eni/$MASTERENI/privateIp?clientToken=$TOKEN"
13 }
14
15 del_backup_eni_ip()
16 {
17 TOKEN=`cat /proc/sys/kernel/random/uuid`
18 SIGN=`python /root/delete_sign.py $BACKUPENI $IP $TOKEN`
19 curl -H "Host:<BCC API 域名>" -H "Content-Type:application/json;charset=UTF-8" -H "Authorization:$SIGN" -X DELETE "http://<BCC API 域名>/v1/eni/$BACKUPENI/privateIp/$IP?clientToken=$TOKEN"
20 }
21
22 case "$1" in
23 master)
24 del_backup_eni_ip
25 set_master_eni_ip
26 ;;
27 backup)
28 ;;
29 esac
注:changed_ip.sh $role $master_eni $backup_eni $ip
- role: 切换的角色,目前脚本仅实现了 master
- master_eni:需要新增IP的网卡
- backup_eni:需要删除IP的网卡
-
ip: 需要变动的IP,一般为内网IP
3.登录主服务器,执行/etc/keepalived/keepalived.conf,修改相关配置。
Plain Text
1 ! Configuration File for keepalived
2
3 global_defs {
4 notification_email {
5 acassen@firewall.loc
6 failover@firewall.loc
7 sysadmin@firewall.loc
8 }
9 notification_email_from Alexandre.Cassen@firewall.loc
10 smtp_server 192.168.200.1
11 smtp_connect_timeout 30
12 router_id LVS_DEVEL
13 vrrp_skip_check_adv_addr
14 # vrrp_strict
15 vrrp_garp_interval 0
16 vrrp_gna_interval 0
17 }
18
19 vrrp_instance VI_1 {
20 state MASTER
21 interface eth0
22 virtual_router_id 51
23 priority 100
24 advert_int 1
25 authentication {
26 auth_type PASS
27 auth_pass 1111
28 }
29 virtual_ipaddress {
30 <辅助 IP 地址>
31 }
32 unicast_src_ip <主服务器内网 IP>
33 unicast_peer {
34 <备服务器内网 IP>
35 }
36 notify_master "/usr/bin/echo master >> /tmp/keep_status;date >> /tmp/keep_status;/root/changed_ip.sh master <主服务器弹性网卡 ID> <备服务器弹性网卡 ID> <辅助 IP 地址>;date >> /tmp/keep_status;"
37 notify_backup "/usr/bin/echo backup >> /tmp/keep_status"
38 notify_fault "/usr/bin/echo fault >> /tmp/keep_status"
39 }
4.登录备服务器,执行/etc/keepalived/keepalived.conf,修改相关配置。
Plain Text
1 ! Configuration File for keepalived
2
3 global_defs {
4 notification_email {
5 acassen@firewall.loc
6 failover@firewall.loc
7 sysadmin@firewall.loc
8 }
9 notification_email_from Alexandre.Cassen@firewall.loc
10 smtp_server 192.168.200.1
11 smtp_connect_timeout 30
12 router_id LVS_DEVEL
13 vrrp_skip_check_adv_addr
14 # vrrp_strict
15 vrrp_garp_interval 0
16 vrrp_gna_interval 0
17 }
18
19 vrrp_instance VI_1 {
20 state BACKUP
21 interface eth0
22 virtual_router_id 51
23 priority 90
24 advert_int 1
25 authentication {
26 auth_type PASS
27 auth_pass 1111
28 }
29 virtual_ipaddress {
30 <辅助 IP 地址>
31 }
32 unicast_src_ip <备服务器内网 IP>
33 unicast_peer {
34 <主服务器内网 IP>
35 }
36 notify_master "/usr/bin/echo master >> /tmp/keep_status;date >> /tmp/keep_status;/root/changed_ip.sh master <备服务器弹性网卡 ID> <主服务器弹性网卡 ID> <辅助 IP 地址>;date >> /tmp/keep_status;"
37 notify_backup "/usr/bin/echo backup >> /tmp/keep_status"
38 notify_fault "/usr/bin/echo fault >> /tmp/keep_status"
39 }
说明
- keepalived 启动时可能会设置防火墙,因此测试流量连通性时删除即可。
Plain Text
1 iptables -D INPUT 1

5.功能验证,在云服务器 1 生成 down 文件
Plain Text
1 touch /tmp/down

删除此文件,会自动切回主,断网时间 5 秒左右。

相关产品
评价此篇文章
