今天發現一個奇怪的現象,前端請求后端服務多次后會超時一次,經過多次驗證確定是大概10s左右就會超時一次,檢查后端服務,發現其中一個節點已經夯死。
但是我們的nginx負載均衡策略是輪詢機制,按照配置來看應該是每隔一次請求輪詢到失敗的節點時超時一次才對。為什么是每隔10s超時一次呢?
upstream app_server { server 192.168.15.98:9080; server 192.168.15.99:9080; }
原來,Nginx負載均衡的檢查模塊中,有兩個參數:max_fails和fail_timeout。
默認:fail_timeout為10s,max_fails為1次。
原理:Nginx是基於連接探測的,如果發現后端異常,在單位周期為fail_timeout設置的時間中失敗次數達到max_fails次,這個周期次數內,如果后端同一個節點不可用,那么就將把節點標記為不可用,並等待下一個周期(同樣時長為fail_timeout)再一次去請求,判斷是否連接是否成功
這樣就能說明我們發現的現象了。即在10s以內后端失敗了1次【即一次請求超時】,那么這個后端就被標識為不可用了,所以在接下來的10s期間,nginx都會把請求分配給正常的后端【即多次的請求正常】。