負載均衡:靜態負載均衡算法 與 動態負載均衡算法 實例


一、普通輪詢算法

這是Nginx 默認的輪詢算法。

例子:兩台相同的Tomcat服務器,通過 localhost:8080 訪問Tomcat1,通過 localhost:8081訪問Tomcat2,現在我們要輸入 localhost 這個地址,可以在這兩個Tomcat服務器之間進行交替訪問。

1、分別修改兩個Tomcat服務器的端口為8080和8081。然后再修改Tomcat的首頁,使得訪問這兩個頁面時能夠區分。如下:

修改端口號文件為 server.xml :
image

修改首頁的路徑為:webapps/ROOT/index.jsp
image

修改完成之后,分別啟動這兩個Tomcat服務器,然后分別輸入相應的地址端口號:

輸入地址:localhost:8081
image

輸入地址:localhost:8080
image

2、修改 nginx 的配置文件 nginx.conf

upstream OrdinaryPolling {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    }
    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://OrdinaryPolling;
            index  index.html index.htm index.jsp;

        }
    }

3、啟動 nginx。然后在瀏覽器輸入localhost 地址,觀看頁面變化:

image

二、基於比例加權輪詢

上述兩台Tomcat服務器基本上是交替進行訪問的。但是這里我們有個需求:

由於Tomcat1服務器的配置更高點,我們希望該服務器接受更多的請求,而 Tomcat2 服務器配置低,希望其處理相對較少的請求。

那么這時候就用到了加權輪詢機制了。

nginx.conf 配置文件如下:

upstream OrdinaryPolling {
    server 127.0.0.1:8080 weight=5;
    server 127.0.0.1:8081 weight=2;
    }
    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://OrdinaryPolling;
            index  index.html index.htm index.jsp;

        }
    }

其實對比上面不加權的輪詢方式,這里在 upstream 指令中多了一個 weight 指令。該指令用於配置前面請求處理的權重,默認值為 1。

也就是說:第一種不加權的普通輪詢,其實其加權值 weight 都為 1。

下面我們看頁面相應結果:
image

明顯 8080 端口號出現的次數更多,試驗的次數越多越接近我們配置的比例。

三、基於IP路由負載

我們知道一個請求在經過一個服務器處理時,服務器會保存相關的會話信息,比如session,但是該請求如果第一個服務器沒處理完,通過nginx輪詢到第二個服務器上,那么這個服務器是沒有會話信息的。

最典型的一個例子:用戶第一次進入一個系統是需要進行登錄身份驗證的,首先將請求跳轉到Tomcat1服務器進行處理,登錄信息是保存在Tomcat1 上的,這時候需要進行別的操作,那么可能會將請求輪詢到第二個Tomcat2上,那么由於Tomcat2 沒有保存會話信息,會以為該用戶沒有登錄,然后繼續登錄一次,如果有多個服務器,每次第一次訪問都要進行登錄,這顯然是很影響用戶體驗的。

這里產生的一個問題也就是集群環境下的 session 共享,如何解決這個問題?

通常由兩種方法:

1、第一種方法是選擇一個中間件,將登錄信息保存在一個中間件上,這個中間件可以為 Redis 這樣的數據庫。那么第一次登錄,我們將session 信息保存在 Redis 中,跳轉到第二個服務器時,我們可以先去Redis上查詢是否有登錄信息,如果有,就能直接進行登錄之后的操作了,而不用進行重復登錄。

2、第二種方法是根據客戶端的IP地址划分,每次都將同一個 IP 地址發送的請求都分發到同一個 Tomcat 服務器,那么也不會存在 session 共享的問題。

而 nginx 的基於 IP 路由負載的機制就是上訴第二種形式。大概配置如下:

upstream OrdinaryPolling {
    ip_hash;
    server 127.0.0.1:8080 weight=5;
    server 127.0.0.1:8081 weight=2;
    }
    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://OrdinaryPolling;
            index  index.html index.htm index.jsp;

        }
    }

注意:我們在 upstream 指令塊中增加了 ip_hash 指令。該指令就是告訴 nginx 服務器,同一個 IP 地址客戶端發送的請求都將分發到同一個 Tomcat 服務器進行處理。

四、基於服務器響應時間負載分配

根據服務器處理請求的時間來進行負載,處理請求越快,也就是響應時間越短的優先分配。

upstream OrdinaryPolling {
    server 127.0.0.1:8080 weight=5;
    server 127.0.0.1:8081 weight=2;
    fair;
    }
    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://OrdinaryPolling;
            index  index.html index.htm index.jsp;

        }
    }

通過增加了 fair 指令。

五、對不同域名實現負載均衡

通過配合location 指令塊我們還可以實現對不同域名實現負載均衡。

upstream wordbackend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    }

    upstream pptbackend {
    server 127.0.0.1:8082;
    server 127.0.0.1:8083;
    }

    server {
        listen       80;
        server_name  localhost;

        location /word/ {
            proxy_pass http://wordbackend;
            index  index.html index.htm index.jsp;

        }
    location /ppt/ {
            proxy_pass http://pptbackend;
            index  index.html index.htm index.jsp;

        }
    }

學習自:
https://www.cnblogs.com/ysocean/p/9392912.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM