KeepAlive--高可用解決方案


一;高可用的解決方案

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

        RHCS(cman)
        heartbeat
        corosync

二:vrrp協議:

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

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

術語:

    虛擬路由器: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復用器
                內存管理組件

虛擬路由器的工作模型:

 單主:
 雙主

通知機制:

 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.conf

配置文件組件部分:

            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

}

 

 

 


免責聲明!

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



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