使用Keepalived在VPC实现高可用架构
更新时间:2024-08-26
概览
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
3STATUS=$1
4MASTERENI=$2
5BACKUPENI=$3
6IP=$4
7
8set_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.bj.baidubce.com" -H "Content-Type:application/json;charset=UTF-8" -H "Authorization:$SIGN" -X POST --data '{"privateIpAddress":"'$IP'"}' "http://bcc.bj.baidubce.com/v1/eni/$MASTERENI/privateIp?clientToken=$TOKEN"
13}
14
15del_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.bj.baidubce.com" -H "Content-Type:application/json;charset=UTF-8" -H "Authorization:$SIGN" -X DELETE "http://bcc.bj.baidubce.com/v1/eni/$BACKUPENI/privateIp/$IP?clientToken=$TOKEN"
20}
21
22case "$1" in
23 master)
24 del_backup_eni_ip
25 set_master_eni_ip
26 ;;
27 backup)
28 ;;
29esac
注: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 Text1! Configuration File for keepalived 2 3global_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 19vrrp_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 172.16.0.100 31 } 32 unicast_src_ip 172.16.0.202 33 unicast_peer { 34 172.16.0.203 35 } 36 notify_master "/usr/bin/echo master >> /tmp/keep_status;date >> /tmp/keep_status;/root/changed_ip.sh master eni-jdbx8ddgpsz1 eni-1jvkdmai1iu1 172.16.0.100;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 Text1! Configuration File for keepalived 2 3global_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 19vrrp_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 172.16.0.100 31 } 32 unicast_src_ip 172.16.0.203 33 unicast_peer { 34 172.16.0.202 35 } 36 notify_master "/usr/bin/echo master >> /tmp/keep_status;date >> /tmp/keep_status;/root/changed_ip.sh master eni-1jvkdmai1iu1 eni-jdbx8ddgpsz1 172.16.0.100;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
1iptables -D INPUT 1
5.功能验证,在云服务器1生成down文件
Plain Text
1touch /tmp/down
删除此文件,会自动切回主,断网时间5秒左右。