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