KeepAlive--高可用解決方案


一: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"
squares.svg

4:啟動服務

啟動96主機的服務:
查看郵件有無發送:
mail
squares.svg
 
啟動95主機的服務:
96主機將收到 變為 backup 的郵件
squares.svg

六: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模式正常與否
squares.svg
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
squares.svg
重啟keepalived服務
[root@hkeepalived]#systemctl stop keepalived
[root@hkeepalived]#systemctl start keepalived
down掉 后端主機 9798 nginx服務
測試訪問:
curl  http://172.16.253.199 訪問的是95 主機上的 sorry頁面
squares.svg
關閉 95主機的keepalived 服務
測試訪問:
curl  http://172.16.253.199 訪問的是96 主機上的 sorry頁面
squares.svg

三:高可用服務

一:理論描述

目的:
借助腳本實現 高可用服務(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