《nginx 四》雙機主從熱備

lvs+keepalived+nginx實現高性能負載均衡集羣

LVS做用

LVS是一個開源的軟件,能夠實現傳輸層四層負載均衡。LVS是Linux Virtual Server的縮寫,意思是Linux虛擬服務器。目前有三種IP負載均衡技術(VS/NAT、VS/TUN和VS/DR);八種調度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。html

Keepalived做用

LVS能夠實現負載均衡,可是不可以進行健康檢查,好比一個rs出現故障,LVS 仍然會把請求轉發給故障的rs服務器,這樣就會致使請求的無效性。keepalive 軟件能夠進行健康檢查,並且能同時實現 LVS 的高可用性,解決 LVS 單點故障的問題,其實 keepalive 就是爲 LVS 而生的。nginx

 

keepalived和其工做原理

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.143tomcat

Nginx 備服務器  192.168.212.144bash

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安裝成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/

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

ln -s /usr/local/sbin/keepalived /usr/sbin/

ln -s /usr/local/keepalived/sbin/keepalived /sbin/

能夠設置開機啓動:chkconfig keepalived on,到此咱們安裝完畢!

keepalived 經常使用命令

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/ 

[root@edu-proxy-01 sbin]# rm -f keepalived  

[root@edu-proxy-01 sbin]# cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/ 

 

 

 

使用keepalived虛擬VIP

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

 

nginx+keepalived簡單雙機主從熱備

雙機主從熱備概述

能夠兩臺機子互爲熱備,平時各自負責各自的服務。在作上線更新的時候,關閉一臺服務器的tomcat後,nginx自動把流量切換到另一臺服務的後備機子上,從而實現無痛更新,保持服務的持續性,提升服務的可靠性,從而保證服務器7*24小時運行。

Nginx Upstream 實現簡單雙機主從熱備

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 纔會啓用這個節點。

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

Nginx+keepalived簡單雙機主從熱備

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

Keepalived虛擬VIP 地址 192.168.212.110

A 服務器 192.168.212.142

B 服務器 192.168.212.143

 

修改主keepalived信息

修改主Nginx服務器keepalived文件,  /etc/keepalived/keepalived.conf

State 爲MASTER

 

! 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.212.141 #填寫本機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.212.110 # 虛擬ip,也就是解決寫死程序的ip怎麼能切換的ip,也可擴展,用途普遍。可配置多個。

    }

}

 

修改從keepalived信息

修改主Nginx服務器keepalived文件,  /etc/keepalived/keepalived.conf

State 爲BACKUP

 

! 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.212.141 #填寫本機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.212.110 # 虛擬ip,也就是解決寫死程序的ip怎麼能切換的ip,也可擴展,用途普遍。可配置多個。

    }

}

 

nginx+keepalived實現高可

寫入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與Nginx區別

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技術

阿里雲默認不支持虛擬VIP技術,

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

相關文章
相關標籤/搜索