keepalive高可用

                                        keepalive高可用

-------------------------------------------------------------------------------------------------------------------------------------------

一、集羣Cluster

1、集羣類型:

LB lvs/nginx(http/upstream, stream/upstream)

HA 高可用性

SPoF: Single Point of Failure

HPC

2、系統可用性的公式:A=MTBF/(MTBF+MTTR)

(0,1), 95%

幾個9(指標): 99%, ..., 99.999%,99.9999%;

系統故障:

硬件故障:設計缺陷、wear out(損耗)、自然災害……

軟件故障:設計缺陷

3、提升系統高用性的解決方案之降低MTTR:

手段:冗餘redundant

active/passive 主備

active/active 雙主

active --> HEARTBEAT --> passive

active <--> HEARTBEAT <--> active

4、高可用的是“服務”:

HA nginx service:

vip/nginx process[/shared storage]

資源:組成一個高可用服務的“組件”

(1) passive node的數量

(2) 資源切換

5、shared storage:

NAS:文件共享服務器;

SAN:存儲區域網絡,塊級別的共享

6、Network partition:網絡分區

quorum:法定人數

with quorum: > total/2

without quorum: <= total/2

隔離設備: fence

node:STONITH = Shooting The Other Node In The Head,斷電重啓

資源:斷開存儲的連接

7、TWO nodes Cluster

輔助設備:ping node, quorum disk

8、Failover:故障切換,即某資源的主節點故障時,將資源轉移至其它節點的操作

Failback:故障移回,即某資源的主節點故障後重新修改上線後,將之前已轉移至其它節點的資源重新切回的過程

9、HA Cluster實現方案:

ais:應用接口規範 完備複雜的HA集羣

RHCS:Red Hat Cluster Suite紅帽集羣套件

heartbeat

corosync

vrrp協議實現:虛擬路由冗餘協議

keepalived

二、KeepAlived

1、keepalived:

vrrp協議:Virtual Router Redundancy Protocol,一種容錯協議

2、術語:

虛擬路由器:Virtual Router

虛擬路由器標識:VRID(0-255),唯一標識虛擬路由器

物理路由器:

master:主設備,承擔報文轉發任務

backup:備用設備,主路由器故障時,能代替主路由器工作的備用路由器

priority:優先級

VIP:Virtual IP,虛擬路由器的IP地址,一個虛擬路由器可以擁有一個或多個IP地址

VMAC:Virutal MAC (00-00-5e-00-01-VRID),不能用來通信,只是一種標識而已

3、通告:心跳,優先級等;週期性

4、工作方式:搶佔式,非搶佔式

搶佔式:發現優先級比自己低的設備在主設備,都會發起新一輪的選舉,讓自己做主設備

非搶佔式:當格局已定,無論優先級如何,都不會發起選舉

5、安全工作:

認證:

無認證

簡單字符認證:預共享密鑰

MD5

6、工作模式:

主/備:單虛擬路徑器

主/主:主/備(虛擬路徑器1),備/主(虛擬路徑器2)

7、keepalived:

vrrp協議的軟件實現,原生設計目的爲了高可用ipvs服務

8、功能:

(1)vrrp協議完成地址流動

(2)爲vip地址所在的節點生成ipvs規則(在配置文件中預先定義)

(3)爲ipvs集羣的各RS做健康狀態檢測

(4)基於腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集羣事務,以此支持作調度器的nginx、haproxy等服務

9、組件:

核心組件:

vrrp stack

ipvs wrapper

checkers

控制組件:配置文件分析器

IO複用器

內存管理組件

10、keepalived組成

image.png

checkers:健康性檢查

VRRP Stack:vrrp協議的實現,判定主節點和從節點,並檢測主節點可以和從節點發heartbeats

watch dog:內核中的組件

三、KeepAlived實現

1、HA Cluster 配置準備:

(1) 各節點時間必須同步

ntp, chrony

(2) 確保iptables及selinux不會成爲阻礙

(3) 各節點之間可通過主機名互相通信(對KA並非必須)

建議使用/etc/hosts文件實現,如果DNS出現問題會使穩定性大打折扣

(4) 各節點之間的root用戶可以基於密鑰認證的ssh服務完成互相通信(對KA並非必須)

2、keepalived安裝配置:

CentOS 6.4+ Base源

yum -y install keepalived

3、程序環境:

主配置文件:/etc/keepalived/keepalived.conf

主程序文件:/usr/sbin/keepalived

Unit File:/usr/lib/systemd/system/keepalived.service

Unit File的環境配置文件:/etc/sysconfig/keepalived

四、KeepAlived配置

1、配置文件組件部分:

2、TOP HIERACHY

GLOBAL CONFIGURATION

Global definitions

Static routes/addresses

VRRPD CONFIGURATION

VRRP synchronization group(s):vrrp同步組

VRRP instance(s):即一個vrrp虛擬路由器

LVS CONFIGURATION

Virtual server group(s)

Virtual server(s):ipvs集羣的vs和rs

3、配置語法:

(1)配置虛擬路由器:每一個虛擬路由器對應一個vrrp_instance(vrrp實例)

vrrp_instance <STRING> {

....

}

(2)專用參數:

state MASTER|BACKUP:當前節點在此虛擬路由器上的初始狀態;只能有一個是MASTER,餘下的都應該爲BACKUP

interface IFACE_NAME:綁定爲當前虛擬路由器使用的物理接口

virtual_router_id VRID:當前虛擬路由器惟一標識,範圍是0-255

priority 100:當前物理節點在此虛擬路由器中的優先級;範圍1-254

advert_int 1:vrrp通告的時間間隔,默認1s

authentication { #認證機制

auth_type AH|PASS

auth_pass <PASSWORD> 僅前8位有效

}

virtual_ipaddress { #虛擬IP

<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 { #配置監控網絡接口,一旦出現故障,則轉爲FAULT狀態 實現地址轉移

eth0

eth1

}

(3)nopreempt:定義工作模式爲非搶佔模式

(4)preempt_delay 300:搶佔式模式,節點上線後觸發新選舉操作的延遲時長,默認模式

(5)定義通知腳本:

notify_master <STRING>|<QUOTED-STRING>:

當前節點成爲主節點時觸發的腳本

notify_backup <STRING>|<QUOTED-STRING>:

當前節點轉爲備節點時觸發的腳本

notify_fault <STRING>|<QUOTED-STRING>:

當前節點轉爲“失敗”狀態時觸發的腳本

notify <STRING>|<QUOTED-STRING>:

通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知

五、單主配置示例:

! 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 node1 #主機名,在另一結點爲node2

vrrp_mcast_group4 224.0.100.100

----》定義組播域的組播地址,默認是224.0.0.18(224~239)

}

vrrp_instance VI_1 {

state MASTER ----》定義自己爲master,其餘結點上都爲BACKUP

interface eth0

virtual_router_id 6 ----》多個節點必須相同,0~255之間

priority 100 ----》定義優先級

advert_int 1 ----》通告間隔1s

authentication {

auth_type PASS  ----》只有PASS和AH選項,簡易用PASS

auth_pass 571f97b2 ----》無論密碼多長,只支持前8個字符

}

virtual_ipaddress { ----》定義虛擬ip

172.18.100.66/16 dev eth0 label eth0:0

172.168.100.67/16 dev eth1

}

track_interface {

eth0

}

}

示例:

主服務器的配置,即state MASTER的配置

image.png

從服務器的配置,glob

image.png

結束時候主服務器重啓keepalived服務,從服務器tcpdump -i eth0 -nn host 224.0.56.18,對廣播域抓包,有結果:

image.png

六、KeepAlived雙主配置

1、腳本的調用方法:

在vrrp_instance VI_1 語句塊最後面加下面行

notify_master "/etc/keepalived/notify.sh master"

notify_backup "/etc/keepalived/notify.sh backup"

notify_fault "/etc/keepalived/notify.sh fault"

2、示例通知腳本

#!/bin/bash

#

contact='root@localhost' ----》表示郵件接受者

notify() {

mailsubject="$(hostname) to be $1, vip floating"

mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"

echo "$mailbody" | mail -s "$mailsubject" $contact

}

case $1 in

master)

notify master

;;

backup)

notify backup

;;

fault)

notify fault

;;

*)

echo "Usage: $(basename $0) {master|backup|fault}"

exit 1

;;

esac

示例:測試腳本,用master測試,郵箱內有郵件

image.png

之後vim /etc/keepalived/keepalived.conf,修改完成後重啓keepalived

image.png

在另一節點主機vim /etc/keepalived/keepalived.conf添加同樣內容,scp腳本至此主機,完成後重啓keepalived

image.png

七、KeepAlived支持IPVS

1、虛擬服務器:

配置參數:

virtual_server IP port | virtual_server fwmark int ----》vip 端口或者防火牆標記

{

...

real_server {

...

}

...

}

delay_loop <INT>:檢查後端服務器的時間間隔

 lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定義調度方法

 lb_kind NAT|DR|TUN:LVS集羣的類型

 persistence_timeout <INT>:持久連接時長

 protocol TCP:服務協議,僅支持TCP

 sorry_server <IPADDR> <PORT>:所有RS故障時,備用服務器地址

 real_server <IPADDR> <PORT>

{

weight <INT> RS權重

notify_up <STRING>|<QUOTED-STRING> RS上線通知腳本

notify_down <STRING>|<QUOTED-STRING> RS下線通知腳本

HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHEC K { ... }:定義當前主機的健康狀態檢測方法

}

八、KeepAlived配置檢測

1、 HTTP_GET|SSL_GET:應用層檢測

HTTP_GET|SSL_GET {

url {

path <URL_PATH>:定義要監控的URL

status_code <INT>:判斷上述檢測機制爲健康狀態的響應碼

digest <STRING>:判斷爲健康狀態的響應的內容的校驗碼

}

connect_timeout <INTEGER>:連接請求的超時時長

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>:發出健康狀態檢測請求時使用的源端口

}

2、傳輸層檢測 TCP_CHECK

TCP_CHECK {

connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求

connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求

bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址

bind_port <PORT>:發出健康狀態檢測請求時使用的源端口

connect_timeout <INTEGER>:連接請求的超時時長

九、keepalived調用腳本進行資源監控

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

2、vrrp_script:自定義資源監控腳本,vrrp實例根據腳本返回值,公共定義,可被多個實例調用,定義在vrrp實例之外

3、track_script:調用vrrp_script定義的腳本去監控資源,定義在實例之內,調用事先定義的vrrp_script

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

vrrp_script <SCRIPT_NAME> {

script ""

interval INT

weight -INT

}

track_script {

SCRIPT_NAME_1

SCRIPT_NAME_2

}

十、LVS NAT模型VIP和DIP需要同步,需要同步組,一般高可用實現此模型較爲複雜,建議用nginx或haproxy實現

vrrp_sync_group VG_1 {

group {

VI_1 # name of vrrp_instance (below)

VI_2 # One for each moveable IP.

}

}

vrrp_instance VI_1 {

eth0

vip

}

vrrp_instance VI_2 {

eth1

dip

}

說明vip寫到實例VI_1庫,dip寫到實例VI_2裏,兩個實例在之前被vrrp_sync_group 定義到一個同步組VG_1中,所以調度的時候這兩個地址一起漂移

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

分兩步:(1) 先定義一個腳本;(2) 在vrrp實例中調用此腳本;

vrrp_script <SCRIPT_NAME> {s

script ""

              interval INT

              weight -INT

rise 2

fall 3

}

track_script {

SCRIPT_NAME_1

SCRIPT_NAME_2

...

}

注意:

            vrrp_script chk_down {

                script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 1 || exit 0"

                interval 1

                weight -10

            }

                [[ -f /etc/keepalived/down ]]要特別地作爲bash的參數的運行! 

示例:結合外部腳本來影響虛擬路由器的內部判斷結果中各節點或各實例的相關權重

vim /etc/keepalived/keepalived.conf

image.png

在LVS1、LVS2中都寫入這兩段

結果當master的LVS1服務器在/etc/keepalived/新建down文件後,LVS1將降權,ip地址漂移到LVS2上

示例:高可用nginx服務

! 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 node1

    vrrp_mcast_group4 224.0.100.19

}

vrrp_script chk_down {

    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"

    interval 1

    weight -5

}

vrrp_script chk_nginx {

    script "/usr/bin/killall -0 nginx && exit 0 || exit 1"

    interval 1

    weight -5

    fall 2

    rise 1

}

vrrp_instance VI_1 {

    state MASTER

    interface eno16777736

    virtual_router_id 14

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 571f97b2

    }

    virtual_ipaddress {

        10.1.0.93/16 dev eno16777736

    }

    track_script {

        chk_down

        chk_nginx

}

    notify_master "/etc/keepalived/notify.sh master"

    notify_backup "/etc/keepalived/notify.sh backup"

    notify_fault "/etc/keepalived/notify.sh fault"

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章