KeepAlive--高可用解決方案

一:keepalive簡述

一;高可用的解決方案

1)vrrp協議的實現
keepalive
2)ais:完備HA集羣html

RHCS(cman)
        heartbeat
        corosync

二:vrrp協議:

概念:在節點(主機)出現故障時,實現ip地址的切換。
keepalive就是基於此協議而實現高可用的。linux

Failover:故障切換,即某資源的主節點故障時,將資源轉移至其它節點的操做;
Failback:故障移回,即某資源的主節點故障後從新修改上線後,將轉移至其它節點的資源從新切回的過程;nginx

術語:web

虛擬路由器:Virtual Router
       對應與配置文件中/etc/keepalived中的virtual_ipaddress 
       生產中一個director主機上一般會有多個網卡,對外爲vip1,接收用戶請求,對內爲vip2,將用戶的請求經過vip2發送給後端提供服務的主機RS。在配置虛擬路由ip時。vip1與vip2須要配置在一個組內,實如今master主機出現故障時,vip1轉向backup備用主機時,vip2也同時轉向backup備用主機。否則vip2還停留在master主機上,轉向後端主機的請求將會沒法到達。
      此塊在配置文件中
    虛擬路由器標識:VRID(0-255)
        物理路由器:
            master:主設備
            backup:備用設備
            priority:優先級
            VIP:Virtual IP,虛擬ip 
            VMAC:Virutal MAC (00-00-5e-00-01-VRID)
                GraciousARP
            
        通告:心跳,優先級等;週期性;
        
        搶佔式,非搶佔式;
        
        安全工做:
            認證:
                無認證
                簡單字符認證
                MD5

三:keepalived:

1:簡述

vrrp協議的軟件實現,原生設計的目的爲了高可用ipvs服務:
            基於vrrp協議完成地址流動;
            爲集羣內的全部節點生成ipvs規則(在配置文件中預先定義);
            爲ipvs集羣的各RS作健康狀態檢測;
            基於腳本調用接口經過執行腳本完成腳本中定義的功能,進而影響集羣事務;
            
        組件:
            核心組件:
                vrrp stack   vrrp協議的實現    
                ipvs wrapper爲集羣內的全部節點生成ipvs規則
                checkers    爲ipvs集羣的各RS作健康狀態檢測
            控制組件:

配置文件分析器算法

IO複用器
                內存管理組件

虛擬路由器的工做模型:vim

單主:
 雙主

通知機制:後端

notify_master
 notify_backup
 notify_fault

2:安裝

yum install keepalived
程序環境:安全

主配置文件:/etc/keepalived/keepalived.conf
            主程序文件:/usr/sbin/keepalived
            Unit File:keepalived.service
            Unit File的環境配置文件:/etc/sysconfig/keepalived

3:配置文件

/etc/keepalived/keepalived.confbash

配置文件組件部分:服務器

TOP HIERACHY
                GLOBAL CONFIGURATION
                    Global definitions
                    Static routes/addresses
                VRRPD CONFIGURATION
                    VRRP synchronization group(s):vrrp同步組;
                    VRRP instance(s):每一個vrrp instance即一個vrrp路由器;
                LVS CONFIGURATION
                    Virtual server group(s)
                    Virtual server(s):ipvs集羣的vs和rs;

4:man keepalived.conf

能夠查看配置文件的具體使用細則
第一個配置段:GLOBAL CONFIGURATION
第二配置段:VRRPD CONFIGURATION

此地址段爲配置keepalived的核心配置段。主要包括兩塊內容

VRRP instance(s):vrrp實例

一個vrrp instance 就是一個vrrp路由器

VRRP synchronization group(s):虛擬路由器同步組

一個主機生產中通常須要配置兩個以上的虛擬路由器。此配置能夠實現將多個虛擬路由器編制在一個組內,能夠實現,當一個虛擬路由器偏移至另外一臺主機時,其他的虛擬路由器(vip)也同時偏移至另外一臺主機上。

inside_network # name of vrrp_instance (below) 內網網絡
outside_network # One for each moveable IP. 外網網絡

clipboard.png
第三段:LVS CONFIGURATION

高可用LVS時使用。若使用Nginx時不用關注此塊

四:配置語法:

配置虛擬路由器:
                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>:通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知;

五:通知機制

通知機制:
notify_master:to be master時,調用指定的腳本完成輔助操做,,以「通知」爲核心目標
notify_backup to be backup時,調用指定的腳本完成輔助操做,,以「通知」爲核心目標
notify_fault

通知腳本的使用方式:
示例通知腳本:
    #!/bin/bash
    #
    contact='root@localhost'

    notify() {
    local mailsubject="$(hostname) to be $1, vip floating"
    local 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            
            
腳本的調用方法:
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"

六:D類地址

D類IP地址第一個字節以「1110」開始 。它並不指向特定的網絡,目前這一類地址被用在多點廣播(Multicast)中。多點廣播地址用來一次尋址一組計算機,它標識共享同一協議的一組計算機。
D類地址又分爲三種類型:即專用地址、公用地址和私用地址;其中專用地址(224.0.0.0-224.0.0.255)用於網絡協議組的廣播,公用地址(224.0.1.0-238.255.255.255)用於其它組播,私用地址(239.0.0.0-239.255.255.255)用於測試。

在keepdlived的配置文件中
vrrp_mcast_group4 224.24.24.18
此地址用於向共同使用vrrp協議的主機 不斷的廣播自身的ip地址,及優先級。優先級高的主機將會使用vip

在現實中,會使用一根網線將 此兩臺主機直接綁定在一塊兒,實現此類功能

二:實現

一:配置前提

HA Cluster的配置前提:

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

ntp, chrony
        (2) 確保iptables及selinux不會成爲阻礙;
        (3) 各節點之間可經過主機名互相通訊(對KA並不是必須);
            建議使用/etc/hosts文件實現; 
        (4) 確保各節點的用於集羣服務的接口支持MULTICAST通訊;
            D類:224-239;

二:實驗前奏

keepalive天生是用來高可用LVS的。藉助服務腳本接口能夠實現高可用nginx和haproxy

第一步:單主模型
vrrp的地址轉移實現。單主模式。一個虛擬路由vip
第二步:雙主模型
實現雙主節點,每個節點均可以工做起來。雙虛擬路由ip
第三步:高可用LVS
在單主模式下。增長後端的具體服務。實現節點切換時,服務仍然可用。

後端的服務爲兩臺主機,

第四步:增長check。檢查後端主機的健康情況。

在後端主機所有down掉的狀況之下,增長sorry server.用keepalive主機實現

第五步:高可用haproxy
keepalive主機再也不使用LVS(director)。使用nginx或者haproxy

三:keepalive 單主模式

環境:172.16.253.95 作master

172.16.253.96 作backup

1:解讀配置文件

再解讀/etc/keepalived/keepalived.conf

全局配置

global_defs {
notification_email {

haha@mashuai.com    //出問題時,接收郵件的地址

}
notification_email_from admin@mashuai.com //郵件發件人地址

smtp_server 127.0.0.1 //郵件服務器地址
smtp_connect_timeout 30 //鏈接超時時間
router_id n2 //虛擬路由服務器地址(建議寫上主機名)
vrrp_mcast_group4 224.24.24.18 //多播地址段,默認爲224.0.0.18.作實驗時須要更改
}

vrrp_instance vrrp實例段,核心配置段

vrrp_instance VI_1 { //虛擬路由器的名稱,多個時,名稱要不同

state MASTER       //虛擬路由器的狀態,master|backup
interface eth0       //經過哪一個網口發送vrrp廣播
virtual_router_id 01  //虛擬路由器的id,要與同一臺主機上的其餘虛擬路由器id 區分開來
priority 100         //物理路由器在此虛擬路由器上的優先級
advert_int 1         //每隔多長時間 廣播一次本身的優先級
authentication {      //傳遞信息的認證方式,密碼僅支持8位
    auth_type PASS
    auth_pass 1111
}   
virtual_ipaddress {         //虛擬路由的ip地址
172.16.253.100
}

}

2:更改配置文件

95主機的配置文件
注意:綠色字體爲與96主機不同的地方。

其餘的配置文件內容通通都註釋掉

global_defs {
notification_email {

haha@mashuai.com

}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_mcast_group4 224.24.24.18
}

vrrp_instance VI_1 {

state MASTER
interface eth0
virtual_router_id 01
priority 100
advert_int 1
authentication {
    auth_type PASS
    auth_pass 1111
}
virtual_ipaddress {
172.16.253.100
}

}
96主機的配置文件

global_defs {
notification_email {

haha@mashuai.com

}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id n2
vrrp_mcast_group4 224.24.24.18
}

vrrp_instance VI_1 {

state BACKUP
interface eth0
virtual_router_id 01
priority 95
advert_int 1
authentication {
    auth_type PASS
    auth_pass 1111
}
virtual_ipaddress {
172.16.253.100
}

}

3:重啓keepalived服務

95主機 master:
systemctl restart keepalived.service
systemctl status keepalived.service

clipboard.png

ip a:虛擬路由器主機ip已經添加進來

clipboard.png

tcpdump -nn -i eth0 host 224.24.24.18
172.16.253.95 主機經過224.24.24.18向外發送vrrp廣播,vrid爲1 優先級爲100,字節長度爲20,簡單認證方式,每隔1秒發送一次

clipboard.png
96主機:backup
systemctl restart keepalived.service
systemctl status keepalived.service

clipboard.png
4:模擬vip偏移至 96主機
95 主機 stop keepalived服務
systemctl stop keepalived.service
在96主機上 vip已經偏移至96主機

clipboard.png

再次在 95 主機重啓 keepalived服務 VIP則將從新偏移至95主機
默認vrrp工做於搶佔 模式。誰的級別高,vip偏移至哪臺主機上

clipboard.png

clipboard.png

四: 雙主模式

簡述:配置兩個虛擬路由器
下圖爲框架:

clipboard.png

環境:先stop 95 96兩臺主機的keepalived服務

1:編輯配置文件

95主機增長以下代碼:
vrrp_instance VI_2 {

state BACKUP
interface eth0
virtual_router_id 02
priority 95
advert_int 1
authentication {
    auth_type PASS
    auth_pass 2222
}   
virtual_ipaddress {
172.16.253.200
}

}

96主機:
增長以下代碼,至關於增長了另外一組虛擬路由器vip2 172.16.253.200
vrrp_instance VI_2 {

state MASTER
interface eth0
virtual_router_id 02
priority 100
advert_int 1
authentication {
    auth_type PASS
    auth_pass 2222
}
virtual_ipaddress {
172.16.253.200
}

}

2:啓動96主機服務

96主機:先關閉服務,再啓動服務。

[root@hkeepalived]#systemctl stop keepalived
[root@hkeepalived]#systemctl start keepalived
[root@hkeepalived]#systemctl status keepalived
兩個 vip都添加至 eth0 網卡了

clipboard.png

clipboard.png

3:啓動95主機服務

[root@hkeepalived]#systemctl stop keepalived
[root@hkeepalived]#systemctl start keepalived
[root@hkeepalived]#systemctl status keepalived

clipboard.png
啓動95 主機服務以後 100地址的vip回至95主機。由於172.16.253.100的vip在95主機的優先級要比在96主機上高

五:調用通知機制

目的:演示通知機制中

notify_master
 notify_bacup 是如何工做

1:95 96主機

編輯通知機制的腳本放置在/etc/keepalived下
vim notify.sh

!/bin/bash

contact='root@localhost'

notify() {

            local mailsubject="$(hostname) to be $1, vip floating"
            local 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

2 :95 96 主機的配置文件恢復至單主模式

刪除 實驗四中 增長的配置文件內容

3:編輯配置文件

95 96 主機中 在vrrp_instance中增長以下代碼

notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"

clipboard.png

4:啓動服務

啓動96主機的服務:
查看郵件有無發送:
mail

clipboard.png
啓動95主機的服務:

96主機將收到 變爲 backup 的郵件

clipboard.png

六:LVS-DR模式--keepalive

環境:
95主機 LVS
96主機 LVS
97 98 主機RS

1:97 98 主機 安裝nginx

yum install nginx –y

編輯主頁文件:
97:vim /usr/share/nginx/html/index.html

<h1> RS1111111111111</h1>

98:vim /usr/share/nginx/html/index.html

<h1> RS22222222222</h1>

2:後端主機 內核參數修改

97 98主機編輯腳本
1:
後端主機內核參數的修改 及 vip的添加
編輯腳本,實現對內核參數的修改
vim /root/set.sh
#!/bin/bash

vip=172.16.0.199
mask=255.255.255.255
iface="lo:0"

case $1 in
start)

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
 echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
 echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
 echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

 ifconfig $iface $vip netmask $mask broadcast $vip up
 route add -host $vip dev $iface
 ;;

stop)

ifconfig $iface down
 echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
 echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
 echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
 echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
 ;;

*)

echo "start|stop"
 exit 1

;;
esac

2:測試腳本實現
bash –x set.sh start
ip a
查看 lo的ip有無添加進來

3:lvs主機95 配置服務

1 安裝ipvsadm
2 添加vip至eth0
ifconfig eth0:0 172.16.253.199 netmask 255.255.255.255 broadcast 172.16.253.199 up

3:配置LVS-NAT 服務
[root@h~]#ipvsadm -A -t 172.16.253.199:80 -s rr
[root@h~]#ipvsadm -a -t 172.16.253.199:80 -r 172.16.253.97:80 -g
[root@h~]#ipvsadm -a -t 172.16.253.199:80 -r 172.16.253.98:80 -g
[root@h~]#ipvsadm -L –n

clipboard.png
4:測試

clipboard.png

5 down掉 95主機 lvs

在96主機上部署lvs
95主機
ipvsadm –C
ifdown eth0:0
96主機
重複步驟3 便可
1 安裝ipvsadm
2 添加vip至eth0
ifconfig eth0:0 172.16.253.199 netmask 255.255.255.255 broadcast 172.16.253.199 up

3:配置LVS-NAT 服務
[root@h~]#ipvsadm -A -t 172.16.253.199:80 -s rr
[root@h~]#ipvsadm -a -t 172.16.253.199:80 -r 172.16.253.97:80 -g
[root@h~]#ipvsadm -a -t 172.16.253.199:80 -r 172.16.253.98:80 -g
[root@h~]#ipvsadm -L –n

4 測試 DR模式正常與否

clipboard.png

5 測試ok後
96主機上清空全部規則
ipvsadm –C
ifconfig eth0:0 down

6:實現LVS

如下代碼是 實現 LVS 調度
95 96 主機 keepalived.conf配置文件中加入以下代碼

virtual_server 172.16.253.199 80 {

delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server  172.16.253.98 80{
    weight 1
    HTTP_GET {
        url {
          path /
          status_code 200
        } 
        } 
        connect_timeout 2
        nb_get_retry 3
        delay_before_retry 1
    }   
    
real_server  172.16.253.97 80{
    weight 1 
    HTTP_GET {
        url {
          path /
          status_code 200
        } 
        }

connect_timeout 2

nb_get_retry 3
        delay_before_retry 1
    }

}

重啓 keepalived服務

測試:

clipboard.png

7 重啓 95主機的keepalived服務

95主機的 優先級比96的高
vip會偏移至95主機

96主機
clipboard.png

95主機

clipboard.png

8檢測健康情況功能 有無實現

給98主機增長iptables規則 :全部tcp的訪問禁止掉
iptables –A INPUT –p tcp –dport 80 –j REJECT

curl http://172.16.253.199 訪問就會僅僅訪問 97主機了

clipboard.png

9:增長sorry server

在 95 96主機上增長soory server 內容
當 後端 9798主機的所有宕機以後。95 96提供sorry server頁面服務

95 96主機
1:安裝nginx 提供sorry頁面
vim /usr/share/nginx/html/index.html
2:更改配置文件 keepalived.conf
在 virtual_server中
增長一行代碼 sorry_server 127.0.0.1 80

clipboard.png

重啓keepalived服務
[root@hkeepalived]#systemctl stop keepalived
[root@hkeepalived]#systemctl start keepalived

down掉 後端主機 9798 nginx服務

測試訪問:
curl http://172.16.253.199 訪問的是95 主機上的 sorry頁面

clipboard.png

關閉 95主機的keepalived 服務
測試訪問:
curl http://172.16.253.199 訪問的是96 主機上的 sorry頁面

clipboard.png

三:高可用服務

一:理論描述

目的:
藉助腳本實現 高可用服務(ninx/http/haproxy)
也就是說在服務不可用時,vip偏移至備用節點。而不是以前實現的主機down掉以後vip偏移至備用節點。

環境:
95 96主機。keepalived 服務stop
腳本例子:
1:rpm –ql keepalived
此文件內有腳本的例子,以及如何調用
/usr/share/doc/keepalived-1.2.13/samples/keepalived.conf.vrrp.localcheck

clipboard.png

2:cat /usr/share/doc/keepalived-1.2.13/samples/keepalived.conf.vrrp.localcheck

clipboard.png

3:腳本簡述
1:在配置文件中定義腳本
vrrp_script chk_sshd {

script "killall -0 sshd"        # cheaper than pidof
   interval 2                      # check every 2 seconds
   weight -4                       # default prio: -4 if KO
   fall 2                          # require 2 failures for KO
   rise 2                          # require 2 successes for OK

}

調用腳本 使用 vrrp_script 關鍵詞
腳本名 chk_sshd

腳本內容分爲兩塊

1 script "killall -0 sshd"
表示 此段代碼 返回0值,部分功能不變 
              返回非0值。要執行一些關鍵指令

killall -0 sshd :測試 是否能夠殺掉 sshd進程。能殺掉返回0值,表示sshd服務

正常運行。返回其餘值,表示sshd服務沒有運行正常。

2:weight -4 測試失敗權重-4

fall 2        檢測失敗2次,才減去權重
 rise -2  檢查兩次成功,ok

2:在配置文件中調用腳本
在 vrrp_instance中
使用track_script {

chk_haproxy weight 2
   chk_http_port
   chk_https_port
   chk_smtp_port
}

此種模式調用腳本

二:nginx 服務 高可用

1:先定義腳本,再調用腳本

95 96主機同時更改配置文件
編輯keepalived.conf文件

1)增長腳本
 2)調用腳本

1)編輯腳本
vim /etc/keepalived.conf

vrrp_script chk_nginx{
script "[[ -f /etc/keepalived/down ]] && exit 1 ||exit 0 "
interval 1
weight -10
fall 2
rise 1
}

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

down文件存在 返回1
 down文件不存在 返回0

依靠down文件存在與否 來下降/保持 主節點的權重

2)調用腳本

track_script {
  chk_nginx

}
使用 track_script 關鍵詞 調用腳本

clipboard.png

2:測試

在95主機上 touch /etc/keepalived/down文件
vip偏移至96主機

3:編輯 nginx配置文件

95 96主機
vim /etc/nginx/nginx.conf
server 中增長
location / {
proxy_pass http://websrvs;
}

server上增長
upstream websrvs {
server 172.16.253.97:80;
server 172.16.253.98:80;
}

此段主要實現 nginx的 服務調度至後端服務器

4:測試web主頁訪問

clipboard.png

三:雙主模型nginx 高可用集羣

上接實驗三:

1:編輯配置文件

增長 vrrp_instance 實例2
96主機 在vip2上爲MASTER
95主機在 vip2上爲BACKUP
96主機增長以下內容:
vrrp_instance VI_2 {

state MASTER
interface eth0
virtual_router_id 61
priority 100
advert_int 1
authentication {
    auth_type PASS
    auth_pass 1111
}   
virtual_ipaddress {
    172.16.253.188
}

track_script {

chk_nginx

}

}

clipboard.png

95主機增長以下內容:
vrrp_instance VI_2 {

state BACKUP
interface eth0
virtual_router_id 61
priority 95
advert_int 1
authentication {
    auth_type PASS
    auth_pass 1111
}   
virtual_ipaddress {
    172.16.253.188
}

track_script {

chk_nginx
  chk_nn

clipboard.png

}

### 2: 測試雙主模式
95主機 關閉—啓動服務
96主機關閉服務

1)vip1 及vip2 都在 95主機上

clipboard.png

2)啓動96 主機上的keepalived 服務
vip2 跳轉至 96主機上

clipboard.png

3) 在95 主機上 建 /etc/keepalived/down文件
vip1 199也跳轉至 96主機上

clipboard.png

4) 客戶端測試訪問

clipboard.png

3:改變 nginx的調度算法

clipboard.png

2 hash算法
hash $request_uri consistent
hash $remote_addr
hash $cookie_name
ip_hash 改成 hash $request_uri consistent

clipboard.png

}

相關文章
相關標籤/搜索