Keepalive 之 高可用實現(xiàn)

1? 概述

本文將介紹三個Keepalive高可用的實現(xiàn)案例雅采,分別是keepalive實現(xiàn)LVS高可用贱田,keepalive通過fwmark實現(xiàn)LVS高可用忌栅,keepalive實現(xiàn)Nginx高可用沸手。

2實驗準備

.(1)各節(jié)點時間必須同步锄贼,這個操作很關(guān)鍵票灰。工具有ntp和chrony(CentOS7上開始啟用)

.(2)確保iptables及selinux不會成為阻礙。7上要停止firewalld服務(wù)和iptables

.(3)各節(jié)點之間可通過主機名互相通信(對KA并非必須)宅荤,建議使用/etc/hosts文件實現(xiàn)

172.18.50.63和73上配置

echo"172.18.50.63? node1 ">>/etc/hosts

echo"172.18.50.73?node2">>/etc/hosts

.(4)各節(jié)點之間的root用戶可以基于密鑰認證的ssh服務(wù)完成互相通信(對KA并非必須屑迂,但是建議配置)

兩臺都要設(shè)置

172.18.50.63上配置

ssh-keygen

ssh-copy-id -i /root/.ssh/id_rsa.pub 172.18.50.73

172.18.50.73上配置

ssh-keygen

ssh-copy-id -i /root/.ssh/id_rsa.pub 172.18.50.63

(5)多播地址

建議更改默認的多播地址,防止沖突冯键,可以在配置文件里的全局加入選項vrrp_mcast_group4224.100.50.100惹盼。將組播地址調(diào)整為224.100.50.100。

網(wǎng)卡需要支持多播模式惫确,默認網(wǎng)卡都開啟多播功能手报,可以使用如下的命令關(guān)閉多播地址(不能關(guān)閉該功能,僅當學(xué)習(xí)):

ip link set dev eth1 multicast off.

(6)測試

通過抓包查看

tcpdump -i eth1 -nn host組播ip,如下

tcpdump -i eth1 -nn host 224.50.50.50

注意改化,如果對應(yīng)的主服務(wù)器的keepalived服務(wù)被停了掩蛤,就會發(fā)一條優(yōu)先級為0的狀態(tài)。查看vip地址用ip a命令查看對應(yīng)主機是否將VIP加入到網(wǎng)卡里

3 配置介紹

.虛擬服務(wù)器:

.配置參數(shù):

有兩個配置的方法

virtual_server? IP port定義vip和端口陈肛,實現(xiàn)對該vip的統(tǒng)一調(diào)度

virtual_server? fwmark?int:指在keepalive的機器上的防火墻mangle表打標簽盏档。同一標簽的主機實現(xiàn)同一的調(diào)度。如對外同一服務(wù)有兩個ip燥爷,vip1和vip2,后端有4臺RS,vip1和vip2在mangle表上打同一標簽懦窘,后臺的4臺RS都配置這兩個vip前翎,那么keepalive服務(wù)器就可以實現(xiàn)訪問這兩個vip時,實現(xiàn)對這四臺RS的統(tǒng)一調(diào)度

virtual_server??IP?port?|?virtual_server??fwmark?int

{

...

real_server{

...

}

...

}

常用參數(shù)

.delay_loop??:服務(wù)輪詢的時間間隔

.lb_algo??rr|wrr|lc|wlc|lblc|sh|dh:定義調(diào)度方法

.lb_kind??NAT|DR|TUN:集群的類型

.persistence_timeout??:持久連接時長

.protocol?TCP:服務(wù)協(xié)議畅涂,僅支持TCP

.sorry_server?????:所有RS故障時港华,備用服務(wù)器地址

#以下配置,有幾臺RS就要重復(fù)配置幾遍

.real_server

{

weight????RS權(quán)重

notify_up??|?RS上線通知腳本

notify_down??|?RS下線通知腳本

HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK???{?...}:定義當前主機的健康狀態(tài)檢測方法

}

KeepAlived配置檢測

.HTTP_GET|SSL_GET:應(yīng)用層檢測

HTTP_GET|SSL_GET?{

url{

path??:定義要監(jiān)控的URL

status_code??:判斷上述檢測機制為健康狀態(tài)的響應(yīng)碼

digest??:判斷為健康狀態(tài)的響應(yīng)的內(nèi)容的校驗碼

}

connect_timeout??:連接請求的超時時長

nb_get_retry??:重試次數(shù)

delay_before_retry??:重試之前的延遲時長

connect_ip???:向當前RS哪個IP地址發(fā)起健康狀態(tài)檢測請求午衰,分流立宜,定義用來監(jiān)控的網(wǎng)卡和提供服務(wù)的網(wǎng)卡不一樣

connect_port??:向當前RS的哪個PORT發(fā)起健康狀態(tài)檢測請求

bindto???:發(fā)出健康狀態(tài)檢測請求時使用的源地址

bind_port??:發(fā)出健康狀態(tài)檢測請求時使用的源端口

}

.TCP_CHECK?{

connect_ip?:向當前RS的哪個IP地址發(fā)起健康狀態(tài)檢測請求

connect_port?:向當前RS的哪個PORT發(fā)起健康狀態(tài)檢測請求

bindto??:發(fā)出健康狀態(tài)檢測請求時使用的源地址

bind_port?:發(fā)出健康狀態(tài)檢測請求時使用的源端口

connect_timeout?:連接請求的超時時長

}

4? 案例實現(xiàn)

所有實驗會用到通知腳本和RS配置腳本冒萄,所以,將這兩個腳本單獨放置

4.1示例通知腳本

這里例子是發(fā)郵件的腳本橙数,實際情況當角色發(fā)生變化的時候尊流,需要服務(wù)器執(zhí)行什么操作可以直接寫入腳本里,而不僅僅是發(fā)郵件通知灯帮,從而實現(xiàn)其他應(yīng)用的高可用崖技。

注意,以下的HA1和HA2表示高可用主機1和高可用主機2钟哥,和haproxy無關(guān)迎献。HA為highavailability

#!/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

.腳本的調(diào)用方法:

直接寫入配置文件VRRPD配置段里

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

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

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

重啟服務(wù),用mail查看

4.2 RS配置

#!/bin/bash

#

#******************************************************************************

#Author:??????????????? ?Sunny

#Date:?????????????????2017-10-24

#FileName:?????????????? ? lvs_dr_rs.sh

#version:?????????????? ?1.0

#Your?change?info:

#Description:?????????? ? ? ? ?For?auto?set?RS_dr

#DOC?URL:????????????? ?http://ghbsunny.blog.51cto.com/7759574/1975813

#Copyright(C):?????????? ? ? 2017??All?rights?reserved

#*****************************************************************************

vip=172.18.50.80

mask='255.255.255.255'

dev=lo:1

rpm?-q?httpd?&>?/dev/null?||?yum?-y?install?httpd?&>/dev/null

service?httpd?start?&>?/dev/null?&&?echo?"The?httpd?Server?is?Ready!"

echo?"

`hostname`

"?>?/var/www/html/index.html

case?$1?in

start)

echo?1?>?/proc/sys/net/ipv4/conf/all/arp_ignore

echo?1?>?/proc/sys/net/ipv4/conf/lo/arp_ignore

echo?2?>?/proc/sys/net/ipv4/conf/all/arp_announce

echo?2?>?/proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig?$dev?$vip?netmask?$mask?broadcast?$vip?up

echo?"The?RS?Server?is?Ready!"

;;

stop)

ifconfig?$dev?down

echo?0?>?/proc/sys/net/ipv4/conf/all/arp_ignore

echo?0?>?/proc/sys/net/ipv4/conf/lo/arp_ignore

echo?0?>?/proc/sys/net/ipv4/conf/all/arp_announce

echo?0?>?/proc/sys/net/ipv4/conf/lo/arp_announce

echo?"The?RS?Server?is?Canceled!"

;;

*)

echo?"Usage:?$(basename?$0)?start|stop"

exit?1

;;

esac

4.3? keepalive實現(xiàn)LVS高可用

實現(xiàn)效果是當有請求過來時腻贰,根據(jù)輪詢規(guī)則調(diào)度到后端RS,同時實現(xiàn)了對RS的健康性檢查吁恍,同時實現(xiàn)VS的高可用

拓撲圖如下

4.3.1 HA1 配置如下

!?Configuration?File?for?keepalived

global_defs?{

notification_email?{

root@localhost

}

notification_email_from?node1@localhost

smtp_server?127.0.0.1

smtp_connect_timeout?30

router_id?node1

vrrp_mcast_group4?224.50.50.50

}

vrrp_instance?VI_1?{

state?MASTER

interface?eth1

virtual_router_id?50

priority?100

advert_int?1

authentication?{

auth_type?PASS

auth_pass?sunny

}

virtual_ipaddress?{

172.18.50.80

}

notify_master?"/etc/keepalived/vip1_notify.sh?master"

notify_backup?"/etc/keepalived/vip1_notify.sh?backup"

notify_fault??"/etc/keepalived/vip1_notify.sh?fault"

virtual_server?172.18.50.80?80?{

delay_loop?3

lb_algo?wrr

lb_kind?DR

protocol?TCP

sorry_server?127.0.0.1?80

real_server?172.18.50.65?80?{

weight?2

HTTP_GET?{

url?{

path?/

status_code?200

}

connect_timeout?1

nb_get_retry?2

delay_before_retry?1

}

}

real_server?172.18.50.75?80?{

weight?1

HTTP_GET?{

url?{

path?/

status_code?200

}

connet_timeout?1

nb_get_retry?2

delay_before_retry?1

}

}

}

}

HA2只需調(diào)整優(yōu)先級,stats 為BACKUP播演,網(wǎng)卡等相關(guān)信息冀瓦,其他不變,RS配置參考3.2宾巍,注意VIP使用32位咕幻,防止路由問題,導(dǎo)致調(diào)度不通顶霞,然后測試

4.4? keepalive通過fwmark實現(xiàn)LVS高可用

基于fwmark雙主模式的lvs集群肄程,基于fwmark,實現(xiàn)雙主高可用的前提下选浑,根據(jù)防火墻prerouting鏈上的mark會將所有的請求均勻調(diào)度蓝厌。

4.4.1 打標簽

在兩臺63和73上keepalive機器上防火墻的mangle表打標簽,命令如下

iptables?-t?mangle?-A?PREROUTING?-d172.18.50.80,172.18.50.90?-p?tcp?--dport?80?-j?MARK?--set-mark?6

4.4.2 HA1 上配置

!?Configuration?File?for?keepalived

global_defs?{

notification_email?{

root@localhost

}

notification_email_from?node1@localhost

smtp_server?127.0.0.1

smtp_connect_timeout?30

router_id?node1

vrrp_mcast_group4?224.50.50.50

}

vrrp_instance?VI_1?{

state?MASTER

interface?eth1

virtual_router_id?50

priority?100

advert_int?1

authentication?{

auth_type?PASS

auth_pass?sunny

}

virtual_ipaddress?{

172.18.50.80

}

notify_master?"/etc/keepalived/vip1_notify.sh?master"

notify_backup?"/etc/keepalived/vip1_notify.sh?backup"

notify_fault??"/etc/keepalived/vip1_notify.sh?fault"

}

virtual_server?fwmark?6?{

delay_loop?3

lb_algo?wrr

lb_kind?DR

protocol?TCP

sorry_server?127.0.0.1?80

real_server?172.18.50.65?80?{

weight?1

HTTP_GET?{

url?{

path?/

status_code?200

}

connect_timeout?1

nb_get_retry?2

delay_before_retry?1

}

}

real_server?172.18.50.75?80?{

weight?1

HTTP_GET?{

url?{

path?/

status_code?200

}

connet_timeout?1

nb_get_retry?2

delay_before_retry?1

}

}

}

4.4.3 配置RS1和RS2古徒,參考3.2拓提,然后進行測試

4.5keepalive實現(xiàn)Nginx高可用

.keepalived調(diào)用外部的輔助腳本進行資源監(jiān)控,并根據(jù)監(jiān)控的結(jié)果狀態(tài)能實現(xiàn)優(yōu)先動態(tài)調(diào)整

.vrrp_script:自定義資源監(jiān)控腳本隧膘,vrrp實例根據(jù)腳本返回值代态,公共定義,可被多個實例調(diào)用疹吃,定義在vrrp實例之外

.track_script:調(diào)用vrrp_script定義的腳本去監(jiān)控資源蹦疑,定義在實例之內(nèi),調(diào)用事先定義的vrrp_script

.分兩步:(1)先定義一個腳本萨驶;(2)調(diào)用此腳本歉摧。

vrrp_script ? {

script " " #這里寫腳本的真實路徑,也可以是bash命令

interval INT? #多久執(zhí)行一次腳本

weight? -INT #當主服務(wù)異常,把之前定義的vrrp權(quán)重減掉多少叁温,減少得比backup的值還低再悼,這樣就可以實現(xiàn)對別得應(yīng)用的高可用性的支持

}

track_script {

#以下是調(diào)用腳本,這里相當于是虛擬路由器的代碼段

SCRIPT_NAME_1

SCRIPT_NAME_2

}

示例:高可用nginx服務(wù)

兩臺nginx服務(wù)器上分別安裝keepalive,通過腳本檢查keepalive和nginx是否存在膝但,實現(xiàn)高可用冲九。

一般只有一臺keepalive的級別高,所以該機器的nginx起作用锰镀,負責(zé)調(diào)度娘侍,當nginx異常,權(quán)重減去20后泳炉,備用的keepalive起作用憾筏,備用機器刪的nginx接管工作。后端的RS是定義在nginx的http配置段里

chk_down的函數(shù)作用是檢查/etc/keepalived/down文件存在時花鹅,就返回1氧腰,就將keepalive權(quán)重減去20。vip將配置到另一臺主機刨肃,使得備用主機生效古拴。當/etc/keepalived/down刪掉后,該主機的優(yōu)先級就會自動加上20.重新?lián)屨紇ip真友。

chk_nginx的函數(shù)作用是檢查nginx是否正常運行黄痪,當nginx異常時,就將keepalive優(yōu)先級減去20盔然。vip將配置到另一臺主機桅打,使得另一臺的keepalive生效當nginx重新工作后,該主機的優(yōu)先級就會自動加上20.重新?lián)屨紇ip愈案。

4.5.1 HA1配置如下

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost

}

notification_email_from node1@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node1

vrrp_mcast_group4 224.50.50.50

}

vrrp_script? chk_down {

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

interval? 1

weight? -20

}

vrrp_script? chk_nginx {

script "killall -0 nginx && exit 0 || exit 1"

interval 1

weight? -20

fall 2

rise 1

}

vrrp_instance VI_1 {

state MASTER

interface eth1

virtual_router_id 50

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass sunny

}

virtual_ipaddress {

172.18.50.80

}

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

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

notify_fault? "/etc/keepalived/vip1_notify.sh fault"

track_script {

chk_down

chk_nginx

}

}

4.5.2 nginx 配置如下

http{

......

upstream websrvs {

server 172.18.50.75:80 weight=1;

server 172.18.50.65:80 weight=2;

server 127.0.0.1:8000 backup;

}

......

}

server {

.....

location / {

proxy_pass http://websrvs;

}

......

}

4.5.3 測試

創(chuàng)建/etc/keeplived/down文件以及關(guān)閉keepalive查看實驗

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挺尾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子站绪,更是在濱河造成了極大的恐慌遭铺,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恢准,死亡現(xiàn)場離奇詭異魂挂,居然都是意外死亡,警方通過查閱死者的電腦和手機馁筐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門涂召,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人眯漩,你說我怎么就攤上這事。” “怎么了赦抖?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵舱卡,是天一觀的道長。 經(jīng)常有香客問我队萤,道長轮锥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任要尔,我火速辦了婚禮舍杜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赵辕。我一直安慰自己既绩,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布还惠。 她就那樣靜靜地躺著饲握,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚕键。 梳的紋絲不亂的頭發(fā)上救欧,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音锣光,去河邊找鬼笆怠。 笑死,一個胖子當著我的面吹牛誊爹,可吹牛的內(nèi)容都是我干的蹬刷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼替废,長吁一口氣:“原來是場噩夢啊……” “哼箍铭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起椎镣,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诈火,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后状答,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冷守,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年惊科,在試婚紗的時候發(fā)現(xiàn)自己被綠了拍摇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡馆截,死狀恐怖充活,靈堂內(nèi)的尸體忽然破棺而出蜂莉,到底是詐尸還是另有隱情,我是刑警寧澤混卵,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布映穗,位于F島的核電站,受9級特大地震影響幕随,放射性物質(zhì)發(fā)生泄漏蚁滋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一赘淮、第九天 我趴在偏房一處隱蔽的房頂上張望辕录。 院中可真熱鬧,春花似錦梢卸、人聲如沸走诞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽速梗。三九已至,卻和暖如春襟齿,著一層夾襖步出監(jiān)牢的瞬間姻锁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工猜欺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留位隶,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓开皿,卻偏偏與公主長得像涧黄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赋荆,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容