'大白話 - Nginx 負載均衡的幾種算法'

Nginx 算法 Apache HTML 軟件 硬件 小子721 2019-08-13
"
"
大白話 - Nginx 負載均衡的幾種算法

引言

對於應用程序來說,隨著數據量與訪問量越來越大,傳統的單體架構往往已經不能滿足高負載,高併發的需求了。架構往往會由最初的單體架構,演變為高可用的架構。那麼,負載均衡幾乎又是其架構中必不可少的一部分。

nginx 負載均衡器的使用

由於nginx 的epoll 工作模式,使得nginx有著單機就可以抗高併發的能力(相比於另外一款web服務器apache來說),但是,nginx的穩定性又比apache差,因此,實際工作中,往往是nginx作為前端代理,轉發請求到apache集群中,這就是nginx作為負載均衡器的使用初衷。

nginx 負載均衡的幾種算法

例如,如果apache集群中,有5臺服務器,那麼,nginx服務器應該將請求轉發在哪臺服務器呢,這就是由以下要介紹的幾種負載均衡的算法的決定的。

  • 簡單輪詢

如圖:

"
大白話 - Nginx 負載均衡的幾種算法

引言

對於應用程序來說,隨著數據量與訪問量越來越大,傳統的單體架構往往已經不能滿足高負載,高併發的需求了。架構往往會由最初的單體架構,演變為高可用的架構。那麼,負載均衡幾乎又是其架構中必不可少的一部分。

nginx 負載均衡器的使用

由於nginx 的epoll 工作模式,使得nginx有著單機就可以抗高併發的能力(相比於另外一款web服務器apache來說),但是,nginx的穩定性又比apache差,因此,實際工作中,往往是nginx作為前端代理,轉發請求到apache集群中,這就是nginx作為負載均衡器的使用初衷。

nginx 負載均衡的幾種算法

例如,如果apache集群中,有5臺服務器,那麼,nginx服務器應該將請求轉發在哪臺服務器呢,這就是由以下要介紹的幾種負載均衡的算法的決定的。

  • 簡單輪詢

如圖:

大白話 - Nginx 負載均衡的幾種算法

顧名思義,這個方法是對後端web服務器進行簡單的輪詢,將請求按順序發給後端服務器。但是,每臺後端服務器,也許使用時間、硬件、軟件配置都不相同,這也就導致每臺服務器的性能也許就大不相同,每個服務器此刻處理的請求數量也是不一樣的,這樣簡單地輪詢,真正線上使用,不推介使用此種方式。

  • 加權輪詢法

如圖:

"
大白話 - Nginx 負載均衡的幾種算法

引言

對於應用程序來說,隨著數據量與訪問量越來越大,傳統的單體架構往往已經不能滿足高負載,高併發的需求了。架構往往會由最初的單體架構,演變為高可用的架構。那麼,負載均衡幾乎又是其架構中必不可少的一部分。

nginx 負載均衡器的使用

由於nginx 的epoll 工作模式,使得nginx有著單機就可以抗高併發的能力(相比於另外一款web服務器apache來說),但是,nginx的穩定性又比apache差,因此,實際工作中,往往是nginx作為前端代理,轉發請求到apache集群中,這就是nginx作為負載均衡器的使用初衷。

nginx 負載均衡的幾種算法

例如,如果apache集群中,有5臺服務器,那麼,nginx服務器應該將請求轉發在哪臺服務器呢,這就是由以下要介紹的幾種負載均衡的算法的決定的。

  • 簡單輪詢

如圖:

大白話 - Nginx 負載均衡的幾種算法

顧名思義,這個方法是對後端web服務器進行簡單的輪詢,將請求按順序發給後端服務器。但是,每臺後端服務器,也許使用時間、硬件、軟件配置都不相同,這也就導致每臺服務器的性能也許就大不相同,每個服務器此刻處理的請求數量也是不一樣的,這樣簡單地輪詢,真正線上使用,不推介使用此種方式。

  • 加權輪詢法

如圖:

大白話 - Nginx 負載均衡的幾種算法

簡單的輪詢法並不考慮後端機器的性能和負載差異。加權輪詢就是為每一臺服務器加一個權重(通俗的理解就是一個比例),按處理能力強的配置權重大,處理能力弱的配置權重低原則,進行合理分配。

  • 隨機算法

該算法就是每來一個請求,從後端服務器中隨機地選擇一個服務器處理請求

  • 源地址哈希法

該方法是對客戶端的IP地址做一個Hash,然後對服務器列表的大小取模,得到處理該請求的服務器,採用源地址哈希法進行負載均衡,相同的IP客戶端,如果服務器列表不變,將映射到同一個後臺服務器進行訪問

  • 最小連接法

如圖:

"
大白話 - Nginx 負載均衡的幾種算法

引言

對於應用程序來說,隨著數據量與訪問量越來越大,傳統的單體架構往往已經不能滿足高負載,高併發的需求了。架構往往會由最初的單體架構,演變為高可用的架構。那麼,負載均衡幾乎又是其架構中必不可少的一部分。

nginx 負載均衡器的使用

由於nginx 的epoll 工作模式,使得nginx有著單機就可以抗高併發的能力(相比於另外一款web服務器apache來說),但是,nginx的穩定性又比apache差,因此,實際工作中,往往是nginx作為前端代理,轉發請求到apache集群中,這就是nginx作為負載均衡器的使用初衷。

nginx 負載均衡的幾種算法

例如,如果apache集群中,有5臺服務器,那麼,nginx服務器應該將請求轉發在哪臺服務器呢,這就是由以下要介紹的幾種負載均衡的算法的決定的。

  • 簡單輪詢

如圖:

大白話 - Nginx 負載均衡的幾種算法

顧名思義,這個方法是對後端web服務器進行簡單的輪詢,將請求按順序發給後端服務器。但是,每臺後端服務器,也許使用時間、硬件、軟件配置都不相同,這也就導致每臺服務器的性能也許就大不相同,每個服務器此刻處理的請求數量也是不一樣的,這樣簡單地輪詢,真正線上使用,不推介使用此種方式。

  • 加權輪詢法

如圖:

大白話 - Nginx 負載均衡的幾種算法

簡單的輪詢法並不考慮後端機器的性能和負載差異。加權輪詢就是為每一臺服務器加一個權重(通俗的理解就是一個比例),按處理能力強的配置權重大,處理能力弱的配置權重低原則,進行合理分配。

  • 隨機算法

該算法就是每來一個請求,從後端服務器中隨機地選擇一個服務器處理請求

  • 源地址哈希法

該方法是對客戶端的IP地址做一個Hash,然後對服務器列表的大小取模,得到處理該請求的服務器,採用源地址哈希法進行負載均衡,相同的IP客戶端,如果服務器列表不變,將映射到同一個後臺服務器進行訪問

  • 最小連接法

如圖:

大白話 - Nginx 負載均衡的幾種算法

該算法是檢測哪一臺服務器上的連接數最小,就將請求發給那一臺服務器

示例

在nginx.conf 中可以進行相關配置,以下只進行簡單舉例:

1、在http節點下,添加upstream節點。

upstream swoole_server{

server 192.168.137.101:8081;

server 192.168.137.102:8081;

server 192.168.137.103:8081;

}

參數說明: 其中upstream 是固定寫法,swoole_server 是自己定義的集群服務名稱(個人理解),這個名稱可以隨便定義(只要合法即可)。其中配置了3臺服務器,我這裡帶上了端口訪問。

2、將server節點下的location節點中的proxy_pass配置為:http:// + swoole_server名稱,即“ http://swoole_server”.

location / {

root html;

index index.html index.htm;

proxy_pass http://swoole_server;

}

簡單負載均衡初步完成了。upstream按照輪詢(默認)方式進行負載,每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。雖然這種方式比較簡單,但是最主要是負載分配不均衡。

如果進行權重分配,就如下

upstream swoole_server{

server 192.168.137.101:8081 weight=5;

server 192.168.137.102:8081 weight=5;

server 192.168.137.103:8081 weight=10;

}

weight 就是權重配置,自己依照服務器性能進行合理配置即可。

如果進行ip_hash分配,就如下:

upstream swoole_server{

ip_hash;

server 192.168.137.101:8081;

server 192.168.137.102:8081;

server 192.168.137.103:8081;

}

此種方式,每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。

還有一些配置項,大家共同探討吧。

結語

nginx 作為一款優秀的web服務器,有著其顯而易見的優勢,大家可以合理使用。負載均衡的另外一個問題,在於session存儲,例如,a用戶第一次請求是轉發在了a服務器上,如果使用默認的本地文件方式存放session,那麼a用戶的session 信息就寫入了a服務器本地文件,如果a用戶的第二次請求落在了b服務器上,那麼b服務器本地文件並沒有a用戶的session信息,這就會導致一系列的問題,因此解決session 共享也是一個難題,例如session存儲可以使用user的方式,將session放在redis集群中,apache集群,共同訪問redis集群中的session 信息,即使a服務器掛掉,a用戶也不會被強制退出。因為session會存在大量讀取問題,不建議放在數據庫中。完!!!

"

相關推薦

推薦中...