Syntax: hash key [consistent];Default: —Context: upstream實(shí)戰(zhàn)配置文件如下所示:
log_formatvarups'$upstream_addr $upstream_connect_time $upstream_header_time $upstream_response_time ''$upstream_response_length $upstream_bytes_received ''$upstream_status $upstream_http_server $upstream_cache_status';upstream iphashups {ip_hash;#hash user_$arg_username;server 127.0.0.1:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server 127.0.0.1:8012 weight=1;}server {set_real_ip_from127.0.0.1;real_ip_recursive on;real_ip_header X-Forwarded-For;server_name iphash.ziyang.com;listen 80;error_log myerror.log info;access_log logs/upstream_access.log varups;location /{proxy_pass http://iphashups;proxy_http_version 1.1;proxy_set_header Connection "";}}實(shí)際驗(yàn)證一下,會(huì)發(fā)現(xiàn)不同的 ip 地址實(shí)際上是會(huì)被不同的上游服務(wù)器處理的,如果是同一個(gè) ip 地址,那么只會(huì)被一個(gè)上游服務(wù)器處理 。
?nginx curl -H 'X-Forwarded-For: 10.200.20.20' iphash.ziyang.com8012 server response.?nginx curl -H 'X-Forwarded-For: 1.200.20.20' iphash.ziyang.com8011 server response.基于 IP 或者基于自定義 key 的 hash 算法有一個(gè)嚴(yán)重的問(wèn)題,那就是當(dāng)上游服務(wù)器掛掉的話,Nginx 依然會(huì)向這臺(tái)服務(wù)器發(fā)請(qǐng)求,這是因?yàn)?,如果?fù)載的不同的服務(wù)器上去,可能會(huì)得到異常的響應(yīng),同時(shí)還可能導(dǎo)致大量的路由變更 。下面的一致性哈??梢越鉀Q這個(gè)問(wèn)題 。
一致性哈希算法:hash 模塊剛才說(shuō)了基于 IP 的哈希算法存在一個(gè)問(wèn)題,那就是當(dāng)有一個(gè)上游服務(wù)器宕機(jī)或者擴(kuò)容的時(shí)候,會(huì)引發(fā)大量的路由變更,進(jìn)而引發(fā)連鎖反應(yīng),導(dǎo)致大量緩存失效等問(wèn)題 。那么為什么會(huì)造成這種情況呢?
假設(shè)我們基于 key 來(lái)做 hash,現(xiàn)在有 5 臺(tái)上游服務(wù)器,如果基于最簡(jiǎn)單的 hash 算法對(duì) key 取模,會(huì)將 key 和 server 一一對(duì)應(yīng)起來(lái) 。當(dāng)有一臺(tái)服務(wù)器宕機(jī)的時(shí)候,就需要重新對(duì) key 進(jìn)行 hash,最后會(huì)發(fā)現(xiàn)所有的對(duì)應(yīng)關(guān)系全都失效了,從而會(huì)引發(fā)緩存大范圍失效 。而一致性 hash 算法則可以解決這個(gè)問(wèn)題 。
一致性哈希算法的原理是,將一個(gè)環(huán)分成了 2^32 個(gè)區(qū)間范圍,四個(gè)節(jié)點(diǎn)將這個(gè)環(huán)劃分成為了四個(gè)區(qū)間,每個(gè)區(qū)間的請(qǐng)求都由對(duì)應(yīng)的節(jié)點(diǎn)去處理 。來(lái)看看當(dāng)擴(kuò)容的時(shí)候會(huì)發(fā)生什么 。
假設(shè)這時(shí)候發(fā)現(xiàn) node4 負(fù)載過(guò)高,因此決定再添加一個(gè)節(jié)點(diǎn)進(jìn)去分擔(dān)壓力,那么影響的也只是這個(gè)節(jié)點(diǎn)之后的請(qǐng)求,可能會(huì)緩存失效,而其他的三個(gè)節(jié)點(diǎn)是不會(huì)有任何影響的 。
這就是一致性 hash 算法的原理,一致性 hash 算法使用也很簡(jiǎn)單,只需要將上一節(jié)指令中的參數(shù)打開(kāi)即可:
Syntax: hash key [consistent];Default: —Context: upstream這里只需要指明 consistent 參數(shù)即可 。
最少連接數(shù)算法再來(lái)看一個(gè)最少連接數(shù)算法 。這個(gè)算法顧名思義,它會(huì)優(yōu)先選擇連接最少的上游服務(wù)器,是由 upstream_least_conn 模塊提供的 。
功能:從所有上游服務(wù)器中,找出當(dāng)前并發(fā)連接數(shù)最少的一個(gè),將請(qǐng)求轉(zhuǎn)發(fā)到它如果出現(xiàn)多個(gè)最少連接服務(wù)器的連接數(shù)都是一樣的,使用 rr 算法模塊: ngx_http_upstream_least_conn_module ,通過(guò) –without-http_upstream_ip_hash_module 禁用模塊指令的用法也很簡(jiǎn)單,直接在 upstream 模塊中開(kāi)啟 least_conn 指令即可 。
Syntax: least_conn;Default: —Context: upstream負(fù)載均衡策略對(duì)所有 worker 進(jìn)程生效:upstream_zone 模塊上面說(shuō)的所有的負(fù)載均衡算法對(duì)于 worker 進(jìn)程來(lái)說(shuō)都是獨(dú)立的,每個(gè) worker 進(jìn)程之間并不互通,這樣在很多時(shí)候并不是我們期望的 。
我們期望的應(yīng)該是負(fù)載均衡算法對(duì)所有的 worker 進(jìn)程生效 。
功能:分配出共享內(nèi)存,將其他 upstream 模塊定義的負(fù)載均衡策略數(shù)據(jù)、運(yùn)行時(shí)每個(gè)上游服務(wù)器的狀態(tài)數(shù)據(jù)存放在共享內(nèi)存上,以對(duì)所 Nginx worker 進(jìn)程生效模塊: ngx_http_upstream_zone_module ,通過(guò) –without-http_upstream_ip_hash_module 禁用模塊一個(gè)指令,指定 zone 的名字以及對(duì)應(yīng)的大?。?/p>
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 交互過(guò)程及區(qū)別介紹 socket服務(wù)端和客戶端的區(qū)別
- 簡(jiǎn)介后備式ups工作原理和優(yōu)勢(shì) 后備式ups的性能特點(diǎn)有哪些
- 分析這4個(gè)本質(zhì)區(qū)別 筆記本睡眠和休眠的區(qū)別
- 網(wǎng)絡(luò)協(xié)議基礎(chǔ)知識(shí)應(yīng)用 常見(jiàn)的網(wǎng)絡(luò)協(xié)議有哪三種
- mysql數(shù)據(jù)庫(kù)特點(diǎn)和優(yōu)勢(shì)介紹 mysql特點(diǎn)有哪些
- 十二星座中和這些星座異地戀成功率高
- 金牛男巨蟹女誰(shuí)主動(dòng)
- 天絲麻面料的優(yōu)缺點(diǎn)及洗滌方法 天絲麻面料的優(yōu)缺點(diǎn)和洗滌方法
- 巨蟹座男和射手座女相配嗎
- 雙子男和雙魚(yú)女誰(shuí)虐誰(shuí)
