四、Keepalived
【1】、keepalived執行原理
- Keepalived檢測每個伺服器接節點狀態
- 伺服器節點異常或出現工作故障,keepalived將故障節點從叢集系統中剔除
- 故障節點恢復後,Keepalived再將其加入到叢集系統中
- 所有工作自動完成,無需人工干預
keepalived用於實現高可用叢集
它的工作原理就是VRRP(虛擬冗餘路由協議)
【2】、配置高可用叢集
1、安裝keepalived
# 透過劇本安裝
---
- name: install ipvsadm
hosts: webservers
vars:
pkg: keepalived
roles:
- pkgs
# 或者是不透過劇本安裝
yum install -y keepalived
配置keepalived
只需修改如下新增註釋的內容
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id web1 # 修改router_id
vrrp_iptables # 讓keepalived自動新增iptables規則
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER # web1是主,state是master,web2是備份,state是BACKUP
interface eth0
virtual_router_id 51
priority 100 # 優先順序,web1為主,優先順序高。web2是備份,優先順序要比web1低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
重啟keepalived
[root@web1:192.168.4.110 ~]$systemctl start keepalived.service
[root@web1:192.168.4.110 ~]$systemctl enable keepalived.service
2、檢查IP
正確的結果應該是
web1上有虛擬IP:192.168.4.80
web2上沒有
在web1掛掉後,web2上會出現虛擬IP地址
[root@web1:192.168.4.110 ~]$ip a s eth0 | grep 80
inet 192.168.4.80/24 scope global secondary eth0
# web1掛掉後
[root@web2:192.168.4.120 ~]$ip a s eth0 | grep 80
inet 192.168.4.80/24 scope global secondary eth0
3、測試
[root@ansible:192.168.4.66 ~]$curl http://192.168.4.80
Welcome to web1 on 192.168.4.110
# 將web1掛掉,虛擬IP就會回到web2上
[root@ansible:192.168.4.66 ~]$curl http://192.168.4.80
Welcome to web2 on 192.168.4.120
【3】、編寫監控指令碼
上面的配置雖然可以實現主備切換功能,但是存在一個bug,上面的配置實現主備切換的前提是web1(MASTER)關機、掛掉後才可以實現的切換
如果僅僅是將web1上的web服務關掉,那並不會實現主備之間的切換
因此我們需要編寫一個監控指令碼去實現當web服務停掉後,也可以實現主備切換
我們可以讓keepalived監視80埠,如果80埠沒有了,就切換主備
- 配置高可用叢集時,keepalived只為伺服器提供了VIP
- keepalived不知道伺服器上執行了哪些服務
- MASTER伺服器可以透過跟蹤指令碼監視本機的80埠,一旦本機80埠失效,則將VIP切換到BACKUP伺服器
- keepalived對指令碼的要求是,退出碼為0表示訪問成功,退出碼為1則表示失效
# shell指令碼,實現了埠開啟返回0,埠不開啟返回1
#!/bin/bash
# 檢查80埠是否開啟
if netstat -tuln | grep -q :80; then
exit 0 # 埠開啟,返回0
else
exit 1 # 埠未開啟,返回1
fi
# 修改keepalived配置檔案,修改如下內容
vrrp_script chk_http_port
{
script "/home/check.sh"
interval 3
weight -20
}
vrrp_instance VI_1
{
...
track_script
{
chk_http_port
}
...
}
1、優先順序更新的策略
keepalived會定時執行指令碼並對指令碼執行的結果進行分析,動態調整vrrp_instance的優先順序。
如果指令碼執行結果為0,並且weight配置的值大於0,則優先順序相應的增加
如果指令碼執行結果非0,並且weight配置的值小於0,則優先順序相應的減少
其他情況,維持原本配置的優先順序,即配置檔案中priority對應的值。
這裡需要注意的是:
1) 優先順序不會不斷的提高或者降低
2) 可以編寫多個檢測腳本併為每個檢測指令碼設定不同的weight
3) 不管提高優先順序還是降低優先順序,最終優先順序的範圍是在[1,254],不會出現優先順序小於等於0或者優先順序大於等於255的情況
2、vrrp_script中節點權重改變演算法
在Keepalived叢集中,其實並沒有嚴格意義上的主、備節點
雖然可以在Keepalived配置檔案中設定“state”選項為“MASTER”狀態,但是這並不意味著此節點一直就是Master角色。
控制節點角色的是Keepalived配置檔案中的“priority”值,但並它並不控制所有節點的角色,另一個能改變節點角色的是在vrrp_script模組中設定的“weight”值,這兩個選項對應的都是一個整數值
其中“weight”值可以是個負整數,一個節點在叢集中的角色就是透過這兩個值的大小決定的。
不設定weight
在vrrp_script模組中,如果不設定“weight”選項值,那麼叢集優先順序的選擇將由Keepalived配置檔案中的“priority”值決定,而在需要對叢集中優先順序進行靈活控制時,可以透過在vrrp_script模組中設定“weight”值來實現
設定weight
vrrp_script 裡的script返回值為0時認為檢測成功,其它值都會當成檢測失敗;
- weight 為正時,指令碼檢測成功時此weight會加到priority上,檢測失敗時不加;
- 主失敗:
- 主 priority < 從 priority + weight 時會切換。
- 主成功:
- 主 priority + weight > 從 priority + weight 時,主依然為主
- weight 為負時,指令碼檢測成功時此weight不影響priority,檢測失敗時priority – abs(weight)
- 主失敗:
- 主 priority – abs(weight) < 從priority 時會切換主從
- 主成功:
- 主 priority > 從priority 主依然為主