日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
一篇文章讓你搞懂Nginx的負載均衡

前面我們講了 Nginx 的 11 個階段以及各個模塊的用法,現在終于到了最重要也是最常用的一部分了,那就是反向代理和負載均衡,今天這篇文章介紹了負載均衡的原理以及對應的四種負載均衡算法,當然還有對應的指令及實戰(zhàn),歡迎品嘗。

創(chuàng)新互聯建站網站建設服務商,為中小企業(yè)提供網站設計制作、成都網站制作服務,網站設計,網站運營等一站式綜合服務型公司,專業(yè)打造企業(yè)形象網站,讓您在眾多競爭對手中脫穎而出創(chuàng)新互聯建站。

負載均衡

所謂負載均衡,就是 Nginx 把請求均勻的分攤給上游的應用服務器,這樣即使某一個服務器宕機也不會影響請求的處理,或者當應用服務器扛不住了,可以隨時進行擴容。

Nginx 在 AKF 可擴展立方體上的應用

  • 在 x 軸上,可以通過橫向擴展應用服務器集群,Nginx 基于 Round-Robin 或者 Least-Connected 算法分發(fā)請求。但是橫向擴展并不能解決所有問題,當數據量大的情況下,無論擴展多少臺服務,單臺服務器數據量依然很大。
  • 在 y 軸上,可以基于 URL 進行不同功能的分發(fā)。需要對 Nginx 基于 URL 進行 location 的配置,成本較高。
  • 在 z 軸上可以基于用戶信息進行擴展。例如將用戶 IP 地址或者其他信息映射到某個特定的服務或者集群上去。

這就是 Nginx 的負載均衡功能,它的主要目的就是為了增強服務的處理能力和容災能力。

反向代理

反向代理和負載均衡在某種程度上是密不可分的。

Nginx 支持多種協(xié)議的反向代理。四層的反向代理比較簡單,無論是 UDP 還是 TCP 的流量過來,轉發(fā)到上游的依然是 UDP 或 TCP 的流量。

而到了應用層時,就不太相同了,因為 HTTP 的 Header 中包含了大量的業(yè)務信息,需要根據 HTTP 的頭部轉換成不同的協(xié)議。

反向代理與緩存

緩存這個問題分為兩類,一類是時間緩存,一類是空間緩存。

  • 時間緩存是指,當用戶請求一個頁面的時候,Nginx 發(fā)現沒有緩存,就會到后端服務器去取,在返回給用戶響應的同時還會緩存一份,這樣當下一個用戶去請求的時候就會直接用緩存作為響應而不會再去請求上游的服務器。
  • 空間緩存這種用的比較少,主要是指當用戶發(fā)來請求的時候,Nginx 可以提前去上游服務器獲取一些響應的內容,這個后面可以看到是怎么用的。

upstream 與 server 指令

指令name 表示負載均衡集群的名字,而 {} 內指定了一系列的服務器server 后跟服務器地址,地址后還可以加一些參數 parameters

 
 
 
  1. Syntax: upstream name { ... } 
  2. Default: — 
  3. Context: http 
  4.  
  5. Syntax: server address [parameters]; 
  6. Default: — 
  7. Context: upstream 
  • 功能:指定一組上游服務器地址,地址可以是域名、IP 地址或者 Unix Socket 地址??梢栽谟蛎蛘?IP 地址后加端口,如果不加端口,那么默認使用 80 端口。
  • 通用參數:server 后可以添加的參數backup:指定當前 server 為備份服務,僅當非備份 server 不可用時,請求才會轉發(fā)到該 server表示某臺服務已經下線,不再服務

負載均衡算法

加權 Round-Robin 負載均衡算法

Round-Robin(rr) 負載均衡算法發(fā)給上游服務器的請求是輪詢發(fā)送的,相當于所有上游服務器根據順序依次處理發(fā)來的請求。

有些情況下上游服務器性能不同,比如 4C8G 和 8C16G 的服務器都有,那么這時候就可以對服務器設置一些權重,讓性能好的承擔更多的請求。

功能在加權輪詢的方式訪問 server 指令指定的上游服務集成在 Nginx 的 upstream 框架中,無法移除

指令weight:服務訪問的權重,默認是 1max_conns:server 的最大并發(fā)連接數,僅作用于單 worker 進程。默認是 0,表示沒有限制max_fails:在 fail_timeout 時間段內,最大的失敗次數。當達到最大失敗時,會在 fail_timeout 秒內這臺 server 不允許再次被選擇fail_timeout:單位是秒,默認 10 秒,可以指定一段時間內最大失敗次數 max_fails 以及到達 max_fails 之后該 server 不能訪問的時間

對上游服務使用 keepalive 長連接

Nginx 與上游服務一般是在內網中的,所以開啟 keepalive 后效果后更明顯。

  • 功能:通過復用連接,降低 Nginx 與上游服務器建立、關閉連接的消耗,提升吞吐量的同時降低時延
  • 模塊: ngx_http_upstream_keepalive_module 默認編譯進 Nginx,通過 --without-http_upstream_keepalive_module 移除

對上游服務器的 HTTP 頭部設定

 
 
 
  1. Syntax: keepalive connections; 
  2. Default: — 
  3. Context: upstream 
  4. # 1.15.3 非穩(wěn)定版本新增命令 
  5. Syntax: keepalive_requests number; 
  6. Default: keepalive_requests 100;  
  7. Context: upstream 
  8. Syntax: keepalive_timeout timeout; 
  9. Default: keepalive_timeout 60s;  
  10. Context: upstream 
  11.  
  12. keepalive connections; 

指定上游服務域名解析的 resolver 指令

當使用域名訪問上游服務時,可以指定一個 DNS 解析的地址,還可以設置超時等,這個時候就要用到 resolver 指令。

 
 
 
  1. Syntax: resolver address ... [valid=time] [ipv6=on|off]; 
  2. Default: — 
  3. Context: http, server, location 
  4.  
  5. Syntax: resolver_timeout time; 
  6. Default: resolver_timeout 30s;  
  7. Context: http, server, location 

實戰(zhàn)

下面我起了兩個 Nginx 的進程,一個作為上游服務器,監(jiān)聽 8011 和 8012 端口,另一個作為反向代理向上游服務器發(fā)請求。

上游服務器的配置如下,當請求是到達 8011 端口就返回 8011 server response. ,當請求到達 8012 端口返回 8012 server response. 。

 
 
 
  1. server { 
  2.     listen 8011; 
  3.     default_type text/plain; 
  4.     return 200 '8011 server response.\n'; 
  5.  
  6. server { 
  7.     listen 8012; 
  8.     default_type text/plain; 
  9.     # client_body_in_single_buffer on; 
  10.     return 200 '8012 server response.\n'; 

作為反向代理的 Nginx 服務器配置是這個樣子的:

這里面 8011 端口和 8012 端口的區(qū)別在于 8011 端口設置了權重和對應的參數。

 
 
 
  1. upstream rrups { 
  2.     server 127.0.0.1:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5; 
  3.     server 127.0.0.1:8012; 
  4.     keepalive 32; 
  5.  
  6. server { 
  7.     server_name rrups.ziyang.com; 
  8.     error_log myerror.log info; 
  9.  
  10.     location /{ 
  11.         proxy_pass http://rrups; 
  12.         proxy_http_version 1.1; 
  13.         proxy_set_header Connection ""; 
  14.     } 

兩個 Nginx 都配置好之后,來測試一下:

 
 
 
  1.   nginx curl rrups.ziyang.com 
  2. 8011 server response. 
  3.   nginx curl rrups.ziyang.com 
  4. 8011 server response. 
  5.   nginx curl rrups.ziyang.com 
  6. 8012 server response. 

由于 8011 端口的權重設置的是 2,所以根據 rr 算法,每次都是先兩個連接負載到 8011 端口上然后是 8012 端口。

這一節(jié)講了 rr 負載均衡算法,rr 算法是所有負載均衡算法的基礎,在其他負載均衡算法失效的情況下,Nginx 也會使用 rr 算法進行負載均衡。

負載均衡哈希算法,ip_hash 與 hash 模塊

rr 輪詢算法沒有辦法保證請求由某一臺指定的服務器去處理,只能輪詢處理請求,在 AKF 立方體中只能在 x 軸方向上進行水平擴展。如果基于 z 軸擴展,就可以采用哈希算法保證某一類請求只由特定的服務器處理。

  • 功能:以客戶端的 IP 地址作為 hash 算法的關鍵字,映射到特定的上游服務器中對 IPv4 地址使用前 3 個字節(jié)作為關鍵字,對 IPv6 則使用完整地址可以使用 rr 算法的參數可以基于 realip 模塊修改用于執(zhí)行算法的 IP 地址
  • 模塊: ngx_http_upstream_ip_hash_module ,通過 --without-http_upstream_ip_hash_module 禁用模塊

指令的話比較簡單,就是 ip_hash 出現在 upstream 上下文中。

 
 
 
  1. Syntax: ip_hash; 
  2. Default: — 
  3. Context: upstream 

這里面不得不提到的一個模塊就是 realip 模塊,哈希算法是根據 remote_addr 這個變量的值來進行哈希的,這個變量已經出現了好多次了,可見是多么常用的一個變量。不熟悉的還是到前面Nginx 的 11 個階段 重新復習一下。

還有另外一個模塊 upstream_hash 模塊,這個模塊可以基于任意的關鍵字實現 hash 算法的復雜均衡。

基于任意關鍵字實現 hash 算法的負載均衡:upstream_hash 模塊

  • 功能:通過指定關鍵字作為 hash key,基于 hash 算法映射到特定的上游服務器中關鍵字可以含有變量、字符串可以使用 rr 算法的參數
  • 模塊: ngx_http_upstream_hash_module ,通過 --without-http_upstream_ip_hash_module 禁用模塊

指令的話就是 hash 指令,后面可以跟關鍵字作為 key。

 
 
 
  1. Syntax: hash key [consistent]; 
  2. Default: — 
  3. Context: upstream 

實戰(zhàn)

配置文件如下所示:

 
 
 
  1. log_format  varups  '$upstream_addr $upstream_connect_time $upstream_header_time $upstream_response_time ' 
  2.                         '$upstream_response_length $upstream_bytes_received ' 
  3.                         '$upstream_status $upstream_http_server $upstream_cache_status'; 
  4.  
  5. upstream iphashups { 
  6.     ip_hash; 
  7.     #hash user_$arg_username; 
  8.     server 127.0.0.1:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5; 
  9.     server 127.0.0.1:8012 weight=1; 
  10.  
  11. server { 
  12.     set_real_ip_from  127.0.0.1; 
  13.     real_ip_recursive on; 
  14.     real_ip_header X-Forwarded-For; 
  15.     server_name iphash.ziyang.com; 
  16.     listen 80; 
  17.     error_log myerror.log info; 
  18.     access_log logs/upstream_access.log varups; 
  19.  
  20.     location /{ 
  21.         proxy_pass http://iphashups; 
  22.         proxy_http_version 1.1; 
  23.         proxy_set_header Connection ""; 
  24.     } 

實際驗證一下,會發(fā)現不同的 ip 地址實際上是會被不同的上游服務器處理的,如果是同一個 ip 地址,那么只會被一個上游服務器處理。

 
 
 
  1.   nginx curl -H 'X-Forwarded-For: 10.200.20.20' iphash.ziyang.com 
  2. 8012 server response. 
  3.   nginx curl -H 'X-Forwarded-For: 1.200.20.20' iphash.ziyang.com 
  4. 8011 server response. 

基于 IP 或者基于自定義 key 的 hash 算法有一個嚴重的問題,那就是當上游服務器掛掉的話,Nginx 依然會向這臺服務器發(fā)請求,這是因為,如果負載的不同的服務器上去,可能會得到異常的響應,同時還可能導致大量的路由變更。下面的一致性哈??梢越鉀Q這個問題。

一致性哈希算法:hash 模塊

剛才說了基于 IP 的哈希算法存在一個問題,那就是當有一個上游服務器宕機或者擴容的時候,會引發(fā)大量的路由變更,進而引發(fā)連鎖反應,導致大量緩存失效等問題。那么為什么會造成這種情況呢?

假設我們基于 key 來做 hash,現在有 5 臺上游服務器,如果基于最簡單的 hash 算法對 key 取模,會將 key 和 server 一一對應起來。

當有一臺服務器宕機的時候,就需要重新對 key 進行 hash,最后會發(fā)現所有的對應關系全都失效了,從而會引發(fā)緩存大范圍失效。

而一致性 hash 算法則可以解決這個問題。

一致性哈希算法的原理是,將一個環(huán)分成了 2^32 個區(qū)間范圍,四個節(jié)點將這個環(huán)劃分成為了四個區(qū)間,每個區(qū)間的請求都由對應的節(jié)點去處理。來看看當擴容的時候會發(fā)生什么。

假設這時候發(fā)現 node4 負載過高,因此決定再添加一個節(jié)點進去分擔壓力,那么影響的也只是這個節(jié)點之后的請求,可能會緩存失效,而其他的三個節(jié)點是不會有任何影響的。

這就是一致性 hash 算法的原理,一致性 hash 算法使用也很簡單,只需要將上一節(jié)指令中的參數打開即可:

 
 
 
  1. Syntax: hash key [consistent]; 
  2. Default: — 
  3. Context: upstream 

這里只需要指明 consistent 參數即可。

最少連接數算法

再來看一個最少連接數算法。這個算法顧名思義,它會優(yōu)先選擇連接最少的上游服務器,是由 upstream_least_conn 模塊提供的。

  • 功能:從所有上游服務器中,找出當前并發(fā)連接數最少的一個,將請求轉發(fā)到它如果出現多個最少連接服務器的連接數都是一樣的,使用 rr 算法
  • 模塊: ngx_http_upstream_least_conn_module ,通過 --without-http_upstream_ip_hash_module 禁用模塊

指令的用法也很簡單,直接在 upstream 模塊中開啟 least_conn 指令即可。

 
 
 
  1. Syntax: least_conn; 
  2. Default: — 
  3. Context: upstream 

負載均衡策略對所有 worker 進程生效:upstream_zone 模塊

上面說的所有的負載均衡算法對于 worker 進程來說都是獨立的,每個 worker 進程之間并不互通,這樣在很多時候并不是我們期望的。

我們期望的應該是負載均衡算法對所有的 worker 進程生效。

  • 功能:分配出共享內存,將其他 upstream 模塊定義的負載均衡策略數據、運行時每個上游服務器的狀態(tài)數據存放在共享內存上,以對所 Nginx worker 進程生效
  • 模塊: ngx_http_upstream_zone_module ,通過 --without-http_upstream_ip_hash_module 禁用模塊

一個指令,指定 zone 的名字以及對應的大?。?/p>

 
 
 
  1. Syntax: zone name [size]; 
  2. Default: — 
  3. Context: upstream 

除此之外,各個負載均衡模塊之間是要遵循一定的順序的:

 
 
 
  1. ngx_module_t *ngx_modules[] = { 
  2.     … … 
  3.     &ngx_http_upstream_hash_module, 
  4.     &ngx_http_upstream_ip_hash_module, 
  5.     &ngx_http_upstream_least_conn_module, 
  6.     &ngx_http_upstream_random_module, 
  7.     &ngx_http_upstream_keepalive_module, 
  8.     &ngx_http_upstream_zone_module, 
  9.     … … 
  10. }; 

注意,這個模塊的順序是從上到下執(zhí)行的,而不是我們前面過濾模塊的從下到上。

可以看到,zone 模塊在最后,也就是說,上面各個算法定義的參數和配置,最終 zone 模塊會把這些配置放到共享內存里面生效。

這一節(jié)介紹了負載均衡的原理以及四種負載均衡算法,也可以說是三種,就是輪詢、哈希、最少連接數算法。每一種算法都有各自的應用場景,rr 算法是最基礎的負載均衡算法,在某些情況下其他算法失效的時候,會退化為 rr 算法。

upstream 提供的變量

先來介紹一組不含緩存的變量。

  • upstream_addr上游服務器的 IP 地址,格式為可讀的字符串,例如 127.0.0.1:8012
  • upstream_connect_time與上游服務建立連接消耗的時間,單位為秒,精確到毫秒
  • upstream_header_time:這個接收時間是會影響到 Nginx 的性能的,因為只有接收了 Header 才能決定下一步如何處理接收上游服務發(fā)回響應中 HTTP 頭部所消耗的時間,單位為秒,精確到毫秒
  • upstream_response_time接收完整的上游服務響應所消耗的時間,單位為秒,精確到毫秒
  • upstream_http_頭部從上游服務返回的響應頭部的值
  • upstream_bytes_received從上游服務接收到的響應長度,單位為字節(jié)
  • upstream_response_length從上游服務返回的響應包體長度,單位為字節(jié)
  • upstream_status上游服務返回的 HTTP 響應狀態(tài)碼。如果未連接上,該變量值為 502
  • upstream_cookie_名稱從上游服務發(fā)回的響應頭 Set-Cookie 中取出的 cookie 值
  • upstream_trailer_名稱從上游服務的響應尾部取到的值

來看一下剛才的實戰(zhàn)中我們的例子。

在剛才的負載均衡實戰(zhàn)中有一條日志的配置:

 
 
 
  1. log_format  varups  '$upstream_addr $upstream_connect_time $upstream_header_time $upstream_response_time ' 
  2.                         '$upstream_response_length $upstream_bytes_received ' 
  3.                         '$upstream_status $upstream_http_server $upstream_cache_status'; 

這條配置用到了我們上面提到的很多變量,對應輸出的實際日志長這個樣子:

 
 
 
  1. 127.0.0.1:8012 0.001 0.001 0.001 22 170 200 nginx/1.17.8 - 

大家可以對照日志格式看下分別代表什么意思,這里我就不細說了。

好了,今天這篇文章跟大家介紹了什么是負載均衡,Nginx 主要是通過 upstream 模塊來提供對應的功能的,又介紹了負載均衡的四種算法,最后介紹了 upstream 中提供的變量。下一節(jié)課我們來說一說 Nginx 的反向代理。


新聞標題:一篇文章讓你搞懂Nginx的負載均衡
當前路徑:http://www.5511xx.com/article/djdjhcd.html