基于Nginx的軟件負載均衡實現解讀
(3)Learn
較為的復雜也較為的智能,Nginx會自動監測request和response中的session信息,而且通常需要回話一致性的請求、應答中都會帶有session信息,這和第一種方式相比是不用增加cookie,而是動態學習已有的session。
這種方式需要使用到zone結構,在Nginx中zone都是共享內存,可以在多個worker process中共享數據用的。(不過其他的會話一致性怎么沒用到共享內存區域呢?)
2.2 Session Draining
主要是有需要關閉某些backend以便維護或者升級,這些關鍵性的服務都講求gracefully處理的:就是新的請求不會發送到這個backend上面,而之前分配到這個backend的會話的后續請求還會繼續發送給他,直到這個會話最終完成。
讓某個backend進入draining的狀態,既可以直接修改配置文件,然后按照之前的方式通過向masterprocess發送信號重新加載配置,也可以采用Nginx的on-the-fly配置方式。
2.3 backend健康監測
backend出錯會涉及到兩個參數,max_fails=1 fail_timeout=10s;意味著只要Nginx向backend發送一個請求失敗或者沒有收到一個響應,就認為該backend在接下來的10s是不可用的狀態。
通過周期性地向backend發送特殊的請求,并期盼收到特殊的響應,可以用以確認backend是健康可用的狀態。通過health_check可以做出這個配置。
在使用了health_check功能的時候,一般都需要在backend group開辟一個zone,在共享backend group配置的同時,所有backend的狀態就可以在所有的worker process所共享了,否則每個worker process獨立保存自己的狀態檢查計數和結果,兩種情況會有很大的差異哦。
2.4 通過DNS設置HTTP負載均衡
Nginx的backendgroup中的主機可以配置成域名的形式,如果在域名的后面添加resolve參數,那么Nginx會周期性的解析這個域名,當域名解析的結果發生變化的時候會自動生效而不用重啟。