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查看實驗