upstream 模塊
一、upstream 模塊簡介
(1) Nginx 的負載均衡功能依賴於 ngx_http_upstream_module 模塊,所支持的代理方式包括 proxy_pass 、fastcgi_pass 、memcached_pass 等
(2) ngx_http_upstream_module 允許 Nginx 定義一組或多組節點服務器組,使用時可以通過 proxy_pass 代理方式把網站的請求發送到事先定義好的對應 Upstream 組的名字上,具體寫法為 "proxy_pass http://www_server_pools" ,其中 www_server_pools 就是一個 Upstream 節點服務器組名字
二、upstream 模塊語法
1、基本的 upstream 配置案例
upstream www_server_pools { # upstream 是關鍵詞,www_server_pools 是 upstream 集群組的名字
server 192.168.123.103:80 weight=5; # server 是關鍵詞,後面接域名或IP
server 192.168.123.104:80 weight=10; # weight 是權重,數值越大被分配的請求越多
server 192.168.123.105:80 weight=5;}
2、完整的 upstream 配置案例
upstream blog_server_pools {
server 192.168.123.103:80
server 192.168.123.104:80 weight=1 max_fails=1 fail_timeout=10s; # max_fails=1 表示 Nginx 嘗試連接後端主機失敗的次數
server 192.168.123.105:80 weight=1 max_fails=2 fail_timeout=20s backup; # fail_timeout 表示在 max_fails 失敗次數後,距離下次檢查的間隔時間
server 192.168.123.105:80 weight=1 max_fails=2 fail_timeout=20s backup; # backup 表示備份,當前面的 RS 都失敗後會自動啟用熱備 RS
server 192.168.123.106:80 down; # down 表示該 RS 永不可用
}
3、使用域名或 socket 的 upstream 配置案例
upstream backend { server backend1.example.com weight=5; server backend2.example.com:8080; # 域名加端口,server 後面如果接域名,需要內網有 DNS 服務器或在負載均衡器的 hosts 文件做域名解析 server unix:/tmp/backend3; # 指定 socket 文件
}
三、upstream 模塊調度算法
1、分類
(1) 調度算法分為靜態調度算法和動態調度算法
(2) 靜態調度算法即負載均衡器根據自身規定的規則進行分配,不考慮後端節點服務器的情況,靜態調度算法有 rr 、wrr 、ip_hash 等
(3) 動態調度算法即負載均衡器會根據後端節點的當前狀態來決定是否分發請求,動態調度算法有 least_conn 、fair 等
2、靜態調度算法
(1) rr :默認調度算法,按客戶端請求順序把客戶端的請求逐一分配到不同的後端節點服務器
(2) wrr :權重輪詢算法,按比例進行分配,可以根據服務器的配置和性能指定權重值大小
(3) ip_hash :每個請求按客戶端 IP 的 hash 結果分配,當新的請求到達時,先將其客戶端 IP 通過哈希算法哈希出一個值,在隨後的客戶端請求中,客戶 IP 的哈希值只要相同,就會分配至同一臺服務器,該調度算法可以解決動態網頁的 session 共享問題,當使用該算法時,後端服務器再負載均衡調度中的狀態不能有 weight 和 backup ,即使有也不會生效,配置實例
3、動態調度算法
(1) fair :此算法會根據後端節點服務器的響應時間來分配請求,響應時間短的優先分配,如果需要使用這種調度算法,必須安裝 Nginx 的 upstream_fair 模塊,配置實例
(2) least_conn :該算法會根據後端節點的連接數來決定分配情況,哪個機器連接數少就分發給哪個
(3) url_hash :與 ip_hash 類似,會根據訪問 URL 的 hash 結果來分配請求,如果要使用這種調度算法,必須安裝 Nginx 的 hash 模塊,配置實例
(4) 一致性 hash 算法:一般用於代理後端業務為緩存服務的場景,通過將用戶請求的 URI 或指定的字符串進行計算,然後調度到後端的服務器上,此後任何用戶查找同一個 URI 或者指定字符串都會被調度到這一臺服務器上,配置實例
upstream 模塊