背景:伺服器版本Centos7.9
(1)下載安裝Keepalived原始碼包
在伺服器上解壓
tar -xf keepalived-2.2.8.tar.gz
安裝相關前置依賴
yum -y install gcc gcc-c++
使用configure工具進行安裝
./configure --sysconfdir=/etc --prefix=/usr/local/keepalived --sbindir=/usr/sbin --bindir=/usr/bin
--sysconfdir=DIR #指定配置檔案位置
--prefix=DIR #指定安裝路徑
--sbindir=DIR 指定命令位置,後面不需再配置環境變數
使用make make install進行安裝
make && make install
(2)配置Keepalived在業務中的引數
本次操作為Keepalived單VIP搶佔式配置,即兩個虛擬機器只有一臺繫結VIP對外提供服務,且在一臺主機失能時VIP將漂移到備機上接收流量,當主機恢復時VIP將再次切換
主機配置
global_defs {
router_id logincas1 ### router_id為全域性定義當前節點的id,一般為唯一
enable_script_security
script_user root ##定義執行指令碼的角色
vrrp_version 2
}
## 定義指令碼
vrrp_script chk_nginx {
script "/usr/local/nginx-check.sh" ##指令碼路徑
interval 2 ##檢測間隔
timeout 4 ##失敗間隔,失敗兩次通訊則失敗
rise 4 ##成功四次則成功
fall 2 ##失敗兩次則切換
weight -50 ##指令碼檢測失敗則扣減權重
}
vrrp_instance VI_1 { ##模組配置
version 2
state MASTER ##搶佔式的情況下主機需設定為MASTER,備機為BACKUP
interface eth0 ##指定VIP流量的網路卡
virtual_router_id 51 ##虛擬路由ID
priority 100 ##優先順序,備機應比主機低一些
advert_int 1 ##VRRP心跳包傳送間隔
authentication { ##許可權認證
auth_type PASS ##型別:密碼
auth_pass 2222
}
virtual_ipaddress {
172.29.184.220/24 ##VIP配置
}
track_script { ##指令碼定義
chk_nginx
}
}
接下來需要補充完善 nginx-check.sh
思路是透過去檢測是否有Nginx程式,檢測到沒有nginx程式時先執行Nginx的重啟操作,一秒之後再次檢測,如果Nginx程式還是不存在則關閉Keepalived,使VIP漂移到另一個節點
#!/bin/bash
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
systemctl restart nginx
sleep 1
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
systemctl stop keepalived
fi
fi
遇到的一些問題
當在指令碼里使用ps aux | grep nginx | grep -v grep | wc -l去檢測Nginx程式時發現指令碼一直未生效,合理懷疑是Keepalived執行使用者在執行這條命令時存在許可權問題(指令碼不能配置許可權為777,Keepalived會警告並失效)
本次使用的高可用架構為單VIP架構,後續也可以嘗試雙VIP架構,即互為主備機,配置兩個VIP模組,可以選擇使用一個VIP接收流量,也可以使用兩個VIP來監聽流量,看業務的需求。
在單VIP高可用架構中,如果想要主機恢復後VIP不漂移到主機上,可以將主機的state也設定為BACKUP,但優先順序需要比備機高一些,以確保初始狀態VIP是繫結在主機上的