aws ec2 keepalived 的高可用構建
AWS 已有ALB (Application Load Balancer) 和 NLB (Network Load Balancer),可滿足大部分業務需求,但某些業務場景仍需要自建高可用環境。
此文便是基於AWS EC2 自建高可用主機。
準備:
EC2 host1:192.168.10.10
EC2 host2:192.168.10.20
Float IP:192.168.10.30
思路:
AWS EC2 主機支持分配輔助IP,可使用AWS CLI 創建輔助IP,基於此方式,只要當主機或服務出現故障時,將輔助IP 分配給另一臺正常的主機即可。
那麼要解決的就是對主機及服務的判斷,最初的想法是寫個腳本做存活判斷,即:
2.不屬於master,則檢測自身的服務是否處於存活狀態,存活則檢查master服務是否存活,存活則pass,否則將Float IP 分配給自己並改寫status文件內容。
將腳本加入crontab,並每3秒執行一次
後來感覺還是用keepalived 做更省事些……
正文:
這裏不做keepalived 安裝說明,只講講keepalived 的實現思路及最終配置。
keepalived 間使用單播方式,使用pidof 檢測應用服務,使用notify_master 狀態轉換通知執行創建Float IP腳本,將Foat IP分配給自身
keepalived master配置:
global_defs { script_user ec2-user #指定執行腳本用戶 enable_script_security } vrrp_script check_haproxy { script "/sbin/pidof haproxy" interval 5 fall 2 rise 2 weight -30 user ec2-user } vrrp_instance VI_1 { state MASTER interface eth0 smtp_alert virtual_router_id 51 priority 120 unicast_src_ip 192.168.10.10 unicast_peer { 192.168.10.20 } advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { check_haproxy } notify_master "/etc/keepalived/floatip.sh" }
keepalived backup配置:
global_defs {
script_user ec2-user
enable_script_security
}
vrrp_script check_haproxy {
script "/sbin/pidof haproxy"
interval 5
fall 2
rise 2
weight -30
user ec2-user
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
smtp_alert
virtual_router_id 51
priority 100
unicast_src_ip 192.168.10.20
unicast_peer {
192.168.10.10
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_haproxy
}
notify_master "/etc/keepalived/floatip.sh"
}
floatip.sh
#!/bin/bash
PIP=192.168.10.30
INTERFACE_ID=eni-f65555
/usr/bin/aws ec2 assign-private-ip-addresses --allow-reassignment --network-interface-id $INTERFACE_ID --private-ip-addresses $PIP
註意:
在執行aws cli時,需要明確ec2 主機的網絡接口id,這裏的網絡接口指的是本機,因爲keepalived 定義的是本機狀態轉換爲master 時觸發的notify_master 通知
後言:
使用keepalived 後,不用在寫存活監控的腳本,只需寫好aws cli創建floatip的腳本即可
參考:
https://www.peternijssen.nl/high-availability-haproxy-keepalived-aws/
aws ec2 keepalived 的高可用構建