Keepalived 配置實例

Keepalived 是一款輕量級HA集羣應用,它的設計初衷是爲了作LVS集羣的HA,即探測LVS健康狀況,從而進行主備切換,不只如此,還可以探測LVS代理的後端主機的健康情況,動態修改LVS轉發規則。 前端

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

   並且keepalived具備腳本調用接口,可經過腳本完成拓展功能。linux

   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。 nginx

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

這樣兩臺主機,能經過兩個對外IP同時工做。即主主模式。 web

組件:

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

HA Cluster的配置前提:

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

2.Keepalived配置前須要瞭解的事

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

# yum install keepalived           安裝便可 centos

程序環境:

網卡支持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上。

 

完~

相關文章
相關標籤/搜索