Nginx 負載均衡配置誤區

之前有很多朋友問關於 Nginx 的 upstream 模塊中 max_fails 及 fail_timeout,這兩個指令,分別是配置關於負載均衡過程中,對於上游 (後端) 服務器的失敗嘗試次數和不可用時間,很多人不是很理解這兩個參數到底怎麼用,以及具體的含義

先看官網文檔中的描述

官網文檔中解釋 max_fails 是指在 fail_timeout 配置的時間內,服務器通信失敗的次數,默認爲 1,即在 fail_timeout 時間內,1 次請求失敗即不再嘗試,將請求根據 hash 規則,轉發到下一個上游服務

fail_timeout 有兩種含義:

默認是 10s

文字不是很好理解,搭建個實驗環境,環境如下:

nginx 通過 fast-cgi 將 php 請求轉發到 PHP-FPM,這裏 PHP-FPM 服務即上游服務,設置 upstream,負載 PHP-FPM

upstream 按照默認配置,即 max_fails=1,fail_timeout=10

現在通過 tailf 分別監聽兩個 PHP-FPM 日誌

請求 4 次,因爲是默認輪詢的,所以可以看時間,輪詢將請求分發到兩個 PHP-FPM 上游

可以從上面的日誌中看到,按照輪詢規則,下次請求應該落到 PHP-FPM2 上面,接着,關掉 PHP-FPM1,繼續請求

可以看到,PHP-FPM1 肯定是不響應了,PHP-FPM2 正常響應,接着看下 Nginx 日誌

可以看到,關掉 PHP-FPM1 後,發起的請求,本來第二次請求 (17:49:58) 應該分發到 PHP-FPM1 的,然後從 Nginx 錯誤日誌可以看到,連接 PHP-FPM1 失敗,這裏只做了一次失敗嘗試,然後 Nginx 將請求轉發到 PHP-FPM2 處理了

接着將 max_fails 設置爲 2,繼續上面的請求

開啓 PHP-FPM1,繼續請求,兩個負載輪詢轉發請求

接着繼續關掉 PHP-FPM1,連續發起多次請求,查看日誌

所有請求都在 PHP-FPM2 上,看 Nginx 錯誤日誌

兩次輪詢到 PHP-FPM1 的時候,失敗,之後不會再將請求分發到 PHP-FPM1 上游服務

接着,不開啓 PHP-FPM1,繼續發起多次請求,由於默認的 fail_timeout=10,所以在上面的失敗檢測 10s 之後再次發起請求,查看日誌

繼續分發到 PHP-FPM2,接着看 Nginx 錯誤日誌

可以看到,過了 fail_timeout 的時間後,Ngxin 會再次將請求發往 FPM-PHP1 進行嘗試,嘗試 2 次失敗後,在 fail_timeout 時間內,不會再將請求分發,

這裏有幾個誤區:

這個理解是錯誤的,Nginx 只是記錄了失敗的請求到日誌,並將這個請求又轉發到了可用的其他上游服務,知道所有上游都不可用時,纔會返回錯誤狀態

max_fails 是在 fail_timeout 指定的時間內的失敗次數,請求還是按照配置的負載均衡算法來走,並不是第一次請求失敗之後,繼續將這個請求在嘗試一次,達到失敗次數之後,標記爲不可用

當訪問量大的時候,fail_timeout 設置太短,會導致不斷的嘗試與不可用上游的連接,耗費大量的 tcp 資源進行連接

當訪問量大的時候,fail_timeout 設置太長,會導致負載不均衡,有可能會擊穿某個上游後端,達不到負載的效果

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/mCqecyAvzmkJBSoiANsm5A