1. 程式人生 > >aws ec2 keepalived 的高可用構建

aws ec2 keepalived 的高可用構建

status eight 正常的 master cront tab trac 自己 out

前言:

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 分配給另一臺正常的主機即可。
那麼要解決的就是對主機及服務的判斷,最初的想法是寫個腳本做存活判斷,即:

1.主機讀取指定status文件內字符,判斷是否屬於master,然後檢測自身的服務是否處於存活狀態,存活則pass,否則檢查另一臺主機及服務狀態,存活則將Float IP 分配給另一個存活的主機並改寫status文件內容。
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 的高可用構建