1. 程式人生 > >Keepalive 之 高可用實現

Keepalive 之 高可用實現

fwmark lvs nginx keepalive

1 概述


本文將介紹三個Keepalive高可用的實現案例,分別是keepalive實現LVS高可用,keepalive通過fwmark實現LVS高可用,keepalive實現Nginx高可用。


2 實驗準備


.(1) 各節點時間必須同步,這個操作很關鍵。工具有ntp chronyCentOS7上開始啟用)

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

.(3) 各節點之間可通過主機名互相通信(對KA並非必須),建議使用/etc/hosts文件實現

172.18.50.6373 上配置

echo"172.18.50.63 node1 ">>/etc/hosts

echo"172.18.50.73 node2">>/etc/hosts

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

兩臺都要設置

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

。將組播地址調整為224.100.50.100

網卡需要支持多播模式,默認網卡都開啟多播功能,可以使用如下的命令關閉多播地址(不能關閉該功能,僅當學習):

ip link set dev eth1 multicast off.

(6)測試

通過抓包查看

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

tcpdump -i eth1 -nn host 224.50.50.50

註意,如果對應的主服務器的keepalived服務被停了,就會發一條優先級為0的狀態。查看vip地址用ip a命令查看對應主機是否將VIP加入到網卡裏


3 配置介紹


.虛擬服務器:

.配置參數:

有兩個配置的方法

virtual_server IP port

定義vip和端口,實現對該vip的統一調度

virtual_server fwmark int:指在keepalive的機器上的防火墻mangle表打標簽。同一標簽的主機實現同一的調度。如對外同一服務有兩個ipvip1 vip2,後端有4RSvip1vip2mangle表上打同一標簽,後臺的4RS都配置這兩個vip,那麽keepalive服務器就可以實現訪問這兩個vip時,實現對這四臺RS的統一調度

virtual_server  IP port | virtual_server  fwmark int
{
    ...
    real_server{
    ...
    }
    ...
}

常用參數

.delay_loop  <INT>:服務輪詢的時間間隔
.lb_algo  rr|wrr|lc|wlc|lblc|sh|dh:定義調度方法
.lb_kind  NAT|DR|TUN:集群的類型
.persistence_timeout  <INT>:持久連接時長
.protocol TCP:服務協議,僅支持TCP
.sorry_server  <IPADDR>   <PORT>:所有RS故障時,備用服務器地址
#以下配置,有幾臺RS就要重復配置幾遍
.real_server<IPADDR><PORT>
{
weight   <INT> RS權重
notify_up  <STRING>|<QUOTED-STRING> RS上線通知腳本
notify_down  <STRING>|<QUOTED-STRING> RS下線通知腳本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK   { ...}:定義當前主機的健康狀態檢測方法
}

KeepAlived配置檢測

.HTTP_GET|SSL_GET:應用層檢測
HTTP_GET|SSL_GET {
url{
path  <URL_PATH>:定義要監控的URL
status_code  <INT>:判斷上述檢測機制為健康狀態的響應碼
digest  <STRING>:判斷為健康狀態的響應的內容的校驗碼
}
connect_timeout  <INTEGER>:連接請求的超時時長
nb_get_retry  <INT>:重試次數
delay_before_retry  <INT>:重試之前的延遲時長
connect_ip   <IPADDRESS>:向當前RS哪個IP地址發起健康狀態檢測請求,分流,定義用來監控的網卡和提供服務的網卡不一樣
connect_port  <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto   <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址
bind_port  <PORT>:發出健康狀態檢測請求時使用的源端口
}
 
.TCP_CHECK {
connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto  <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址
bind_port <PORT>:發出健康狀態檢測請求時使用的源端口
connect_timeout <INTEGER>:連接請求的超時時長
}


4 案例實現


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

4.1示例通知腳本

這裏例子是發郵件的腳本,實際情況當角色發生變化的時候,需要服務器執行什麽操作可以直接寫入腳本裏,而不僅僅是發郵件通知,從而實現其他應用的高可用。

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

.腳本的調用方法:

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

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

重啟服務,用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 "<h1>`hostname`</h1>" > /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實現LVS高可用

實現效果是當有請求過來時,根據輪詢規則調度到後端RS,同時實現了對RS的健康性檢查,同時實現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只需調整優先級,stats 為BACKUP,網卡等相關信息,其他不變,RS配置參考3.2,註意VIP使用32位,防止路由問題,導致調度不通,然後測試

4.4 keepalive通過fwmark實現LVS高可用

基於fwmark雙主模式的lvs集群,基於fwmark,實現雙主高可用的前提下,根據防火墻prerouting鏈上的mark會將所有的請求均勻調度。


技術分享

4.4.1 打標簽

在兩臺6373keepalive機器上防火墻的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.5 keepalive實現Nginx高可用

.keepalived調用外部的輔助腳本進行資源監控,並根據監控的結果狀態能實現優先動態調整

.vrrp_script:自定義資源監控腳本,vrrp實例根據腳本返回值,公共定義,可被多個實例調用,定義在vrrp實例之外

.track_script:調用vrrp_script定義的腳本去監控資源,定義在實例之內,調用事先定義的vrrp_script

.分兩步:(1)先定義一個腳本;(2) 調用此腳本。

vrrp_script  <SCRIPT_NAME> {
script " " #這裏寫腳本的真實路徑,也可以是bash命令
interval INT  #多久執行一次腳本
weight  -INT #當主服務異常,把之前定義的vrrp權重減掉多少,減少得比backup的值還低,這樣就可以實現對別得應用的高可用性的支持
}
track_script {
#以下是調用腳本,這裏相當於是虛擬路由器的代碼段
SCRIPT_NAME_1
SCRIPT_NAME_2
}

示例:高可用nginx服務

技術分享

兩臺nginx服務器上分別安裝keepalive,通過腳本檢查keepalive nginx是否存在,實現高可用。

一般只有一臺keepalive的級別高,所以該機器的nginx起作用,負責調度,當nginx異常,權重減去20後,備用的keepalive起作用,備用機器刪的nginx接管工作。後端的RS是定義在nginxhttp配置段裏

chk_down 的函數作用是檢查/etc/keepalived/down文件存在時,就返回1,就將keepalive權重減去20vip將配置到另一臺主機,使得備用主機生效。當/etc/keepalived/down刪掉後,該主機的優先級就會自動加上20.重新搶占vip

chk_nginx 的函數作用是檢查nginx是否正常運行,當nginx異常時,就將keepalive優先級減去20vip將配置到另一臺主機,使得另一臺的keepalive生效當nginx重新工作後,該主機的優先級就會自動加上20.重新搶占vip

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 測試

創建/etc/keeplived/down文件以及關閉keepalive查看實驗

本文出自 “陽光運維” 博客,請務必保留此出處http://ghbsunny.blog.51cto.com/7759574/1978259

Keepalive 之 高可用實現