KeepAlived
KeepAlived安裝
1.yum源安裝
yum install keepalived
2.官網原始碼包編譯
KeepAlived官網提供可編譯原始碼包,可直接下載。
官網地址:
官網提供的軟體包,解壓編譯安裝即可。
KeepAlived部署
高可用實現支援多種叢集配置模式:主備模式,主主模式,N+1模式,N+M模式;另外支援資源及節點故障檢測。
準備工作
- 硬體準備
要實現KeepAlived的多種模式,因此這裡準備了4臺虛擬機器進行測試,裝置IP分別為:
192.168.25.23
192.168.25.24
192.168.25.25
192.168.25.26
- 軟體準備
本次高可用實現以nginx進行效果展示,nginx未進行任何配置,僅修改了對應index.html檔案以展示對應情況的高可用實現效果。
- nginx準備
系統可透過軟體倉庫安裝nginx:
yum install nginx -y
啟動nginx:
nginx
系統預設安裝並啟動了ApacheHttp服務,因此需要關閉httpd服務:
systemctl stop httpd
systemctl disable httpd
如果仍舊不能正常訪問nginx主頁,需要新增防火牆規則或關閉防火牆。
此處為方便後續操作且非為測試環境,所以關閉防火牆,如在生產環境,請新增防火牆規則:
systemctl stop firewalld
systemctl disable firewalld
分別在各個測試機中啟動nginx後,測試頁面是否正常顯示,如出現以下頁面即為正常:
為了方便辨別實現效果,此處修改nginx的主頁。
nginx主頁的位置為:
/usr/share/nginx/html/index.html
編輯index.html:
vim /usr/share/nginx/html/index.html
在86行下新增內容:
<h2><strong>The IP is 192.168.25.**</strong></h2>
IP地址根據實際情況進行修改,效果如下:
新增nginx預設啟動:
systemctl enable nginx
至此,nginx準備完畢。
- keepalivd準備
軟體倉庫安裝keepalived,分別在測試機上執行:
yum install keepalived -y
確認安裝情況,執行指令碼:
keepalived -v
輸出內容如下:
查詢對應的配置檔案:
rpm -ql keepalived
相關內容如下:
檔案說明:
/etc/keepalived -主目錄
/etc/keepalived/keepalived.conf -配置檔案
/etc/sysconfig/keepalived -系統配置檔案
/usr/lib/systemd/system/keepalived.service -系統服務
/usr/libexec/keepalived -庫目錄
/usr/sbin/keepalived -系統命令
Keepalived主要透過修改/etc/keepalived/keepalived.conf配置檔案進行配置高可用叢集。
主備模式
節點配置
此模式下使用兩臺虛擬機器和一個虛擬IP進行:
主節點:192.168.25.23
備節點:192.168.25.24
虛擬IP:192.168.25.10
- 主節點(192.168.25.23)配置內容:
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface enp1s0
virtual_router_id 86
priority 200
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
- 備節點(192.168.25.24)配置內容:
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 200
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.23
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
驗證
正常狀態
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論重新整理多少次均顯示為主節點提供服務。
故障
- 停止主節點keepalived服務,主節點執行;
systemctl stop keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10;
- 頁面實際訪問地址為192.168.25.24,當前由於主節點故障,備用節點啟用,接管VIP流量。
故障恢復
- 重新啟動主節點keepalived服務;
systemctl restart keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10;
- 頁面實際訪問地址為192.168.25.23,主節點恢復,接管VIP流量。
1+N(一主多備)模式
節點配置
此模式下使用三臺虛擬機器(備用節點)進行:
主節點:192.168.25.23
備節點1:192.168.25.24
備節點2:192.168.25.25
虛擬IP:192.168.25.10
- 主節點(192.168.25.23)配置內容:
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface enp1s0
virtual_router_id 86
priority 200
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.24
192.168.25.25
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
- 備節點(192.168.25.24)配置內容:
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 100
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.23
192.168.25.25
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
- 備節點(192.168.25.25)配置內容:
! Configuration File for keepalived
global_defs {
router_id PV25
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 20
unicast_src_ip 192.168.25.25
unicast_peer {
192.168.25.23
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
驗證
正常狀態
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論重新整理多少次均顯示為主節點提供服務。
故障-1
- 停止主節點keepalived服務,主節點執行;
systemctl stop keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10;
- 頁面實際訪問地址為192.168.25.24,當前由於主節點故障,備用節點啟用,由於備用節點1優先順序高於備用節點2,所以備用節點1接管VIP流量。
故障-2
- 停止備節點1keepalived服務,備節點1執行;
systemctl stop keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10;
- 頁面實際訪問地址為192.168.25.25,當前由於備節點1故障,備用節點2啟用,所以備用節點2接管VIP流量。
故障恢復-1
- 重新啟動主節點keepalived服務;
systemctl restart keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10;
- 頁面實際訪問地址為192.168.25.23,主節點恢復,接管VIP流量。
故障恢復-2
- 重新啟動備節點1keepalived服務;
systemctl restart keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10;
- 頁面實際訪問地址為192.168.25.23,當前由於主節點狀態正常,繼續管理VIP流量。
主主(互為主備)模式
此模式下兩臺機器兩個虛擬IP,每臺機器對應一個虛擬IP的主節點,對應另一個虛擬IP的備節點,兩臺機器互為主備。
節點配置
此模式下使用兩臺虛擬機器進行:
節點1:192.168.25.23
節點2:192.168.25.24
虛擬IP1:192.168.25.10
虛擬IP2:192.168.25.20
- 節點1配置內容
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface enp1s0
virtual_router_id 86
priority 200
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
vrrp_instance VI_2 {
state BACKUP
interface enp1s0
virtual_router_id 85
priority 20
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.20
}
}
- 節點2配置內容
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 100
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.23
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
vrrp_instance VI_2 {
state MASTER
interface enp1s0
virtual_router_id 85
priority 100
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.23
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.20
}
}
驗證
正常狀態
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論重新整理多少次均顯示為VIP1的主節點-節點1提供服務。
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論重新整理多少次均顯示為VIP2的主節點-節點2提供服務。
故障-1
- 停止節點1keepalived服務,節點1執行;
systemctl stop keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.24,當前由於節點1故障,備用節點啟用,所以作為節點1的備用節點,節點2接管VIP1流量。
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論重新整理多少次均顯示為VIP2的主節點-節點2提供服務。
故障-1恢復
- 恢復節點1keepalived服務,節點1執行;
systemctl restart keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,由於節點1已恢復,作為VIP1的主節點-節點1,節點1恢復接管VIP1流量。
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論重新整理多少次均顯示為VIP2的主節點-節點2提供服務。
故障-2
- 停止節點2keepalived服務,節點2執行;
systemctl stop keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論重新整理多少次均顯示為VIP1的主節點-節點1提供服務。
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.23,當前由於節點2故障,備用節點啟用,所以作為節點2的備用節點,節點1接管VIP2流量。
故障-2恢復
- 恢復節點2keepalived服務,節點1執行;
systemctl restart keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論重新整理多少次均顯示為VIP1的主節點-節點1提供服務。
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.24,由於節點2已恢復,作為VIP2的主節點-節點2,節點2恢復接管VIP2流量。
N+1模式
此模式下三臺機器兩個虛擬IP,兩臺機器各對應一個虛擬IP的主節點,另外一臺機器為兩個虛擬IP的備節點。
節點配置
此模式下使用兩臺虛擬機器進行:
主節點1:192.168.25.23
主節點2:192.168.25.24
備節點:192.168.25.25
虛擬IP1:192.168.25.10
虛擬IP2:192.168.25.20
- 節點1配置內容
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface enp1s0
virtual_router_id 86
priority 200
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.25
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
- 主節點2配置內容
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_2 {
state MASTER
interface enp1s0
virtual_router_id 85
priority 100
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.25
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.20
}
}
- 備節點配置內容
! Configuration File for keepalived
global_defs {
router_id PV25
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 100
unicast_src_ip 192.168.25.25
unicast_peer {
192.168.25.23
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
vrrp_instance VI_2 {
state BACKUP
interface enp1s0
virtual_router_id 85
priority 20
unicast_src_ip 192.168.25.25
unicast_peer {
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.20
}
}
驗證
正常狀態
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論重新整理多少次均顯示為VIP1的主節點-節點1提供服務。
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論重新整理多少次均顯示為VIP2的主節點-節點2提供服務。
故障-1
- 停止主節點1keepalived服務,主節點1執行;
systemctl stop keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.25,當前由於主節點1故障,備用節點啟用,所以作為節點1的備用節點,備節點接管VIP1流量。
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論重新整理多少次均顯示為VIP2的主節點-節點2提供服務。
故障-1恢復
- 恢復主節點1keepalived服務,主節點1執行;
systemctl restart keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,由於節點1已恢復,作為VIP1的主節點-主節點1,主節點1重新接管VIP1流量。
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.24,當前為正常狀態,無論重新整理多少次均顯示為VIP2的主節點-主節點2提供服務。
故障-2
- 停止主節點2keepalived服務,主節點2執行;
systemctl stop keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論重新整理多少次均顯示為VIP1的主節點-主節點1提供服務。
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.25,當前由於主節點2故障,備用節點啟用,所以作為主節點2的備用節點,備節點接管VIP2流量。
故障-2恢復
- 恢復節點2keepalived服務,節點1執行;
systemctl restart keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論重新整理多少次均顯示為VIP1的主節點-節點1提供服務。
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.24,由於主節點2已恢復,作為VIP2的主節點-主節點2,主節點2恢復接管VIP2流量。
故障-3
- 停止主節點1keepalived服務,主節點1執行;
systemctl stop keepalived
- 停止主節點2keepalived服務,主節點2執行;
systemctl stop keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.25,當前由於主節點1故障,備用節點啟用,所以作為節點1的備用節點,備節點接管VIP1流量。
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.25,當前由於主節點2故障,備用節點啟用,所以作為主節點2的備用節點,備節點接管VIP2流量。
故障-3恢復
- 恢復主節點1keepalived服務,主節點1執行;
systemctl restart keepalived
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,由於節點1已恢復,作為VIP1的主節點-主節點1,主節點1重新接管VIP1流量。
- 恢復節點2keepalived服務,節點1執行;
systemctl restart keepalived
- 瀏覽器訪問虛擬IP:192.168.25.20
- 頁面顯示實際訪問地址為192.168.25.24,由於主節點2已恢復,作為VIP2的主節點-主節點2,主節點2恢復接管VIP2流量。
N+M模式
N+M模式的配置參考N+1模式,複製備節點即可
資源故障檢測
說明
Keepalived透過在配置檔案中新增script來實現對服務狀態的檢測和故障切換
在global配置段外定義指令碼或者shell命令,然後再virtual_server配置段中呼叫指令碼,最後根據指令碼的執行結果(成功或失敗) 來增加或減少當前的節點的優先順序,因為keepalived是根據優先順序來判斷是否為主節點 所以當優先順序低時則就成為備份節點 從而將VIP飄動到優先順序高的主節點上 實現了對其他服務的高可用
script配置及呼叫說明:
vrrp_script chk_nginx { # chk_nginx為自定義的vrrp指令碼名稱 後續呼叫需要此名稱
script "killall -0 sshd" # 執行的指令碼或命令
interval 2 # 監測的時間間隔 單位:秒 預設:1秒
weight -4 # 此值預設為0 範圍:-253~253 ,
# 如果此值為負數 則代表當上面的指令碼或命令執行失敗時($?結果為非0) 則將本節點的優先順序減去定義的值;
# 如果此值為正數 則代表當上面的指令碼或命令執行成功時($?結果為0) 則將本節點的優先順序加上定義的值
fall 2 # 指令碼或命令執行幾次失敗後 將本節點標記為失敗(進而進行減優先順序操作)
rise 2 # 指令碼或命令執行幾次成功後 將本節點標記為成功(進而恢復節點)
user USERNAME # 以什麼使用者身份執行指令碼
}
vrrp_instance VI_1 {
...
track_script {
script_name
}
}
節點配置
本次使用兩臺虛擬機器和一個虛擬IP進行配置:
主節點:192.168.25.23
備節點:192.168.25.24
虛擬IP:192.168.25.10
- 主節點配置內容:
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -30
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface enp1s0
virtual_router_id 86
priority 100
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
track_script {
check_nginx
}
}
- 備節點配置內容:
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -30
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 80
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.23
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
track_script {
check_nginx
}
}
- 配置檢測指令碼
分別在主節點和備節點編輯指令碼,編輯:
vim /etc/keepalived/check_nginx.sh
指令碼內容為:\
#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
# nginx # 此處為展示效果,在nginx出現故障後,註釋不重啟nginx。
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
為指令碼新增執行許可權:
chmod +x /etc/keepalived/check_nginx.sh
驗證
正常狀態
- 瀏覽器訪問虛擬IP:192.168.25.10
- 頁面顯示實際訪問地址為192.168.25.23,當前為正常狀態,無論重新整理多少次均顯示為主節點提供服務。
nginx服務故障
- 停止主節點nginx服務,主節點執行;
killall nginx
- 瀏覽器訪問虛擬IP:192.168.25.10;
- 頁面實際訪問地址為192.168.25.24,當前由於主節點資源故障,權重-30,優先順序低於備用節點,備用節點啟用,接管VIP流量。
nginx服務恢復
故障恢復
- 重新啟動主節點nginx服務;
nginx
- 瀏覽器訪問虛擬IP:192.168.25.10;
- 頁面實際訪問地址為192.168.25.23,主節點nginx恢復,權重恢復,優先順序高於備用節點,重新接管VIP流量。