nginx負(fù)載均衡策略:ip_hash、url_hash
轉(zhuǎn)發(fā):https://blog.csdn.net/dengjiexian123/article/details/53105918
前言:
目前舷胜,許多的web應(yīng)用,或者web接口,都會(huì)在服務(wù)器的入口處卵酪,使用一個(gè)服務(wù)器容器來(lái)監(jiān)聽端口,然后進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)谤碳,例如nginx Apache等溃卡。
服務(wù)器容器對(duì)應(yīng)整個(gè)web服務(wù)有著至關(guān)重要的作用,包括:可以很好的管理服務(wù)進(jìn)程蜒简,進(jìn)行代理瘸羡,對(duì)請(qǐng)求的預(yù)處理,以及負(fù)載均衡搓茬。
今天要討論的重點(diǎn)為在服務(wù)器集群中犹赖,合理使用nginx的hash策略做更有意義的負(fù)載均衡。
概要:
當(dāng)我們的服務(wù)是由一臺(tái)服務(wù)器支撐時(shí)卷仑,就絲毫不存在負(fù)載均衡的概念冷尉。只有當(dāng)服務(wù)由多臺(tái)服務(wù)器(也就是服務(wù)器集群)支撐時(shí),才會(huì)使用到負(fù)載均衡系枪。
負(fù)載均衡顧名思義雀哨,是一種策略,用于防止一臺(tái)服務(wù)器過(guò)載,而其他服務(wù)器閑置情況發(fā)生的策略雾棺。通過(guò)該策略可以使得提供相同服務(wù)的服務(wù)器負(fù)載基本相同膊夹。說(shuō)得直白一點(diǎn),就是當(dāng)客戶端發(fā)起一個(gè)請(qǐng)求之后捌浩,負(fù)載均衡會(huì)通過(guò)預(yù)先設(shè)定好的策略將該請(qǐng)求轉(zhuǎn)發(fā)給上游的一臺(tái)服務(wù)器進(jìn)行處理放刨。
如圖所示:
負(fù)載均衡是一個(gè)很成熟的技術(shù),其中對(duì)后端服務(wù)器進(jìn)行輪詢(默認(rèn))尸饺;通過(guò)客戶端請(qǐng)求IP進(jìn)行hash进统;對(duì)后端服務(wù)器指定權(quán)重等,是較為常見的負(fù)載均衡策略浪听。這里不再贅述螟碎。
對(duì)服務(wù)盲目的采用負(fù)載均衡策略,是不太合理的迹栓。負(fù)載均衡默認(rèn)情況下是輪詢策略掉分,這在一些場(chǎng)景下并不高效。
更有意義的負(fù)載均衡:
今天講解的重點(diǎn)是克伊,兩種常見的負(fù)載均衡hash策略酥郭,以及對(duì)應(yīng)的使用場(chǎng)景。
1愿吹、ip_hash(通過(guò)客戶端請(qǐng)求ip進(jìn)行hash不从,再通過(guò)hash值選擇后端server):
當(dāng)你服務(wù)端的一個(gè)特定url路徑會(huì)被同一個(gè)用戶連續(xù)訪問(wèn)時(shí),如果負(fù)載均衡策略還是輪詢的話犁跪,那該用戶的多次訪問(wèn)會(huì)被打到各臺(tái)服務(wù)器上椿息,這顯然并不高效(會(huì)建立多次http鏈接等問(wèn)題)。甚至考慮一種極端情況耘拇,用戶需要分片上傳文件到服務(wù)器下撵颊,然后再由服務(wù)器將分片合并宇攻,這時(shí)如果用戶的請(qǐng)求到達(dá)了不同的服務(wù)器惫叛,那么分片將存儲(chǔ)于不同的服務(wù)器目錄中,導(dǎo)致無(wú)法將分片合并逞刷。所以嘉涌,此類場(chǎng)景可以考慮采用nginx提供的ip_hash策略。既能滿足每個(gè)用戶請(qǐng)求到同一臺(tái)服務(wù)器夸浅,又能滿足不同用戶之間負(fù)載均衡仑最。
配置代碼如下:
upstream backend{ ip_hash; server 192.168.128.1:8080 ; server 192.168.128.2:8080 ; server 192.168.128.3:8080 down; server 192.168.128.4:8080 down; }server { listen 8081; server_name test.csdn.net; root /home/system/test.csdn.net/test; location ^~ /Upload/upload { proxy_pass http://backend; } }
上述是一個(gè)極簡(jiǎn)的監(jiān)聽8081端口的的nginx服務(wù),其中當(dāng)請(qǐng)求url 為/Upload/upload時(shí)帆喇,會(huì)走ip_hash策略; upstream是nginx的負(fù)載均衡模塊警医,此處,配置了策略為ip_hash,參與負(fù)載均衡的機(jī)器有四臺(tái)预皇,其中后兩臺(tái)末尾添加了down關(guān)鍵字侈玄,表示下線的意思。
2吟温、url_hash(通過(guò)請(qǐng)求url進(jìn)行hash序仙,再通過(guò)hash值選擇后端server):
一般來(lái)講,要用到urlhash鲁豪,是要配合緩存命中來(lái)使用潘悼。舉一個(gè)我遇到的實(shí)例:有一個(gè)服務(wù)器集群A,需要對(duì)外提供文件下載爬橡,由于文件上傳量巨大治唤,沒法存儲(chǔ)到服務(wù)器磁盤中,所以用到了第三方云存儲(chǔ)來(lái)做文件存儲(chǔ)堤尾。服務(wù)器集群A收到客戶端請(qǐng)求之后肝劲,需要從云存儲(chǔ)中下載文件然后返回,為了省去不必要的網(wǎng)絡(luò)帶寬和下載耗時(shí)郭宝,在服務(wù)器集群A上做了一層臨時(shí)緩存(緩存一個(gè)月)辞槐。由于是服務(wù)器集群,所以同一個(gè)資源多次請(qǐng)求粘室,可能會(huì)到達(dá)不同的服務(wù)器上榄檬,導(dǎo)致不必要的多次下載,緩存命中率不高衔统,以及一些資源時(shí)間的浪費(fèi)鹿榜。在此類場(chǎng)景下,為了使得緩存命中率提高锦爵,很適合使用url_hash策略舱殿,同一個(gè)url(也就是同一個(gè)資源請(qǐng)求)會(huì)到達(dá)同一臺(tái)機(jī)器,一旦緩存住了資源险掀,再此收到請(qǐng)求沪袭,就可以從緩存中讀取,既減少了帶寬樟氢,也減少的下載時(shí)間冈绊。
配置代碼如下:
upstream somestream { hash $request_uri; server 192.168.244.1:8080; server 192.168.244.2:8080; server 192.168.244.3:8080; server 192.168.244.4:8080; }server { listen 8081 default; server_name test.csdn.net; charset utf-8; location /get { proxy_pass http://somestream; } }
上述同樣也是一個(gè)極簡(jiǎn)的監(jiān)聽8081端口的nginx服務(wù),當(dāng)請(qǐng)求url為/get時(shí)埠啃,會(huì)走url_hash死宣;同樣配置了upstream模塊,hash $request_uri表明了是按照url規(guī)則進(jìn)行hash策略碴开。
總結(jié):
以上就是本文要介紹的全部?jī)?nèi)容毅该,本文側(cè)重講解了ip_hash和url_hash的使用場(chǎng)景和基本配置博秫,另外,在進(jìn)行nginx server 配置時(shí)眶掌,可以靈活一些台盯,不同的location采用不同的策略,可以使得服務(wù)策略更加的合理畏线。希望此文能為各位帶來(lái)些許幫助静盅。
</article>