keepalived

Linux小菜鸟發表於2024-07-20

四、Keepalived

【1】、keepalived執行原理

image-20240629233008687

  • 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時認為檢測成功,其它值都會當成檢測失敗;

  1. weight 為正時指令碼檢測成功時此weight會加到priority上,檢測失敗時不加;
    1. 主失敗:
      1. 主 priority < 從 priority + weight 時會切換。
    2. 主成功:
      1. 主 priority + weight > 從 priority + weight 時,主依然為主
  2. weight 為負時,指令碼檢測成功時此weight不影響priority,檢測失敗時priority – abs(weight)
    1. 主失敗:
      1. 主 priority – abs(weight) < 從priority 時會切換主從
    2. 主成功:
      1. 主 priority > 從priority 主依然為主

相關文章