從零手寫實現 nginx-31-load balance 負載均衡介紹

老马啸西风發表於2024-07-17

前言

大家好,我是老馬。很高興遇到你。

我們為 java 開發者實現了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何處理的,可以參考我的另一個專案:

手寫從零實現簡易版 tomcat minicat

手寫 nginx 系列

如果你對 nginx 原理感興趣,可以閱讀:

從零手寫實現 nginx-01-為什麼不能有 java 版本的 nginx?

從零手寫實現 nginx-02-nginx 的核心能力

從零手寫實現 nginx-03-nginx 基於 Netty 實現

從零手寫實現 nginx-04-基於 netty http 出入參最佳化處理

從零手寫實現 nginx-05-MIME型別(Multipurpose Internet Mail Extensions,多用途網際網路郵件擴充套件型別)

從零手寫實現 nginx-06-資料夾自動索引

從零手寫實現 nginx-07-大檔案下載

從零手寫實現 nginx-08-範圍查詢

從零手寫實現 nginx-09-檔案壓縮

從零手寫實現 nginx-10-sendfile 零複製

從零手寫實現 nginx-11-file+range 合併

從零手寫實現 nginx-12-keep-alive 連線複用

從零手寫實現 nginx-13-nginx.conf 配置檔案介紹

從零手寫實現 nginx-14-nginx.conf 和 hocon 格式有關係嗎?

從零手寫實現 nginx-15-nginx.conf 如何透過 java 解析處理?

從零手寫實現 nginx-16-nginx 支援配置多個 server

從零手寫實現 nginx-17-nginx 預設配置最佳化

從零手寫實現 nginx-18-nginx 請求頭+響應頭操作

從零手寫實現 nginx-19-nginx cors

從零手寫實現 nginx-20-nginx 佔位符 placeholder

從零手寫實現 nginx-21-nginx modules 模組資訊概覽

從零手寫實現 nginx-22-nginx modules 分模組載入最佳化

從零手寫實現 nginx-23-nginx cookie 的操作處理

從零手寫實現 nginx-24-nginx IF 指令

從零手寫實現 nginx-25-nginx map 指令

從零手寫實現 nginx-26-nginx rewrite 指令

從零手寫實現 nginx-27-nginx return 指令

從零手寫實現 nginx-28-nginx error_pages 指令

從零手寫實現 nginx-29-nginx try_files 指令

從零手寫實現 nginx-30-nginx proxy_pass upstream 指令

從零手寫實現 nginx-31-nginx load-balance 負載均衡

從零手寫實現 nginx-32-nginx load-balance 演算法 java 實現

nginx 負載均衡是什麼?

Nginx 負載均衡,就像一個聰明的分餐員,幫你把大量訂單均勻地分配給不同的大廚,讓每個大廚都能忙而不亂,最終讓顧客都能快速拿到自己的餐品。

例子

假設你經營了一家非常受歡迎的餐館,來吃飯的顧客特別多。

如果只有一個大廚來做飯,他很快就會忙不過來,顧客就得等很久。為了提高效率,你僱了好幾個大廚,每個大廚都能做相同的菜。

  • 負載均衡器(Load Balancer):Nginx 就像餐館的一個聰明分餐員,他的工作就是接到訂單後,把訂單均勻地分給每個大廚。這就叫負載均衡。

具體場景:

  1. 客戶請求:很多顧客來點餐(客戶端請求)。
  2. Nginx 分發請求:Nginx 分餐員接到訂單後,把訂單分配給不同的大廚(後端伺服器)。
  3. 大廚處理請求:每個大廚根據分配到的訂單做菜(處理請求),然後把做好的菜(響應)交給分餐員。
  4. 返回結果:分餐員把菜送到顧客手中(返回響應給客戶端)。

舉個例子:

http {
    upstream my_backend {
        server 192.168.0.1;
        server 192.168.0.2;
        server 192.168.0.3;
    }

    server {
        listen 80;
        server_name www.example.com;

        location / {
            proxy_pass http://my_backend;
        }
    }
}
  • upstream my_backend:定義了三位大廚的 IP 地址(後端伺服器)。
  • proxy_pass http://my_backend:Nginx 分餐員接到顧客的訂單後,會把訂單均勻地分給這三位大廚處理。

總結

Nginx 負載均衡的目標是透過均勻分配請求,確保每臺伺服器(大廚)都不至於過載,從而提升整體系統的效率和可靠性。

這樣,每個顧客都能更快地得到服務,整個餐館的運營也更加順暢。

nginx 支援哪些負載均衡演算法?給出對應的例子

Nginx 支援多種負載均衡演算法,可以根據不同的需求來選擇合適的演算法。以下是主要的幾種負載均衡演算法及其配置示例:

1. 輪詢(Round Robin)

這是 Nginx 預設的負載均衡演算法。請求依次分配給每個後端伺服器,按順序迴圈。

upstream my_backend {
    server 192.168.0.1;
    server 192.168.0.2;
    server 192.168.0.3;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://my_backend;
    }
}

2. 權重輪詢(Weighted Round Robin)

可以為每個伺服器設定權重,權重越高,分配到的請求越多。

upstream my_backend {
    server 192.168.0.1 weight=3;
    server 192.168.0.2 weight=2;
    server 192.168.0.3 weight=1;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://my_backend;
    }
}

3. 最少連線(Least Connections)

將新請求分配給當前活動連線數最少的伺服器,適用於請求處理時間不均勻的情況。

upstream my_backend {
    least_conn;
    server 192.168.0.1;
    server 192.168.0.2;
    server 192.168.0.3;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://my_backend;
    }
}

4. IP 雜湊(IP Hash)

根據客戶端的 IP 地址分配請求,同一 IP 地址的請求會分配到同一臺伺服器上,適用於需要會話保持的場景。

upstream my_backend {
    ip_hash;
    server 192.168.0.1;
    server 192.168.0.2;
    server 192.168.0.3;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://my_backend;
    }
}

5. 一致性雜湊(Hash)

根據使用者定義的鍵(比如 URL、cookie 等)分配請求,確保相同鍵的請求分配到同一臺伺服器。

upstream my_backend {
    hash $request_uri;
    server 192.168.0.1;
    server 192.168.0.2;
    server 192.168.0.3;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://my_backend;
    }
}

總結

Nginx 提供了多種負載均衡演算法,包括輪詢、權重輪詢、最少連線、IP 雜湊和一致性雜湊。

每種演算法適用於不同的場景和需求,選擇合適的演算法可以提升系統的效能和可靠性。

透過配置 upstream 指令和相關引數,可以靈活地實現各種負載均衡策略。

相關文章