天天看點

《nginx 四》雙機主從熱備

LVS是一個開源的軟體,可以實作傳輸層四層負載均衡。LVS是Linux Virtual Server的縮寫,意思是Linux虛拟伺服器。目前有三種IP負載均衡技術(VS/NAT、VS/TUN和VS/DR);八種排程算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。

LVS可以實作負載均衡,但是不能夠進行健康檢查,比如一個rs出現故障,LVS 仍然會把請求轉發給故障的rs伺服器,這樣就會導緻請求的無效性。keepalive 軟體可以進行健康檢查,而且能同時實作 LVS 的高可用性,解決 LVS 單點故障的問題,其實 keepalive 就是為 LVS 而生的。

keepalived是一個類似于Layer2,4,7交換機制的軟體。是Linux叢集管理中保證叢集高可用的一個服務軟體,其功能是用來防止單點故障。

keepalived的工作原理:

         keepalived是基于VRRP協定實作的保證叢集高可用的一個服務軟體,主要功能是實作真機的故障隔離和負載均衡器間的失敗切換,防止單點故障。在了解keepalived原理之前先了解一下VRRP協定。

VRRP協定:Virtual Route

 Redundancy Protocol虛拟路由備援協定。是一種容錯協定,保證當主機的下一跳路由出現故障時,由另一台路由器來代替出現故障的路由器進行工作,進而保持網絡通信的連續性和可靠性。在介紹VRRP之前先介紹一些關于VRRP的相關術語:

虛拟路由器:由一個 Master 路由器和多個 Backup 路由器組成。主機将虛拟路由器當作預設網關。

VRID:虛拟路由器的辨別。有相同 VRID 的一組路由器構成一個虛拟路由器。

Master 路由器:虛拟路由器中承擔封包轉發任務的路由器。

Backup 路由器: Master 路由器出現故障時,能夠代替 Master 路由器工作的路由器。

虛拟 IP 位址:虛拟路由器的 IP 位址。一個虛拟路由器可以擁有一個或多個IP 位址。

IP 位址擁有者:接口 IP 位址與虛拟 IP 位址相同的路由器被稱為 IP 位址擁有者。

虛拟 MAC 位址:一個虛拟路由器擁有一個虛拟 MAC 位址。虛拟 MAC 位址的格式為 00-00-5E-00-01-{VRID}。通常情況下,虛拟路由器回應 ARP 請求使用的是虛拟 MAC 位址,隻有虛拟路由器做特殊配置的時候,才回應接口的真實 MAC 位址。

優先級: VRRP 根據優先級來确定虛拟路由器中每台路由器的地位。

非搶占方式:如果 Backup 路由器工作在非搶占方式下,則隻要 Master 路由器沒有出現故障,Backup 路由器即使随後被配置了更高的優先級也不會成為Master 路由器。

搶占方式:如果 Backup 路由器工作在搶占方式下,當它收到 VRRP 封包後,會将自己的優先級與通告封包中的優先級進行比較。如果自己的優先級比目前的 Master 路由器的優先級高,就會主動搶占成為 Master 路由器;否則,将保持 Backup 狀态。

虛拟路由示意圖:

      VRRP将區域網路内的一組路由器劃分在一起,形成一個VRRP備份組,它在功能上相當于一台路由器的功能,使用虛拟路由器号進行辨別(VRID)。虛拟路由器有自己的虛拟IP位址和虛拟MAC位址,它的外在變現形式和實際的實體路由完全一樣。區域網路内的主機将虛拟路由器的IP位址設定為預設網關,通過虛拟路由器與外部網絡進行通信。

      虛拟路由器是工作在實際的實體路由器之上的。它由多個實際的路由器組成,包括一個Master路由器和多個Backup路由器。 Master路由器正常工作時,區域網路内的主機通過Master與外界通信。當Master路由器出現故障時, Backup路由器中的一台裝置将成為新的Master路由器,接替轉發封包的工作。(路由器的高可用)

VRRP的工作工程:

(1) 虛拟路由器中的路由器根據優先級選舉出 Master。 Master 路由器通過發送免費 ARP 封包,将自己的虛拟 MAC 位址通知給與它連接配接的裝置或者主機,進而承擔封包轉發任務;

(2) Master 路由器周期性發送 VRRP 封包,以公布其配置資訊(優先級等)和工作狀況;

(3) 如果 Master 路由器出現故障,虛拟路由器中的 Backup 路由器将根據優先級重新選舉新的 Master;

(4) 虛拟路由器狀态切換時, Master 路由器由一台裝置切換為另外一台裝置,新的 Master 路由器隻是簡單地發送一個攜帶虛拟路由器的 MAC 位址和虛拟 IP位址資訊的ARP 封包,這樣就可以更新與它連接配接的主機或裝置中的ARP 相關資訊。網絡中的主機感覺不到 Master 路由器已經切換為另外一台裝置。

(5) Backup 路由器的優先級高于 Master 路由器時,由 Backup 路由器的工作方式(搶占方式和非搶占方式)決定是否重新選舉 Master。

VRRP優先級的取值範圍為0到255(數值越大表明優先級越高)

兩台Nginx伺服器

Nginx 主伺服器

 192.168.212.143

Nginx 備伺服器

 192.168.212.144

Lvs 虛拟VIP     192.168.212.110

前面三個一定要相同

1.下載下傳keepalived

wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz

2.解壓安裝:

tar -zxvf

keepalived-1.2.18.tar.gz -C /usr/local/

3.下載下傳插件openssl

yum install -y openssl

openssl-devel(需要安裝一個軟體包)

4.開始編譯keepalived

cd keepalived-1.2.18/

&& ./configure --prefix=/usr/local/keepalived

5.make一下

make && make install

報錯: eepalived執行./configure --prefix=/usr/local/keepalived時報錯:configure: error: Popt libraries is required

出現此錯誤的原因:

未安裝popt的開發包

解決方法:

yum install popt-devel

安裝好popt的開發包。重新./configure 即可。

将keepalived安裝成Linux系統服務,因為沒有使用keepalived的預設安裝路徑(預設路徑:/usr/local),安裝完成之後,需要做一些修改工作:

首先建立檔案夾,将keepalived配置檔案進行複制:

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf

/etc/keepalived/

然後複制keepalived腳本檔案:

cp

/usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

/usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

ln -s

/usr/local/sbin/keepalived /usr/sbin/

/usr/local/keepalived/sbin/keepalived /sbin/

可以設定開機啟動:chkconfig

keepalived on,到此我們安裝完畢!

service keepalived start

service keepalived stop

啟動報錯Starting

keepalived (via systemctl):  Job for

keepalived.service failed. See 'systemctl status keepalived.service' and

'journalctl -xn' for details. 

解決辦法

[root@edu-proxy-01

sbin]# cd /usr/sbin/ 

sbin]# rm -f keepalived  

sbin]# cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/ 

vi

/etc/keepalived/keepalived.conf

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.212.140 #填寫本機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.110.110 # 虛拟ip,也就是解決寫死程式的ip怎麼能切換的ip,也可擴充,用途廣泛。可配置多個。

關閉防火牆 systemctl stop firewalld

可以兩台機子互為熱備,平時各自負責各自的服務。在做上線更新的時候,關閉一台伺服器的tomcat後,nginx自動把流量切換到另外一台服務的後備機子上,進而實作無痛更新,保持服務的持續性,提高服務的可靠性,進而保證伺服器7*24小時運作。

upstream testproxy {

      server 127.0.0.1:8080;

      server 127.0.0.1:8081 backup;

  }

    server {

        listen       80;

        server_name  localhost;

        location / {

            proxy_pass   http://testproxy;

            index  index.html index.htm;

        }

                   ###nginx與上遊伺服器(真實通路的伺服器)逾時時間 後端伺服器連接配接的逾時時間_發起握手等候響應逾時時間

                    proxy_connect_timeout 1s;

                             ###nginx發送給上遊伺服器(真實通路的伺服器)逾時時間

         proxy_send_timeout 1s;

                    ### nginx接受上遊伺服器(真實通路的伺服器)逾時時間

         proxy_read_timeout 1s;

隻要在希望成為後備的伺服器 ip 後面多添加一個 backup 參數,這台伺服器就會成為備份伺服器。

在平時不使用,nginx 不會給它轉發任何請求。隻有當其他節點全部無法連接配接的時候,nginx 才會啟用這個節點。

一旦有可用的節點恢複服務,該節點則不再使用,又進入後備狀态

每個服務虛拟安裝keepalived 虛拟一個VIP ,配置主從關系,當主挂了,直接走備機。

Keepalived虛拟VIP 位址 192.168.212.110

A 伺服器 192.168.212.142

B 伺服器 192.168.212.143

修改主Nginx伺服器keepalived檔案,  /etc/keepalived/keepalived.conf

State 為MASTER

! Configuration File for keepalived

    mcast_src_ip 192.168.212.141 #填寫本機ip

        192.168.212.110 # 虛拟ip,也就是解決寫死程式的ip怎麼能切換的ip,也可擴充,用途廣泛。可配置多個。

State 為BACKUP

    state BACKUP #來決定主從

寫入nginx_check.sh腳本 /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 nginx_check.sh。

LVS的負載能力強,因為其工作方式邏輯非常簡單,僅進行請求分發,而且工作在網絡的第4層,沒有流量,是以其效率不需要有過多的憂慮。

LVS基本能支援所有應用,因為工作在第4層,是以LVS可以對幾乎所有應用進行負載均衡,包括Web、資料庫等。

注意:LVS并不能完全判别節點故障,比如在WLC規則下,如果叢集裡有一個節點沒有配置VIP,将會導緻整個叢集不能使用。還有一些其他問題,目前尚需進一步測試。

Nginx工作在網路第7層,是以可以對HTTP應用實施分流政策,比如域名、結構等。相比之下,LVS并不具備這樣的功能,是以Nginx可使用的場合遠多于LVS。并且Nginx對網絡的依賴比較小,理論上隻要Ping得通,網頁通路正常就能連通。LVS比較依賴網絡環境。隻有使用DR模式且伺服器在同一網段内分流,效果才能得到保證。

Nginx可以通過伺服器處理網頁傳回的狀态嗎、逾時等來檢測伺服器内部的故障,并會把傳回錯誤的請求重新發送到另一個節點。目前LVS和LDirectd 也支援對伺服器内部情況的監控,但不能重新發送請求。

比如使用者正在上傳一個檔案,而處理該上傳資訊的節點剛好出現故障,則Nginx會把上傳請求重新發送到另一台伺服器,而LVS在這種情況下會直接斷掉。Nginx還能支援HTTP和Email(Email功能很少有人使用),LVS所支援的應用在這個電商比Nginx更多。

Nginx同樣能承受很高負載并且能穩定運作,由于處理流量受限于機器I/O等配置,是以負載能力相對較差。

Nginx 安裝、配置及測試相對來說比較簡單,因為有相應的錯誤日志進行提示。LVS的安裝、配置及測試所花的時間比較長,因為LVS對網絡以來比較大,很多時候有可能因為網絡問題而配置不能成功,出現問題時,解決的難度也相對較大。Nginx本身沒有現成的熱備方案,是以在單機上運作風險較大,建議KeepAlived配合使用。另外,Nginx可以作為LVS的節點機器使用,充分利用Nginx的功能和性能。當然這種情況也可以直接使用Squid等其他具備分發功能的軟體。

具體應用具體分析。如果是比較小型的網站(每日PV小于100萬),使用者Nginx就完全可以應對,如果機器也不少,可以用DNS輪詢。LVS後用的機器較多,在建構大型網站或者提供重要服務且機器較多時,可多加考慮利用LVS。

阿裡雲預設不支援虛拟VIP技術,

https://yq.aliyun.com/ask/61502

繼續閱讀