1. 程式人生 > >nginx upstream failover 容錯機制

nginx upstream failover 容錯機制

1.   摘要

(1)       結論

詳細描述了nginx記錄失效節點的6種狀態(time out、connect refuse、500、502、503、504,後四項5XX需要配置proxy_next_upstream中的狀態才可以生效)、失效節點的觸發條件和節點的恢復條件、所有節點失效後nginx會進行恢復並進行重新監聽。

(2)       Nginx 負載均衡方式介紹

Nginx的負載均衡方式一共有5種:rr(輪詢模式)、ip_hash、fair、url_hash,  weight(加權)。

(3)       Ngxin負載均衡和相關反向代理配置內容

Nginx負載均衡和與容錯相關的反向代理的配置。

(4)       獲取後端流程

後端server的自動容錯流程圖。

(5)       測試環境和測試結果

針對幾種錯誤方式進行自動容錯測試。

2.   結論

(1)       nginx 判斷節點失效狀態

Nginx 預設判斷失敗節點狀態以connect refuse和time out狀態為準,不以HTTP錯誤狀態進行判斷失敗,因為HTTP只要能返回狀態說明該節點還可以正常連線,所以nginx判斷其還是存活狀態;除非添加了proxy_next_upstream指令設定對404、502、503、504、500和time out等錯誤進行轉到備機處理,在next_upstream過程中,會對fails進行累加,如果備用機處理還是錯誤則直接返回錯誤資訊(但404不進行記錄到錯誤數,如果不配置錯誤狀態也不對其進行錯誤狀態記錄),綜述,nginx記錄錯誤數量只記錄timeout 、connect refuse、502、500、503、504這6種狀態,timeout和connect refuse是永遠被記錄錯誤狀態,而502、500、503、504只有在配置proxy_next_upstream後nginx才會記錄這4種HTTP錯誤到fails中,當fails大於等於max_fails時,則該節點失效;

(2)       nginx 處理節點失效和恢復的觸發條件

nginx可以通過設定max_fails(最大嘗試失敗次數)和fail_timeout(失效時間,在到達最大嘗試失敗次數後,在fail_timeout的時間範圍內節點被置為失效,除非所有節點都失效,否則該時間內,節點不進行恢復)對節點失敗的嘗試次數和失效時間進行設定。

當超過最大嘗試次數或失效時間未超過配置失效時間,則nginx會對節點狀會置為失效狀態,nginx不對該後端進行連線,直到超過失效時間或者所有節點都失效後,該節點重新置為有效,重新探測。也就是在下個fail_timeout中,原來被判定為down的後端server是不可能得到接收資料機會的,即使它恢復過來了!然後再過一個fail_timeout,nginx 會嘗試去通過傳送資料請求到這個down的後端伺服器上去測試它是否起來沒有。

(3)       所有節點失效後nginx將重新恢復所有節點進行探測

如果探測所有節點均失效,備機也為失效時,那麼nginx會對所有節點恢復為有效,重新嘗試探測有效節點,如果探測到有效節點則返回正確節點內容,如果還是全部錯誤,那麼繼續探測下去,當沒有正確資訊時,節點失效時預設返回狀態為502,但是下次訪問節點時會繼續探測正確節點,直到找到正確的為止。

3.   nginx負載均衡

Nginx的負載均衡方式一共有4種:rr(輪詢模式)、ip_hash、fair、url_hash;

Nginx自帶的2種負載均衡為rr和ip_hash,fair和url_hash為第三方的外掛,nginx在不配置負載均衡的模式下,預設採用rr負載均衡模式。

l  RR負載均衡模式:

每個請求按時間順序逐一分配到不同的後端伺服器,如果超過了最大失敗次數後(max_fails,預設1),在失效時間內(fail_timeout,預設10秒),該節點失效權重變為0,超過失效時間後,則恢復正常,或者全部節點都為down後,那麼將所有節點都恢復為有效繼續探測,一般來說rr可以根據權重來進行均勻分配。

l  Ip_hash負載均衡模式:

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題,但是ip_hash會造成負載不均,有的服務請求接受多,有的服務請求接受少,所以不建議採用ip_hash模式,session共享問題可用後端服務的session共享代替nginx的ip_hash。

l  Fair(第三方)負載均衡模式:

按後端伺服器的響應時間來分配請求,響應時間短的優先分配。

l  url_hash(第三方)負載均衡模式:

和ip_hash演算法類似,是對每個請求按url的hash結果分配,使每個URL定向到一個同 一個後端伺服器,但是也會造成分配不均的問題,這種模式後端伺服器為快取時比較好。

4.   Nginx 負載均衡配置

Nginx的負載均衡採用的是upstream模組

其中預設的採用的負載均衡模式是輪詢模式rr(round_robin),具體配置如下:

1)    指令:

ip_hash

語法:ip_hash 
預設值:none 
使用欄位:upstream 
這個指令將基於客戶端連線的IP地址來分發請求。
雜湊的關鍵字是客戶端的C類網路地址,這個功能將保證這個客戶端請求總是被轉發到一臺伺服器上,但是如果這臺伺服器不可用,那麼請求將轉發到另外的伺服器上,這將保證某個客戶端有很大概率總是連線到一臺伺服器。
無法將權重(weight)與ip_hash聯合使用來分發連線。如果有某臺伺服器不可用,你必須標記其為“down”,如下例:

upstream backend {

  ip_hash;

  server   backend1.example.com;

  server   backend2.example.com;

  server   backend3.example.com  down;

  server   backend4.example.com;

}

server

語法:server name [parameters] 
預設值:none 
使用欄位:upstream 
指定後端伺服器的名稱和一些引數,可以使用域名,IP,埠,或者unix socket。如果指定為域名,則首先將其解析為IP。

l  weight = NUMBER - 設定伺服器權重,預設為1。

l  max_fails = NUMBER - 在一定時間內(這個時間在fail_timeout引數中設定)檢查這個伺服器是否可用時產生的最多失敗請求數,預設為1,將其設定為0可以關閉檢查,這些錯誤在proxy_next_upstream或fastcgi_next_upstream(404錯誤不會使max_fails增加)中定義。

l  fail_timeout = TIME - 在這個時間內產生了max_fails所設定大小的失敗嘗試連線請求後這個伺服器可能不可用,同樣它指定了伺服器不可用的時間(在下一次嘗試連線請求發起之前),預設為10秒,fail_timeout與前端響應時間沒有直接關係,不過可以使用proxy_connect_timeout和proxy_read_timeout來控制。

l  down - 標記伺服器處於離線狀態,通常和ip_hash一起使用。

l  backup - (0.6.7或更高)如果所有的非備份伺服器都宕機或繁忙,則使用本伺服器(無法和ip_hash指令搭配使用)。

示例配置

upstream  backend  {

  server   backend1.example.com    weight=5;

  server   127.0.0.1:8080          max_fails=3  fail_timeout=30s;

  server   unix:/tmp/backend3;

}

注意:如果你只使用一臺上游伺服器,nginx將設定一個內建變數為1,即max_fails和fail_timeout引數不會被處理。
結果:如果nginx不能連線到上游,請求將丟失。
解決:使用多臺上游伺服器。

upstream

語法:upstream name { … } 
預設值:none 
使用欄位:http 
這個欄位設定一群伺服器,可以將這個欄位放在proxy_pass和fastcgi_pass指令中作為一個單獨的實體,它們可以可以是監聽不同埠的伺服器,並且也可以是同時監聽TCP和Unix socket的伺服器。
伺服器可以指定不同的權重,預設為1。
示例配置

upstream backend {

  server backend1.example.com weight=5;

  server 127.0.0.1:8080       max_fails=3  fail_timeout=30s;

  server unix:/tmp/backend3;

}

請求將按照輪詢的方式分發到後端伺服器,但同時也會考慮權重。
在上面的例子中如果每次發生7個請求,5個請求將被髮送到backend1.example.com,其他兩臺將分別得到一個請求,如果有一臺伺服器不可用,那麼請求將被轉發到下一臺伺服器,直到所有的伺服器檢查都通過。如果所有的伺服器都無法通過檢查,那麼將返回給客戶端最後一臺工作的伺服器產生的結果。

2)    變數

版本0.5.18以後,可以通過log_module中的變數來記錄日誌:

log_format timing '$remote_addr - $remote_user [$time_local]  $request '

  'upstream_response_time $upstream_response_time '

  'msec $msec request_time $request_time';

log_format up_head '$remote_addr - $remote_user [$time_local]  $request '

  'upstream_http_content_type $upstream_http_content_type';

l  $upstream_addr

前端伺服器處理請求的伺服器地址

l  $upstream_cache_status

0.8.3版本中其值可能為:

MISS 

EXPIRED - expired。請求被傳送到後端。

UPDATING - expired。由於proxy/fastcgi_cache_use_stale正在更新,將使用舊的應答。

STALE - expired。由於proxy/fastcgi_cache_use_stale,後端將得到過期的應答。

HIT

l  $upstream_status

前端伺服器的響應狀態。

l  $upstream_response_time

前端伺服器的應答時間,精確到毫秒,不同的應答以逗號和冒號分開。

l  $upstream_http_$HEADER

隨意的HTTP協議頭,如:$upstream_http_host

l  $upstream_http_host

3)    Proxy指令:

proxy_next_upstream

語法:proxy_next_upstream

 [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off] 
預設值:proxy_next_upstream error timeout 
使用欄位:http, server, location 
確定在何種情況下請求將轉發到下一個伺服器:

error - 在連線到一個伺服器,傳送一個請求,或者讀取應答時發生錯誤。

timeout - 在連線到伺服器,轉發請求或者讀取應答時發生超時。

invalid_header - 伺服器返回空的或者錯誤的應答。

http_500 - 伺服器返回500程式碼。

http_502 - 伺服器返回502程式碼。

http_503 - 伺服器返回503程式碼。

http_504 - 伺服器返回504程式碼。

http_404 - 伺服器返回404程式碼。

off - 禁止轉發請求到下一臺伺服器。

轉發請求只發生在沒有資料傳遞到客戶端的過程中。

其中記錄到nginx後端錯誤數量的有500、502、503、504、timeout,404不記錄錯誤。

proxy_connect_timeout

語法:proxy_connect_timeout timeout_in_seconds 
預設值:proxy_connect_timeout 60s 
使用欄位:http, server, location 
指定一個連線到代理伺服器的超時時間,單位為秒,需要注意的是這個時間最好不要超過75秒。
這個時間並不是指伺服器傳回頁面的時間(這個時間由proxy_read_timeout宣告)。如果你的前端代理伺服器是正常執行的,但是遇到一些狀況(例如沒有足夠的執行緒去處理請求,請求將被放在一個連線池中延遲處理),那麼這個宣告無助於伺服器去建立連線。
可以通過指定時間單位以免引起混亂,支援的時間單位有”s”(秒), “ms”(毫秒), “y”(年), “M”(月), “w”(周), “d”(日), “h”(小時),和 “m”(分鐘)。
這個值不能大於597小時。

proxy_read_timeout

語法:proxy_read_timeout time 
預設值:proxy_read_timeout 60s 
使用欄位:http, server, location 
決定讀取後端伺服器應答的超時時間,單位為秒,它決定nginx將等待多久時間來取得一個請求的應答。超時時間是指完成了兩次握手後並且狀態為established的超時時間。
相對於proxy_connect_timeout,這個時間可以撲捉到一臺將你的連線放入連線池延遲處理並且沒有資料傳送的伺服器,注意不要將此值設定太低,某些情況下代理伺服器將花很長的時間來獲得頁面應答(例如如當接收一個需要很多計算的報表時),當然你可以在不同的location裡面設定不同的值。
可以通過指定時間單位以免引起混亂,支援的時間單位有”s”(秒), “ms”(毫秒), “y”(年), “M”(月), “w”(周), “d”(日), “h”(小時),和 “m”(分鐘)。
這個值不能大於597小時。

proxy_send_timeout

語法:proxy_send_timeout seconds 
預設值:proxy_send_timeout 60s 
使用欄位:http, server, location 
設定代理伺服器轉發請求的超時時間,單位為秒,同樣指完成兩次握手後的時間,如果超過這個時間代理伺服器沒有資料轉發到被代理伺服器,nginx將關閉連線。
可以通過指定時間單位以免引起混亂,支援的時間單位有”s”(秒), “ms”(毫秒), “y”(年), “M”(月), “w”(周), “d”(日), “h”(小時),和 “m”(分鐘)。
這個值不能大於597小時。

5.   獲取後端流程

GET_RR_PEER: 通過RR演算法獲取後端流程

K:是判斷peer是否宕機和判斷失效狀態演算法

FAIL:嘗試次數用盡有,跳轉到失敗流程,如果有備機,備機再嘗試監聽,如果監聽失敗則返回NGX_BUSY,成功則返回當前狀態。

6.   測試環境

作業系統:centos5.6

Cpu:16核

記憶體:32g

Web 伺服器:nginx

Web 應用伺服器:tomcat(2臺)

7.   測試結果

l  設定tomcat1超時時間,造成超時狀態(總有一臺server為有效狀態):

Tomcat1的connectionTimeout 設定為-1,永遠超時,nginx設定tomcat1和tomcat2權重為10,tomcat1的max_fails為10,fail_timeout=120;在連線tomcat1的10次後,返回給nginx為10次超時,ngxin判斷tomcat1為失效,然後將tomcat1超時時間恢復為1000重新啟動tomcat1,在這段時間內nginx判斷tomcat1還是失效狀態,所以在2分鐘後,nginx繼續監聽到tomcat1正常後,那麼nginx會將tomcat1判斷為有效,將連線繼續均勻分配到2個tomcat上。

l  設定tomcat1連線數量,造成超時狀態(總有一臺server為有效狀態):

Tomcat1的執行緒數量設定為1,nginx設定tomcat1和tomcat2權重為10,tomcat1的max_fails為10,fail_timeout=120;在連線tomcat1超過執行緒接受數量後,tomcat1會返回超時狀態,在返回給nginx10次超時狀態後,ngxin判斷tomcat1為失效,然後將tomcat執行緒數量恢復為700,重新啟動tomcat1,在這段時間內nginx判斷tomcat1還是失效狀態,超過2分鐘失效後,nginx繼續監聽到tomcat1正常後,那麼nginx會將tomcat1判斷為有效,將連線繼續均勻分配到2個tomcat上。

l  設定tomcat1關閉,造成拒絕狀態(總有一臺server為有效狀態):

Tomcat1為關閉,nginx設定tomcat1和tomcat2權重為10,tomcat1的max_fails為10,fail_timeout=120;在連線tomcat1的10次後,nginx收到tomcat1返回connect refuse狀態,ngxin判斷tomcat1為失效,然後重新啟動tomcat1,在這段時間內nginx判斷tomcat1還是失效狀態,超過2分鐘失效後,nginx繼續監聽到tomcat1正常後,那麼nginx會將tomcat1判斷為有效,將連線繼續均勻分配到2個tomcat上。

l  設定tomcat1在nginx1標記失效,tomcat1恢復正常,在nginx失效範圍內,將全部服務變為失效,然後重啟:

Tomcat1為關閉,nginx設定tomcat1和tomcat2權重為10,tomcat1的max_fails為10,fail_timeout=120;在連線tomcat1的10次後,nginx收到tomcat1返回connect refuse狀態,ngxin判斷tomcat1為失效,然後重新啟動tomcat1,在這段時間內nginx判斷tomcat1還是失效狀態,然後將tomcat2關閉,然後重啟tomcat2,由於所有服務均失效,所以nginx 將所有服務重新置為有效進行監聽,然後將2連線均勻分佈到了tomcat1和tomcat2上。

l  http錯誤狀態,nginx是否記錄失效:

nginx設定tomcat1和tomcat2權重為10,tomcat1的max_fails為10,fail_timeout=120;配置proxy_next_upstream 500、404、502、503、504、timeout後,當HTTP狀態為500、502、503、504(timeout和refuse預設是記錄失效的)時,nginx會判斷該次請求為失敗記錄失敗狀態,其他所有HTTP均不記錄失敗。

相關推薦

nginx upstream failover 容錯機制

1.   摘要 (1)       結論 詳細描述了nginx記錄失效節點的6種狀態(time out、connect refuse、500、502、503、504,後四項5XX需要配置proxy_next_upstream中的狀態才可以生效)、失效節點的觸發條件和節點的恢

nginx upstream 容錯機制

soc log 2種 情況 分開 upstream erro 服務器的響應 下一個 轉自:http://saiyaren.iteye.com/blog/1914865 1. 摘要 (1) 結論 詳細描述了nginx記錄失效節點的6種狀態(time out、c

Dubbo服務叢集,常見容錯機制failover ,failsafe,failfase ,failback,forking

http://blog.csdn.net/hongweigg/article/details/52925920 http://m.blog.csdn.net/article/details?id=51137364 <dubbo:reference cluster="

nginx基本配置與引數說明以及Nginx中的upstream輪詢機制介紹

一.nginx簡介         Nginx (發音為[engine x])專為效能優化而開發,其最知名的優點是它的穩定性和低系統資源消耗,以及對併發連線的高處理能力(單臺物理伺服器可支援30000~50000個併發連線), 是一個高效能的 HTTP 和反向代理伺服器,也

Storm容錯機制Acker詳解和實戰案例

storm acker 失敗重發 可靠性Storm中有個特殊的Executor叫acker,他們負責跟蹤spout發出的每一個Tuple的Tuple樹。當acker發現一個Tuple樹已經處理完成了,它會告訴框架回調Spout的ack(),否則回調Spout的fail()。Acker的跟蹤算法是Storm的主

架構師之路--搜索業務和技術介紹及容錯機制

朋友 單節點 adb 一致性 公司 一個 memcache 消息通知 包括  今天和搜索部門一起做了一下MQ的遷移,順便交流一下業務和技術。發現現在90後小夥都挺不錯。我是指能力和探究心。我家男孩,不招女婿。   在前面的文章中也提到,我們有媒資庫(樂視視頻音頻本身內容)

keepalived+nginx-upstream部署高可用反向代理

proxy route 服務器 宕機 127.0.0.1 trac 訪問 代理 _id 實驗拓撲 實驗要求 兩個web server提供httpd服務,ip地址分別是172.18.27.201、202,掩碼是16 兩個nginx proxy提供高可用反向代理,ip地

centos nginx upstream nextserver的寫法一例

centos nginx upstream nextserverhttp { proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404; proxy_connect_timeout 60s; proxy_rea

nginx upstream 常用的幾種調度方式

均衡 gin 字節 默認 結果 根據 主機 upstream 指定 nginx可以根據客戶IP進行負載均衡,在upstream裏設置ip_hash,以可以對同一個C類地址段的客戶端選擇同一個後端服務器,除非那個後端服務器宕了才會換一個.C類地址:C類地址第1字節、第2字節和

Nginx upstream的5種權重分配方式分享

weight 一個 當前 共享 結果 壓力 宕機 clas 機器 Nginx負載均衡的分發方式有4種: 1.輪詢,默認采取此方式,Nginx會按照請求時間的先後順序進行輪詢分發,若某臺Web Server宕機,Nginx自動將其摘掉。 2.

Hadoop(七)HDFS容錯機制詳解

技術 分布式文件系 設計 1.3 1.5 不足 故障類型 sys 數據恢復 前言   HDFS(Hadoop Distributed File System)是一個分布式文件系統。它具有高容錯性並提供了高吞吐量的數據訪問,非常適合大規模數據集上的應用,它提供了一個高度容錯

nginx用反向代理機制解決跨域的問題

nginx nginx跨域 nginx反向代理 甘兵 什麽是跨域?使用js獲取數據時,涉及到的兩個url只要協議、域名、端口有任何一個不同,都被當作是不同的域,相互訪問就會有跨域問題。跨域,指的是瀏覽器不能執行其他網站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制。所謂同源是指,

【Storm篇】--Storm 容錯機制

其他 同時 strong 都得 keep idt 重新啟動 font pos 一、前述 Storm容錯機制相比其他的大數據組件做的非常不錯。 二、具體原因 結合Storm集群架構圖: 我們的程序提交流程如下: 其中各個組件的作用如下: Nimbus資源調度任務分

Nginx Upstream模塊

com 地址 body ash one log tmp pro number upstream模塊 原文鏈接:http://nginx.org/en/docs/http/ngx_http_upstream_module.html upstream 定義一組Server去監

Elasticsearch 橫向擴容以及容錯機制

技術分享 har png strong last replica pri arch 資源 寫在前面的話:讀書破萬卷,編碼如有神-------------------------------------------------------------------- 參考內容:

Elasticseach的橫向擴展、容錯機制(3)

ja1、橫向擴容過程,如何超出擴容極限,以及如何提升容錯性(1)primary&replica自動負載均衡,6個shard,3 primary,3 replica(2)每個node有更少的shard,IO/CPU/Memory資源給每個shard分配更多,每個shard性能更好(3)擴容的極限,6個s

Storm的容錯機制

信息 完整 提交 nimbus storm 監控 zookeepe 將在 次數 任務級容錯 Bolt任務crash引起的消息未被應答。此時,acker中所有與此Bolt任務關聯的消息都會因為超時而失敗,對應的Spout的fail方法將被調用。 acker任務失敗。如果ack

Nginx-upstream模塊

bubuko 模塊使用 模塊 png com alt http upstream ima upstream模塊使用的是輪詢算法 Nginx-upstream模塊

Storm Ack容錯機制

分享圖片 com tor ima ack info alt image mage Storm Ack容錯機制

spark筆記之RDD容錯機制之checkpoint

原理 chain for 機制 方式 方法 相對 例如 contex 10.checkpoint是什麽(1)、Spark 在生產環境下經常會面臨transformation的RDD非常多(例如一個Job中包含1萬個RDD)或者具體transformation的RDD本身計算