Nginx 開發與操作 - HTTP 負載均衡實測 實測 HTTP 多種負載均衡的機制。

Published on Friday, July 26, 2024

在第上一篇的文章中,學習到 多種 HTTP 負載均衡的分配方法,今天要挑選幾個來實測看看。

還是用 Play with Docker 建立三台虛擬機。

IP Hostname
192.168.0.18 node1
192.168.0.17 node2
192.168.0.16 node3

Round-Robin(Default)

Round-Robin 會檢查目前 Server Group 內部的伺服器並根據順序轉送請求,因為是預設方法所以不需要明確設定 Round-Robin 模式。

upstream node {
      server 192.168.0.17:80;
      server 192.168.0.16:80;
}
server {
      listen 80 default_server;
      listen [::]:80 default_server;
      
      location / {
          proxy_pass http://node;
      }
}

開啟瀏覽器後訪問 Load Balancer 192.168.0.18,按下重新整理之後會輪流顯示 192.168.0.16 與 192.168.0.17 符合 Round-Robin 的規則。


Least Connected

Least connected 會檢查目前 Server Group 內部的伺服器找出連線數量最低的那一台機器並分配給它,要測試這個方法我們可以 將 192.168.0.17 的回應時間延長,Nginx 會判斷 192.168.0.17 目前是有一條連線佔用中這樣之後就會把請求優先傳送給 192.168.0.16。

首先先把 192.168.0.18 default.conf 修改成 least_conn 負載均衡方法。

vi /etc/nginx/http.d/default.conf
upstream node {
      least_conn;
      server 192.168.0.17:80;
      server 192.168.0.16:80;
}
server {
      listen 80 default_server;
      listen [::]:80 default_server;
      
      location / {
          proxy_pass http://node;
      }
}

要延長 192.168.0.17 回應時間有許多辦法,這邊選擇使用 iproute2tc 命令直接控制網路介面流量來模擬長時間運行的請求

apk add iproute2

這裡新增一個規則將 eth0 網路介面的回應時間延長成 10 秒。

tc qdisc add dev eth0 root netem delay 10000ms

接下來開啟兩個分頁都訪問 Load Balancer 192.168.0.18,如果其中一個分頁回傳的時間很長就代表被分配給了 192.168.0.17 執行請求, 這樣另一個分頁根據 least_conn 分配的模式就只會固定分配給 192.168.0.16 符合 Least Connected 的規則。。

tc qdisc del dev eth0 root netem delay 10000ms

IP Hash

IP Hash 方法會將客戶端的 IP 進行 Hash 計算之後就能將同一個 IP 請求轉發到同一台伺服器上。

首先先把 192.168.0.18 default.conf 修改成 ip_hash 負載均衡方法。

vi /etc/nginx/http.d/default.conf
upstream node {
      ip_hash;
      server 192.168.0.17:80;
      server 192.168.0.16:80;
}
server {
      listen 80 default_server;
      listen [::]:80 default_server;
      
      location / {
          proxy_pass http://node;
      }
}

接下來也是訪問 Load Balancer 192.168.0.18,重新刷新之後也是固定將請求轉發到 192.168.0.17 並不會轉發給 192.168.0.16 符合 ip_hash 的規則


Summary

今天實測了三種常用的負載均衡方法,並搭配使用 Play with Docker 看到實際的效果。 其他的模式是商業版才可以使用,之後有機會的話會在測試看看。