Keepalived 配置實例


Keepalived 是一款輕量級HA集群應用,它的設計初衷是為了做LVS集群的HA,即探測LVS健康情況,從而進行主備切換,不僅如此,還能夠探測LVS代理的后端主機的健康狀況,動態修改LVS轉發規則。 

   當LVS進行主備切換的時候,對外提供服務的IP是如何做到切換的呢?這就依賴於keepalived 所應用的vrrp協議,即Virtual Reduntant  Routing Protocol,虛擬冗余路由協議。簡單來講,此協議是將IP設置在虛擬接口之上,根據一定的規則實現IP在物理主機上流動,即哪台主機可以占有該IP。

   而且keepalived具有腳本調用接口,可通過腳本完成拓展功能。

   1.Keepalived

術語:

虛擬路由器:Virtual Router 
虛擬路由器標識:VRID(0-255)
物理路由器:
master:主設備
backup:備用設備
priority:優先級
VIP:Virtual IP 
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
通告內容:心跳,優先級等;周期性;
各主機通告以組播方式通信,只向組內的主機發送數據包,因為按照組播的mac地址發送, 組播mac地址是和組播ip地址對應的。iana(internet assigned number authority)規定, 組播 mac地址的高24bit為0x01005e,mac 地址的低23bit為組播ip地址的低23bit。相應地 網卡需要設置支持multicast。
搶占式,非搶占式;

默認為搶占式。當優先級高的主機恢復正常狀態時,將奪回IP,重新成為MASTER。 

安全認證:
無認證
簡單字符認證   #一般采用此方式
MD5
工作模式:
主/備:單虛擬路徑器;
主/主:主/備(虛擬路徑器1),備/主(虛擬路徑器2)
假定兩台主機A和B做HA,可以做兩個虛擬接口,流動2個IP。接口1中,A設備優先級設定高,為MASTER;接口2種,B設備優先級高,為MASTER。

這樣兩台主機,能通過兩個對外IP同時工作。即主主模式。 

組件:

核心組件:
vrrp stack
ipvs wrapper
checkers
控制組件:配置文件分析器
IO復用器
內存管理組件

HA Cluster的配置前提:

(1) 各節點時間必須同步;
(2) 確保iptables及selinux不會成為阻礙;

2.Keepalived配置前需要了解的事

本文演示的環境為centos7.2。keepalived軟件安裝,配置好yum源,軟件包已在base倉庫中收錄。

# yum install keepalived           安裝即可 

程序環境:

網卡支持multicast
配置文件:/etc/keepalived/keepalived.conf
主程序:/usr/sbin/keepalived
Unit File:keepalived.service

配置文件組件部分:

通用的配置結構 

TOP HIERACHY

GLOBAL CONFIGURATION
Global definitions
Static routes/addresses
VRRPD CONFIGURATION
VRRP synchronization group(s)
VRRP instance(s)
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s)

配置語法:

配置虛擬路由器:實現IP流動的部分
vrrp_instance <STRING> {
....
}
專用參數:
state MASTER|BACKUP:當前節點在此虛擬路由器上的初始狀態;只能有一個是MASTER,余下的都應該為BACKUP;
interface IFACE_NAME:綁定為當前虛擬路由器使用的物理接口;
virtual_router_id VRID:當前虛擬路由器的惟一標識,范圍是0-255;
priority 100:當前主機在此虛擬路徑器中的優先級;范圍1-254;
advert_int 1:vrrp通告的時間間隔;
authentication {
auth_type AH|PASS
auth_pass <PASSWORD>
}
virtual_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
track_interface {
eth0
eth1
...
}
配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態;
nopreempt:定義工作模式為非搶占模式;
preempt_delay 300:搶占式模式下,節點上線后觸發新選舉操作的延遲時長;
定義通知腳本:
notify_master <STRING>|<QUOTED-STRING>:當前節點成為主節點時觸發的腳本;
notify_backup <STRING>|<QUOTED-STRING>:當前節點轉為備節點時觸發的腳本;
notify_fault <STRING>|<QUOTED-STRING>:當前節點轉為“失敗”狀態時觸發的腳本;
notify <STRING>|<QUOTED-STRING>:通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知;

 3.Keepalived 雙主虛擬路由配置實例

演示前說明: 

 2台centos7.2 主機:node-00,node-01

VIP1:10.1.38.19預定node-00占有

VIP2:10.1.38.20 預定node-01占有

2台主機安裝好keepalived之后,開始編輯配置文件 

node-00的配置如下 

! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost           #定義來信人
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node-00
   vrrp_mcast_group4 224.0.38.12
}

vrrp_instance VI_1 {
    state MASTER
    interface team0
    virtual_router_id 38
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass x1er44q
    }
    virtual_ipaddress {
        10.1.38.19/16 dev team0
    }

    smtp_alert            #狀態切換,使用郵件通知
}

vrrp_instance VI_2 {
    state BACKUP
    interface team0
    virtual_router_id 39
    priority 97
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass x1er44q
    }
    virtual_ipaddress {
        10.1.38.20/16 dev team0
    }
    smtp_alert
}

復制要把備注刪掉

node-01配置如下

! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost 
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node-01
   vrrp_mcast_group4 224.0.38.12
}

vrrp_instance VI_1 {
    state BACKUP
    interface bond0
    virtual_router_id 38
    priority 97
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass x1er44q
    }
    virtual_ipaddress {
        10.1.38.19/16 dev bond0
    }
    smtp_alert
}

vrrp_instance VI_2 {
    state MASTER
    interface bond0
    virtual_router_id 39
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass x1er44q
    }
    virtual_ipaddress {
        10.1.38.20/16 dev bond0
    }
    smtp_alert
}

配置完成后,啟動服務

#systemctl start keepalived

使用ip命令查看ip地址情況

#ip address show

node-00情況

node-01情況

此時,我們模擬node-00宕機,將node-00的keepalived服務停掉,那么10.1.38.19此ip會流動到node-01上

#systemctl stop keepalived

至此此部分演示完畢。

4.Keepalived ipvs 高可用集群配置實例

同樣先科普的配置說明

虛擬服務器:
配置結構:
  virtual_server IP port 或者virtual_server fwmark int 
  {
    ...
    real_server {
      ...
    }
    ...
  }

常用參數:
  delay_loop <INT>:服務輪詢的時間間隔;
  lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定義調度方法;
  lb_kind NAT|DR|TUN:集群的類型;
  persistence_timeout <INT>:定向調度時長;
  protocol TCP:服務協議,僅支持TCP;
  sorry_server <IPADDR> <PORT>:備用服務器地址;當后端主機都失敗時,由此主機提供友好提示頁面。
  real_server <IPADDR> <PORT>  
  {
    weight <INT>
    notify_up <STRING>|<QUOTED-STRING>
    notify_down <STRING>|<QUOTED-STRING>
    HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:定義當前主機的健康狀態檢測方法;
  }

  HTTP_GET|SSL_GET {
    url {
        path <URL_PATH>:定義要監控的URL;
        status_code <INT>:判斷上述檢測機制為健康狀態的響應碼;
        digest <STRING>:判斷上述檢測機制為健康狀態的響應的內容的校驗碼;
    }
    nb_get_retry <INT>:重試次數;
    delay_before_retry <INT>:重試之前的延遲時長;
    connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
    connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
    bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
    bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
    connect_timeout <INTEGER>:連接請求的超時時長;
  }

  TCP_CHECK {
    connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
    connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
    bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
    bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
    connect_timeout <INTEGER>:連接請求的超時時長;
  }

開始演示實例

演示說明:

  node-00,node-01 作為ipvs主機,做HA。對外服務IP為10.1.38.15,即VIP。

  node-02,node-03 作為后端主機,提供web服務。

  node-02 IP:10.1.38.13

  node-03 IP:10.1.38.14

 node-00配置如下

 

! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost 
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node-00
   vrrp_mcast_group4 224.0.38.12
}

vrrp_instance VI_1 {
    state MASTER
    interface team0
    virtual_router_id 38
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass x1er44q
    }
    virtual_ipaddress {
        10.1.38.15/16 dev team0
    }

    smtp_alert
}
virtual_server 10.1.38.15 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP

    sorry_server 127.0.0.1 80

    real_server 10.1.38.13 80 {
        weight 1
        HTTP_GET {
        url {
            path /
            status_code 200
        }
        connect_timeout 1
        nb_get_retry 3
        delay_before_retry 1
        }
    }
    real_server 10.1.38.14 80 {
        weight 1
        HTTP_GET {
        url {
            path /
            status_code 200
        }
        connect_timeout 1
        nb_get_retry 3
        delay_before_retry 1
        }
    }
}

node-01 配置如下

! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost 
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node-01
   vrrp_mcast_group4 224.0.38.12
}

vrrp_instance VI_1 {
    state BACKUP
    interface bond0
    virtual_router_id 38
    priority 97
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass x1er44q
    }
    virtual_ipaddress {
        10.1.38.15/16 dev bond0
    }

    smtp_alert
}
virtual_server 10.1.38.15 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP

    sorry_server 127.0.0.1 80

    real_server 10.1.38.13 80 {
        weight 1
        HTTP_GET {
        url {
            path /
            status_code 200
        }
        connect_timeout 1
        nb_get_retry 3
        delay_before_retry 1
        }
    }
    real_server 10.1.38.14 80 {
        weight 1
        HTTP_GET {
        url {
            path /
            status_code 200
        }
        connect_timeout 1
        nb_get_retry 3
        delay_before_retry 1
        }
    }
}

兩台后端主機做好lvs  dr模式集群設置,並開啟web服務。啟動ipvs兩台主機keepalived服務。

一切正常情況下,此時node-00擁有VIP,使用其他主機來訪問 10.1.38.15

測試1:

#for i in {1..6};do curl 10.1.38.15;done 

     

  輪詢調度正常。

  測試2:

  停掉node-00 keepalived服務,模擬宕機,測試冗余性

  正常結果還是正常輪詢的。

  測試3:

  兩台ipvs主機正常運行,停掉node-02上web服務,模擬后端主機宕機,測試keepalived動態調整后端主機列表功能

  

  測試結果,前端調度器只將服務調度至node-03上。

  再將node-02 web服務啟動,再測試

  

  結果顯示恢復正常輪詢,至此keepalived動態調整能力測試完畢。

  其實以上結果,再ipvs主機直接查看lvs規則也可看出

  #ipvsadm -Ln

5.Keepalived 做nginx 高可用集群配置實例

再學習一個新知識,腳本調用

  keepalived調用外部的輔助腳本進行資源監控,並根據監控的結果狀態能實現優先動態調整;   

  分兩步:(1) 先定義一個腳本;(2) 調用此腳本;

  vrrp_script <SCRIPT_NAME> {
    script ""     #定義一個判定語句,如果退出狀態碼為非0,則執行減優先級操作。
    interval INT     #測試間隔
    weight -INT        #降低優先級,是其釋放VIP所有權
  }

  track_script {
    SCRIPT_NAME_1 #檢測的腳本列表
    SCRIPT_NAME_2
    ...
  }

 開始演示實例

演示說明:

node-00,node-01 為nginx服務器,代理后端web服務器,使用keepalived做HA集群。

node-02,node-03 為后端web服務器。

node-00配置如下

! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost 
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node-00
   vrrp_mcast_group4 224.0.38.12
}

    vrrp_script check_ngx {           #腳本在引用前定義好
        script "killall -0 nginx "  #探測nginx服務是否正常
        interval    1
        weight  -5
    }
vrrp_instance VI_1 {
    state MASTER
    interface team0
    virtual_router_id 38
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass x1er44q
    }
    virtual_ipaddress {
        10.1.38.15/16 dev team0
    }
    track_script {  #在路由實例中引用自定義腳本
        check_ngx
    }
    smtp_alert
}

node-01配置如下

! Configuration File for keepalived

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost 
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node-01
   vrrp_mcast_group4 224.0.38.12
}

    vrrp_script check_ngx {
        script "killall -0 nginx"
        interval    1
        weight  -5
    }
vrrp_instance VI_1 {
    state BACKUP
    interface bond0
    virtual_router_id 38
    priority 97
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass x1er44q
    }
    virtual_ipaddress {
        10.1.38.15/16 dev bond0
    }
    track_script {
        check_ngx
    }
    smtp_alert
}

node-00,node-01 啟動nginx服務,並已設置好代理兩台后端web服務器;啟動keepalived 服務。

node-02,node-03 啟動web服務。

如果配置正確,會有以下結果。

測試1:使用另一台主機訪問VIP,輪詢響應結果正常,VIP在node-00。

測試2:停止node-00 nginx服務,模擬nginx服務異常,訪問VIP,輪詢響應結果正常,VIP在node-01。

測試3:恢復node-00 nginx 服務,VIP 流動回 node-00上。

 

完~

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM