1. 程式人生 > >Keepalived+Nginx實現前端負載均衡的高可用

Keepalived+Nginx實現前端負載均衡的高可用

keepalived+nginx實現前端負載均衡的高可用

一、實驗前準備

技術分享

時間同步、關閉iptables+selinux、各主機能相互解析

在192.168.0.101和192.168.0.102上安裝Keepalived和Nginx,通過Nginx負載均衡至192.168.0.103及192.168.0.104上,node3和node4上分別用httpd提供網頁node3及node4

該實驗實現的是主從模式

雙機高可用方法目前分為兩種:
1、雙機主從模式:即前端使用兩臺服務器,一臺主服務器和一臺熱備服務器,正常情況下,主服務器綁定一個公網虛擬IP,提供負載均衡服務,熱備服務器處於空閑狀態;當主服務器發生故障時,熱備服務器接管主服務器的公網虛擬IP,提供負載均衡服務;但是熱備服務器在主機器不出現故障的時候,永遠處於浪費狀態,對於服務器不多的網站,該方案不經濟實惠。
2、雙機主主模式:即前端使用兩臺負載均衡服務器,互為主備,且都處於活動狀態(使用DNS達到兩個外網IP地址的輪詢),同時各自綁定一個公網虛擬IP,提供負載均衡服務;當其中一臺發生故障時,另一臺接管發生故障服務器的公網虛擬IP(這時由非故障機器一臺負擔所有的請求)。這種方案,經濟實惠,非常適合於當前架構環境。

二、安裝及配置Keepalived及Nginx

1、配置192.168.0.101上的keepalived,192.168.0.102類似(需調整state為BACKUP,priority為90)

global_defs {
   notification_email {
   }
   notification_email_from root
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_10
}
vrrp_script chk_nginx {   //chk_nginx後面有空格,實驗中沒加空格不能導致檢測nginx腳本失敗
        script "killall -0 nginx &>/dev/null"  //檢測腳本
        interval 1    //腳本執行間隔 1s
        weight -20    //如果腳本檢查結果為非0,則priority -20
        fall 2        //失敗需連續檢測2次
        rise 1        //成功只需1次,成功不修改優先級
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
         }
    virtual_ipaddress {
        192.168.0.250/24 dev eth0 label eth0:1
    }
        track_script {    //執行監控的服務
                chk_nginx    //引用VRRP腳本
        }
}

2、配置nginx

192.168.0.101及102 nginx簡單配置了下負載均衡如下

upstream lb {
        server 192.168.0.103;
        server 192.168.0.104;
        }


server {
    listen       80;
    server_name 192.168.0.250;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_pass http://lb/;
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
3、主備配置差別主要為(建議這麽配置):
- 主機:(state MASTER;priority 100)
- 備機:(state BACKUP;priority 99)
- 非搶占:nopreempt
或者:
- 主機:(state BACKUP;priority 100)
- 備機:(state BACKUP;priority 100)

- 默認搶占

4、nginx的檢查腳本

最簡單的做法是監控NginX進程,更靠譜的做法是檢查NginX端口,最靠譜的做法是檢查多個url能否獲取到頁面。

註意:這裏要提示一下keepalived.conf中vrrp_script配置區的script一般有2種寫法:
1)通過腳本執行的返回結果,改變優先級,keepalived繼續發送通告消息,backup比較優先級再決定。這是直接監控Nginx進程的方式。
2)腳本裏面檢測到異常,直接關閉keepalived進程,backup機器接收不到advertisement會搶占IP。這是檢查NginX端口的方式。

第一種方式如上述實驗中的"killall -0 nginx"

Killall -0

做進程自檢:
如果進程還在使用,通過echo $? 可得返回為0;
如果進程已經死了,返回為1,並伴有error信息。

通過腳本判斷,有異常時exit 1,正常退出exit 0,然後keepalived根據動態調整的 vrrp_instance 優先級選舉決定是否搶占VIP:
如果腳本執行結果為0,並且weight配置的值大於0,則優先級相應的增加
如果腳本執行結果非0,並且weight配置的值小於0,則優先級相應的減少
其他情況,原本配置的優先級不變,即配置文件中priority對應的值。

第二方式檢測nginx後停止keepalived

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/local/nginx/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        /etc/init.d/keepalived stop
    fi
fi

三、Keepalive的通知機制

1、實例狀態通知

1) notify_master :節點變為master時執行

2) notify_backup : 節點變為backup時執行

3) notify_fault : 節點變為故障時執行

2、虛擬服務器檢測通知

1) notify_up : 虛擬服務器up時執行

2) notify_down : 虛擬服務器down時執行

notify_master "/etc/keepalived/notify.sh master

#!/bin/bash
# description: An example of notify script

vip=192.168.1.205
contact=‘[email protected]‘

notify() {
    mailsubject="`hostname` to be $1: $vip floating"
    mailbody="`date ‘+%F %H:%M:%S‘`: vrrp transition, `hostname` changed to be $1"
    echo $mailbody | mail -s "$mailsubject" $contact
}

case "$1" in
    master)
        notify master
        /etc/rc.d/init.d/nginx start
        exit 0
    ;;
    backup)
        notify backup
        /etc/rc.d/init.d/nginx stop
        exit 0
    ;;
    fault)
        notify fault
        /etc/rc.d/init.d/nginx stop
        exit 0
    ;;
    *)
        echo ‘Usage: `basename $0` {master|backup|fault}‘
        exit 1
    ;;
esac

Keepalived+Nginx實現前端負載均衡的高可用