搭建Nginx高可用集羣(keepalived+雙機熱備)

一、Nginx高可用

首先了解一下什麼是高可用,高可用是分佈式系統架構中必須考慮的因素。

我們都知道,使用nginx的反向代理和負載均衡可以解決tomcat等web容器的單點故障以及高併發等問題

反向代理是指以代理服務器來接收瀏覽器的請求,然後再將請求轉發到內網的服務器,然後再將從服務器上得到的結果返回給客戶端。負載均衡就是要解決一個web服務器壓力過大的問題,此時可以通過多個web服務器根據不同的算法將併發過來的請求分配到多個服務器上,從而減輕單個服務器壓力過大的問題。

這樣的話,當一臺web服務器掛掉了,還有其他的服務器可以處理客戶端的請求,也解決了單點故障問題,這是對web服務器的高可用。

但是,上述架構仍然存在單點故障問題嗎,如果這臺Nginx掛了,那麼所有對外提供的接口都將導致無法訪問,所以我們也需要給Nginx配置高可用機制。

可以使用keepalived來實現Nginx的高可用。

二、Nginx雙機熱備

雙機熱備方案是目前使用最爲普遍的一種高可用方案,雙機熱備就是指一臺服務器整在提供服務,另外一臺作爲備用狀態,當一臺服務器掛掉之後另外一臺就會代替他繼續提供服務。

雙機熱備主要解決的是Nginx的單點故障問題。

三、LVS負載均衡

再來了解一下LVS,LVS(Linux Vritual Server)即Linux虛擬服務器,他是一個開源的軟件,可以實現傳輸層四層負載均衡,通過 LVS 達到的負載均衡技術可以實現一個高性能高可用的 Linux 服務器集羣。

大概流程就是:當客戶端發出請求時,會先連接到互聯網的DNS服務器,然後解析到LVS負載均衡調度器上,LVS可以幫我們虛擬出來一個IP地址(外網IP),此時客戶端用戶就會去連接這個虛擬出來的IP,當用戶連接到虛擬IP之後LVS會根據指定的調度算法確定具體要連接到哪一臺Nginx服務器上。客戶端連接到虛擬IP的過程對用戶是透明的,而LVS具體連接到哪一臺Nginx服務器對用戶來說是不知道的。

LVS負載均衡調度器僅僅只是一個調度器,並不是真正的服務。

四、keepalived健康監測

來了解了解爲什麼要引入keepalived

LVS可以實現負載均衡,但是不能夠進行健康檢查。意思就是,假如一臺Nginx服務器掛掉了,LVS仍然會把客戶端的請求發送到這個掛掉了Nginx上(因爲LVS並不知道此Nginx掛了),這樣就會導致請求無效無法處理客戶端的請求。

keepalive 軟件可以進行健康檢查,所以我們需要使用他來進行監測,而且可以實現Nginx的高可用性,解決Nginx的單點故障問題及LVS不能進行健康檢查的問題。

keepalived的工作原理

keepalived是基於VRRP協議實現的保證集羣高可用的一個服務軟件,主要功能是實現真機的故障隔離和負載均衡器間的失敗切換,防止單點故障。VRRP協議保證當主機的下一路由器出現故障時,由另外一臺路由器來代替出現故障的路由器進行工作,從而保持網絡通信的連續性和可靠性。

VRRP虛擬出來的是路由。

五、開始搭建Nginx高可用集羣

1、首先準備兩臺Nginx服務器,一個作爲主服務器MASTER,一個作爲備服務器BACKUP,再利用LVS虛擬出來一個IP地址。

#搭建keepalived環境
yum install -y  keepalived

#keepalived的啓動與停止
service keepalived start
service keepalived stop

2、修改主Nginx服務器keepalived文件:vim  /etc/keepalived/keepalived.conf

設置自己的主Nginx服務器的IP地址等信息,我這裏是192.168.66.100,虛擬IP設置爲192.168.66.99

! Configuration File for keepalived
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" #運行腳本,腳本內容下面有,就是起到一個nginx宕機以後,自動開啓服務
    interval 2 #檢測時間間隔
    weight -20 #如果條件成立的話,則權重 -20
}
# 定義虛擬路由,VI_1 爲虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
    state MASTER #來決定主從
    interface ens33 # 綁定虛擬 IP 的網絡接口,根據自己的機器填寫
    virtual_router_id 121 # 虛擬路由的 ID 號, 兩個節點設置必須一樣
    mcast_src_ip 192.168.66.100 #填寫本機ip
    priority 100 # 節點優先級,主要比從節點優先級高
    nopreempt # 優先級高的設置 nopreempt 解決異常恢復後再次搶佔的問題
    advert_int 1 # 組播信息發送間隔,兩個節點設置必須一樣,默認 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 將track_script塊加入instance 配置塊
    track_script {
        chk_nginx #執行Nginx監控的服務
    }

    virtual_ipaddress {
        192.168.66.99 #虛擬ip
    }
}

3、修改從Nginx服務器keepalived文件, vim /etc/keepalived/keepalived.conf

設置自己的從Nginx服務器的IP地址等信息,我這裏是192.168.66.101,虛擬IP也設置爲192.168.66.99

! Configuration File for keepalived
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" #運行腳本,腳本內容下面有,就是起到一個nginx宕機以後,自動開啓服務
    interval 2 #檢測時間間隔
    weight -20 #如果條件成立的話,則權重 -20
}
# 定義虛擬路由,VI_1 爲虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
    state BACKUP #來決定主從
    interface ens33 # 綁定虛擬 IP 的網絡接口,根據自己的機器填寫
    virtual_router_id 121 # 虛擬路由的 ID 號, 兩個節點設置必須一樣
    mcast_src_ip 192.168.66.101 #填寫本機ip
    priority 100 # 節點優先級,主要比從節點優先級高
    nopreempt # 優先級高的設置 nopreempt 解決異常恢復後再次搶佔的問題
    advert_int 1 # 組播信息發送間隔,兩個節點設置必須一樣,默認 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 將 track_script 塊加入 instance 配置塊
    track_script {
        chk_nginx #執行 Nginx 監控的服務
    }

    virtual_ipaddress {
        192.168.66.99 # 虛擬ip
    }
}

4、Nginx+keepalived實現高可用寫入腳本:vim /etc/keepalived/nginx_check.sh

(兩臺機器都需要寫)
#!/bin/bash
A=`ps -C nginx —no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

對該腳本文件授權

chmod 777 /etc/keepalived/nginx_check.sh

此時已經配置完成。

在瀏覽器訪問虛擬IP192.168.66.99時即可訪問到主Nginx服務器中的服務,即使主Nginx服務器掛了,也會自動連接到從Nginx服務器上,從而保證了Nginx的高可用,當主Nginx恢復正常時,會再次自動連接到主Nginx服務器上繼續服務

END......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章