无码人妻精品一区二区蜜桃在线看,人妻无码中文字幕免费视频蜜桃,无码人妻精品一区二区蜜桃色欲,蜜桃AV色偷偷AV老熟女,久久人妻少妇嫩草AV蜜桃漫画,又爽又黄A片免费观看直播蜜桃,欧美性猛交XXXX乱大交蜜桃,色欲AV永久无码精品无码蜜桃,蜜桃一区二区三区,WWW.17C嫩嫩草色视频蜜桃,亚洲精品久久久蜜桃

基于 Nginx 的(de)軟件(jiàn)負載均衡實現(xiàn)解

2017-08-29 12:49

負載均衡在服務端開(kāi)發中算(suàn₹∞✘¥)是(shì)一(yī)個(gè)比較重要(yào)的(dα§‍e)特性。因為(wèi)Nginx除了(lαΩγ‍e)作(zuò)為(wèi)常規的(de)Web服務器(qì)外(wài),還↕☆(hái)會(huì)被大(dà)規模的(de)用(yòng)←→​于反向代理(lǐ)前端,因為(wèi)Nginx的(de)異≤↑•步框架可(kě)以處理(lǐ)很(hěn)大(dà)的(de)并發請(qǐn≠≥  g)求,把這(zhè)些(xiē)并發請(qǐng)求hold住之後就(≥©§jiù)可(kě)以分(fēn)發給後台服務端(backe£÷nd servers,也(yě)叫做(zuò)服務池ββ, 後面簡稱backend)來(lái)做(zuò₽ φ)複雜(zá)的(de)計(jì)算(suàn)、處理(lǐε♠)和(hé)響應,這(zhè)種模式的(de)好(hǎo)處是(♥★'♣shì)相(xiàng)當多(duō)的(de):隐£•→藏業(yè)務主機(jī)更安全,節約了(le)公網IP地(€∑∏dì)址,并且在業(yè)務量增加的(de)時(shí)候可(kě)以≤ 方便地(dì)擴容後台服務器(qì)。

 

 

負載均衡可(kě)以分(fēn)為(wèi)硬件(jiàn)負載均衡和₹λ≤×(hé)軟件(jiàn)負載均衡,前者一(yī)般是(shì)專<×用(yòng)的(de)軟件(jiàn)和(hé)硬件(jiàn)相(xiα™àng)結合的(de)設備,設備商會(huì)提§<®供完整成熟的(de)解決方案,通(tōng)常也(yě)會(huì)更加昂貴。® π"軟件(jiàn)的(de)複雜(zá)均衡以Nginx占據絕大(dà)多("₽↕duō)數(shù),本文(wén)也(yě)是(shì)基α₩•©于其手冊做(zuò)相(xiàng)應的(de)學習(xí)研究的σ☆(de)。

 

 

一(yī)、基本簡介

負載均衡涉及到(dào)以下(xià)的(de)基礎知(zh✔×ī)識。
  

(1) 負載均衡算(suàn)法


  a. Round Robin: 對(duì)所有(<♥yǒu)的(de)backend輪訓發送請(qǐng)求,算←∑β↓(suàn)是(shì)最簡單的(de)方式了(le),也(yě)是(←€☆shì)默認的(de)分(fēn)配方式;$♣


  b. Least Connections♥ • (least_conn): 跟蹤和(hé)backend當前的(de™​δ)活躍連接數(shù)目,最少(shǎo)的(de)連接數(shù)目說(sh≈γuō)明(míng)這(zhè)個(gè)backeεβnd負載最輕,将請(qǐng)求分(fēn)配給他(tā),這(zhè)≈™÷種方式會(huì)考慮到(dào)配置中給每個™∞(gè)upstream分(fēn)配的(de)w×♦eight權重信息;


  c. Least Time(least_time): 請♣₩<(qǐng)求會(huì)分(fēn)配給響應最快(kuài)和(hé)π§÷$活躍連接數(shù)最少(shǎo)的(de)backend;


  d. IP Hash(ip_hash): 對(duì)請(qǐ©Ω&ng)求來(lái)源IP地(dì)址計(jì)算(suàn)h←÷ash值,IPv4會(huì)考慮前3個(gè)octet←≈>,IPv6會(huì)考慮所有(yǒu) ​的(de)地(dì)址位,然後根據得(de)到(dào)的(de)hash值通δ±α'(tōng)過某種映射分(fēn)配到(dào)backend;


  e. Generic Hash(hash): 以用(yòng)戶自(zì☆♥)定義資源(比如(rú)URL)的(de<π≈)方式計(jì)算(suàn)hash值完成分(fēn)配>α​,其可(kě)選consistent關鍵字支持一(yī)緻性₩®hash特性;

 


(2) 會(huì)話(huà)一(yī)緻♥π↑→性
  

用(yòng)戶(浏覽器(qì))在和(hé)服務端交互的  ✔(de)時(shí)候,通(tōng)常'€會(huì)在本地(dì)保存一(yī)些(xiē)信息₽®→,而整個(gè)過程叫做(zuò)一(yī)個(gè)會(huì)話(∞≈"≠huà)(Session)并用(yòng↕£€)唯一(yī)的(de)Session ID進行(xíng)标識。₽>會(huì)話(huà)的(de)概念不(bù)僅用€±(yòng)于購(gòu)物(wù)車(chē)這(zhè‌$ )種常見(jiàn)情況,因為(wèi)HTTP協議(yì)是(s→•hì)無狀态的(de),所以任何需要(yào)ε↕♠•邏輯上(shàng)下(xià)文(wén)的(de)情形都(₽$∑™dōu)必須使用(yòng)會(huì)話(huà)機(jī)制(zhì)φφ,此外(wài)HTTP客戶端也(yě)會(huì)額外(wài)緩存一(yβ↓ī)些(xiē)數(shù)據在本地(d‌‌ì),這(zhè)樣就(jiù)可(kě)以減少(shǎo)請(qǐng)求提'≈↕高(gāo)性能(néng)了(le)。如(rú)果<Ωσ‍負載均衡可(kě)能(néng)将這(zhè)個(gè)會(huì)話(huà↑β®)的(de)請(qǐng)求分(fēn)配到(dào)不(bù)同的(de✘π)後台服務端上(shàng),這(zhè)肯定是(shì)不(bù)合←≤适的(de),必須通(tōng)過多(duō)個(gè)b¥÷$ackend共享這(zhè)些(xiē)數(shù)據,效率肯定會(huì)很¶±(hěn)低(dī)下(xià),最簡單的(de)情況是(‌®" shì)保證會(huì)話(huà)一(yī∞​>)緻性——相(xiàng)同的(de)會(h ‍≈→uì)話(huà)每次請(qǐng)求都(dōu)會(huì)被分(fē§≠≥↓n)配到(dào)同一(yī)個(gè)> ♥backend上(shàng)去(qù)。
  

 

(3) 後台服務端的(de)動态配置
  

出問(wèn)題的(de)backend要(yào)能(néng)≥®被及時(shí)探測并剔除出分(fēn)配群,而當業(yè)務增長(chán♦λ☆g)的(de)時(shí)候可(kě)以靈活的(de)添加backen >d數(shù)目。此外(wài)當前風(fēng)靡的(de)∏ "♣Elastic Compute雲計(jì)算(suàn)服務,服務 <商也(yě)應當根據當前負載自(zì)動添加和(hé)減少(shǎo)bac" ∑&kend主機(jī)。


  

(4) 基于DNS的(de)負載均φ£衡
  

通(tōng)常現(xiàn)代的(de)網絡服務者一(yī)個™¥(gè)域名會(huì)關連到(dào)多<♦£(duō)個(gè)主機(jī),在進行(xí→≠ng)DNS查詢的(de)時(shí)候,默認情況下(xià)DNS服♦★₩務器(qì)會(huì)以round-r±©∏¶obin形式以不(bù)同的(de)順序返回IP地(dì)址列表,因此天然±ε将客戶請(qǐng)求分(fēn)配到(dào)不(bù)同的(de)主機(¶£↔jī)上(shàng)去(qù)。不(bù)過這​®(zhè)種方式含有(yǒu)固有(yǒu)的(de)缺陷:DNS不"§​↓(bù)會(huì)檢查主機(jī)和(hé)IP地(dì)址的(de×επ)可(kě)訪問(wèn)性,所以分(fēn)配給客戶端的(d δe)IP不(bù)确保是(shì)可(kě)用(yòng)的(de)(G♠≤γoogle 404);DNS的(de)解析結果會(huì)在客戶端、多(duō✔  )個(gè)中間(jiān)DNS服務器(&♣♠​qì)不(bù)斷的(de)緩存,所以backend的(de)✘ 分(fēn)配不(bù)會(huì)那(nà)麽的(de)∏¶×σ理(lǐ)想。

 

 

二、Nginx中的(de)負載均衡

  

Nginx中的(de)負載均衡配置在手冊中描述的₹₽≥>(de)極為(wèi)細緻,此處就(jiù)不(b≤§ ù)流水(shuǐ)帳了(le)。對(d✘ ☆εuì)于常用(yòng)的(de)HTTP負載均衡,主要(yào)≈ £先定義一(yī)個(gè)upstream作​✘(zuò)為(wèi)backend gr'☆±'oup,然後通(tōng)過proxy_pass/fast>¶¥cgi_pass等方式進行(xíng)轉發操作(zuò),其中✘♦♠fastcgi_pass幾乎算(suàn)是(shì)Nginx+♥ש↕PHP站(zhàn)點的(de)标配了(le)。

 

 

2.1 會(huì)話(huà)一(yī)緻性

  

Nginx中的(de)會(huì)話(huà)一(yī)緻性是(shì)通(₩φλ€tōng)過sticky開(kāi)啓的(de♥≈∏),會(huì)話(huà)一(yī)緻性和(hé)之前的(de§∑​Ω)負載均衡算(suàn)法之間(jiān• →)并不(bù)沖突,隻是(shì)需要(yào)在第一(yīα₹)次分(fēn)配之後,該會(huì)話(λ£σ∞huà)的(de)所有(yǒu)請(qǐng)求都(dōu)分(fēn)配•∞ 到(dào)那(nà)個(gè)相(xiàng&±λ)同的(de)backend上(shàng)面。目前支持三種模式的(de)會£'<(huì)話(huà)一(yī)緻性:
  

(1). Cookie Insertion
  

在backend第一(yī)次response之後,會(huì)在其頭部☆♠✔←添加一(yī)個(gè)session cooki™§₩e,即由負載均衡器(qì)向客戶端植入 cookiΩ→↕e,之後客戶端接下(xià)來(lái)§♣<'的(de)請(qǐng)求都(dōu)會(huì)帶有(yǒu)這∑γ÷(zhè)個(gè)cookie值,Nginx可(kě)以根據這(z★↑hè)個(gè)cookie判斷需要(yào)轉發給哪♠♥個(gè)backend了(le)。

 

sticky cookie srv_id expires=1h ♥✘¶"domain=.example.com pδ©☆‌ath=/;

  

上(shàng)面的(de)srv_id代表了(le✔✔)cookie的(de)名字,而後面的(de)參數(shù)expire¶​₹§s、domain、path都(dōu)是(s£ ≤hì)可(kě)選的(de)。
  

(2). Sticky Rou✘'εtes
  

也(yě)是(shì)在backend第一(yī)次response之'✔後,會(huì)産生(shēng)一(y↕π↓ī)個(gè)route信息,route信息通(tōng)常 ∑$會(huì)從(cóng)cookie/URI信息中提取。© ₹

sticky route $route_cookie $routφφe_uri;

  

這(zhè)樣Nginx會(huì)按照(zhào)順序搜索route∞♣δ↕cookie、route_uri參數(s>☆hù)并選擇第一(yī)個(gè)非空(kōng)的(de)參π♥β∞數(shù)用(yòng)作(zuò)route,而如(rú)≠←•果所有(yǒu)的(de)參數(shù)都(d ≥↓ōu)是(shì)空(kōng)的(de),就(jiα§•ù)使用(yòng)上(shàng)面默認的(de)負載均衡算(suàn)法ε'•決定請(qǐng)求分(fēn)發給哪個("♣≈•gè)backend。
  

(3). Learn
  

較為(wèi)的(de)複雜(zá)也(yě)較為(wèi)的(de)®≈σ智能(néng),Nginx會(huì)自¥ ®↑(zì)動監測request和(hé)respo₽©₹nse中的(de)session信息,而且通(tōng✘γ↑)常需要(yào)回話(huà)一(yī)緻性的(de★∞)請(qǐng)求、應答(dá)中都(dōu)會(huì)≈≥©&帶有(yǒu)session信息,這(zhè)和(hé)第一(yī)種方式相(÷γ' xiàng)比是(shì)不(bù)用(yòn'≤∑®g)增加cookie,而是(shì)動态學習(xí)已有(yǒu)♥β$的(de)session。
  

這(zhè)種方式需要(yào)使用(yòng)到(dào)z↔‍one結構,在Nginx中zone都(dōu)是(shì)共享內(nèi)存×≥,可(kě)以在多(duō)個(gè)work€ ¶σer process中共享數(shù)據用(↓ yòng)的(de)。(不(bù)過其他(tā)的(de)會(huì)話(&• ↑huà)一(yī)緻性怎麽沒用(yòng)到(dào)共享內(nèi)存' 區(qū)域呢(ne)?)

 

sticky learn 

   create=$upstream_cooki≥♣♥e_examplecookie

   lookup=$cookie_exampl¥‌ecookie

   zone=cl∑✔ient_sessions:1m

   timeout=1h;

 

2.2 Session Draining

 

主要(yào)是(shì)有(yǒu)需要(yào)關閉某些(xiē)↓♠₩★backend以便維護或者升級,這(zhα< è)些(xiē)關鍵性的(de)服務都(dōu£∑↕→)講求gracefully處理(lǐ)的(de):就(jiù)是(shì)ε♣新的(de)請(qǐng)求不(bù)會(h£÷¶uì)發送到(dào)這(zhè)個(gè)backend上(shàng)面,♣✔而之前分(fēn)配到(dào)這(zhè)個(gèφ↕)backend的(de)會(huì)話(huà)的(de)後續請(qǐ✔∏∞"ng)求還(hái)會(huì)繼續發送給他(tā)₹€,直到(dào)這(zhè)個(gè)會(‍Ω&huì)話(huà)最終完成。

  

讓某個(gè)backend進入draining的(de)狀态,既可πεσ→(kě)以直接修改配置文(wén)件(jiàn),然≠ 後按照(zhào)之前的(de)方式通(tōng)過向master proc≤σ↕☆ess發送信号重新加載配置,也(yě)可(kě)以采∞↑用(yòng)Nginx的(de)on-the-fly配置方式。

 

$ curl http://localhost/up×βstream_conf?upstream=backend

$ curl http://localhost"✔/upstream_conf?upstreaε§m=backend\&id=1\&drai"Ω n=1

 

通(tōng)過上(shàng)面的(de)™¥方式,先列出各個(gè)bacnkend的(de)ID号,然後dra↑•'in指定ID的(de)backend。通(tōn£₹g)過在線觀測backend的(de)所有(yǒu)session↕$®都(dōu)完成後,該backend就(jiù)可(kě)以下(xià)線&₽了(le)。

 

2.3 backend健康監測

 

backend出錯(cuò)會(huì)涉及到(dào)兩個(gè×​)參數(shù),max_fails=1 fa> ☆il_timeout=10s;意味著(zhe)隻要(yào)Nginx向bac®♥ ∑kend發送一(yī)個(gè)請(qǐn↑πα₹g)求失敗或者沒有(yǒu)收到(dào)一(yī)個(λγδ€gè)響應,就(jiù)認為(wèi)該backend在接↕♣€下(xià)來(lái)的(de)10s是(shì)不(b✔₩γσù)可(kě)用(yòng)的(de)狀态€•ε∏。

  

通(tōng)過周期性地(dì)向backend↓∞發送特殊的(de)請(qǐng)求,并期盼收到(dào)特殊的(de)響應,γ♦•可(kě)以用(yòng)以确認backend是(sh¥↓ì)健康可(kě)用(yòng)的(de)狀态。通(tōng<∑←)過health_check可(kě)以做(zu↓↑ò)出這(zhè)個(gè)配置。

 

match server_ok {

    status 200-39∞φ9;

    header Con‌©≥→tent-Type = text/html;

    body !~ "maintenanc​ €‍e mode";

}

server {

    locatio↓♠n / {

        pro≥>∑xy_pass http://backend₩≥;

      &nλ¶bsp; health_check interval=10 ∞♦fails=3 passes=2 match=server_ok;

    }

}

 

上(shàng)面的(de)health_check是(shì)必須的(de)€££α,後面的(de)參數(shù)都(dōu)是Ω★(shì)可(kě)選的(de)。尤其是(shì)後面的(de)match→§δ參數(shù),可(kě)以自(zì)定義≠£≥¶服務器(qì)健康的(de)條件(jiàn),包括返回狀态碼、頭部信息、返回b¶≠ody等,這(zhè)些(xiē)條件(jiàn)是(sh♦≥ì)&&與關系。默認情況下(xià)←™↕∞Nginx會(huì)相(xiàng)隔interval的(de)間 ε→‍(jiān)隔向backend group發送一(‍‍•yī)個(gè)”/“的(de)請(‌≈<qǐng)求,如(rú)果超時(shí)或者返回非2®γ♥λxx/3xx的(de)響應碼,則認為(wèi)✘←™δ對(duì)應的(de)backend是(shì)unhea‍≈lthy的(de),那(nà)麽Nginx會(huì)停止向其發送reque>¥γst直到(dào)下(xià)次改backend再次通(tōng)過​★←δ檢查。

  

在使用(yòng)了(le)health_check↕↕<‌功能(néng)的(de)時(shí)候,一(yī)般都(d<♣∑ōu)需要(yào)在backend group開(kāi)辟一(yī)個(¥✘<gè)zone,在共享backend groΩ ♦up配置的(de)同時(shí),所有(yǒu)backend的(π​¶de)狀态就(jiù)可(kě)以在所有(yǒu) Ωφ的(de)worker process所共享了(le)‍∑,否則每個(gè)worker process獨立保存自(zì)己的(de)狀±γ ≥态檢查計(jì)數(shù)和(hé)結果,兩種情況會(huì)有♥<™(yǒu)很(hěn)大(dà)的(de)差異哦。

 

2.4 通(tōng)過DNS設置HTTP負載均衡

 

Nginx的(de)backend grouδ≤★p中的(de)主機(jī)可(kě)以配置成域名的(de)形式,✘±如(rú)果在域名的(de)後面添加resolve參數(shù),那(nà★₹)麽Nginx會(huì)周期性的(de)解析 ✔這(zhè)個(gè)域名,當域名解析的(de)☆®βε結果發生(shēng)變化(huà)的(de)時(shí)候會(€ ↓λhuì)自(zì)動生(shēng)效而不(✔πbù)用(yòng)重啓。

 

http {

    resolver 10.0.0.1 ₹☆↓valid=300s ipv6=off;Ω →‍

    resolver_timσ ∏→eout 10s;

    server {

       §σ∑ location / {

         ‌≥;   proxy_pass htΩ₽tp://backend;

        }

    }

   

    upstream backend {

      &nbsβ★p; zone backend 32k;

      ✘π  least_conn;

        ...

        server★★ backend1.example.com resol≠απ≈ve;

        server bac$©≤₽kend2.example.com resolve;

    }

}

 

如(rú)果域名解析的(de)結果含有(yǒu)多(duō)個(gè→≥↔β)IP地(dì)址,這(zhè)些(xiē)IP地(dì)址都(dōu≥≥Ω§)會(huì)保存到(dào)配置文(wén)件(jià✔ ♣"n)中去(qù),并且這(zhè)些(xiē)IP都(dōu)參與到(dà↓>o)自(zì)動負載均衡。

 

2.5 TCP/UDP流量的(de)負載均衡∏‌

 

通(tōng)常,HTTP和(hé)HTTPS的(de)負載均衡↑α&<叫做(zuò)七層負載均衡,而TCP和(hé)UDP協議(£αyì)的(de)負載均衡叫做(zuò)四層♥‍♣§負載均衡。因為(wèi)七層負載均衡通(tōng)常都(dōu)是(s≥ hì)HTTP和(hé)HTTPS協議(yì),所以φ‍•這(zhè)種負載均衡相(xiàng)當于是(s₽¥₹↑hì)四層負載均衡的(de)特例化(huà)•★∞,均衡器(qì)可(kě)以根據HTTP/HTT₩ε₩PS協議(yì)的(de)頭部(User-Agent、Language等)¥π¥、響應碼甚至是(shì)響應內(nèi)容做(zuò)額外(wài₩™£γ)的(de)規則,達到(dào)特定條件( ¶jiàn)特定目的(de)的(de)backe≥λ€nd轉發的(de)需求。

 

除了(le)Nginx所專長(cháng)的(de)HTTP負載均衡,Ngin♠​x還(hái)支持TCP和(hé)UDP流量的(de)負載均衡,适用(y₩♠¥òng)于LDAP/MySQL/RTMP和(hé)DNS/syslog/Rσ×Ω≠ADIUS各種應用(yòng)場(chǎng)景。這(zh∞☆& è)類情況的(de)負載均衡使用(yòn'₩♠δg)stream來(lái)配置,Nginx編譯的(d★←±€e)時(shí)候需要(yào)支持–with-stream選項‍Ω'。查看(kàn)手冊,其配置原理(lǐ)和(hé)參數(shù)和(hé)♦ &HTTP負載均衡差不(bù)多(duō)。

  

因為(wèi)TCP、UDP的(de)負載均衡都(λ‌dōu)是(shì)針對(duì)通(tōng)用(yòng)程序α ₩"的(de),所以之前HTTP協議(yì)支持的(de)match條件 ✔✔Ω(jiàn)(status、header、body)是(shì)©×沒法使用(yòng)的(de)。TCP和(hé)U≈≈DP的(de)程序可(kě)以根據特定的(de)←δ程序,采用(yòng)send、expect的(de)方式來(lá&<<i)進行(xíng)動态健康檢測。

 

match http {

    send &nbsγ♣ p;    "GET /​  HTTP/1.0\r\nHost: localhost\r\n\♦ r\n";

    expect ~* "200 O®∞∞♥K";

}

 

2.6 其他(tā)特性

 

slow_start=30s:防止新添加/恢複的(de)主機(jī)被突然增加Ω>α的(de)請(qǐng)求所壓垮,通(tōng)過這(zhè)個(gè)參數©γ(shù)可(kě)以讓該主機(jī)的(de)weight從(c​™óng)0開(kāi)始慢(màn)慢(màn)‍ ‍∞增加到(dào)設定值,讓其負載有(yǒu)∞↕δ一(yī)個(gè)緩慢(màn)增加的÷≠π£(de)過程。

  

max_conns=30:可(kě)以設置backen↔ d的(de)最大(dà)連接數(shù)目,當超過這(zhè)個(gè)數 ≤(shù)目的(de)時(shí)候會(huì)被放(fàng)到(d✘÷$←ào)queue隊列中,同時(shí)隊列的(de)大(dà)小(x$↓α≥iǎo)和(hé)超時(shí)參數(shù)也(yě)可(kě)以設置,當隊£↔₽列中的(de)請(qǐng)求數(shù)大(dà)于設定值,或者超過了<ε(le)timeout但(dàn)是(shì)backen‌£πλd還(hái)不(bù)能(néng)處理(lǐ)請(qǐng)求,則客戶端将♦>©會(huì)收到(dào)一(yī)個(π¶β'gè)錯(cuò)誤返回。通(tōng)常來(lái)‌♠說(shuō)這(zhè)還(hái)是(sh®φ✘✔ì)一(yī)個(gè)比較重要(yào)的(de)參數(shù),因為(wφ&© èi)Nginx作(zuò)為(wèi)反向代理(lǐ)的(de)時​←(shí)候,通(tōng)常就(jiù)σβ≤是(shì)用(yòng)于抗住并發量的(de),如←≈ (rú)果給backend過多(duō)的(de)并發請(qǐng)♣€求,很(hěn)可(kě)能(néng)會(huì)占用(βφ‌Ωyòng)後端過多(duō)的(de)資源(比☆★'如(rú)線程、進程非事(shì)件(jiàn)驅動),最>&終反而會(huì)影(yǐng)響backend的(de)處理(lǐ)能≈✘(néng)力。

 

无码人妻精品一区二区蜜桃在线看,人妻无码中文字幕免费视频蜜桃,无码人妻精品一区二区蜜桃色欲,蜜桃AV色偷偷AV老熟女,久久人妻少妇嫩草AV蜜桃漫画,又爽又黄A片免费观看直播蜜桃,欧美性猛交XXXX乱大交蜜桃,色欲AV永久无码精品无码蜜桃,蜜桃一区二区三区,WWW.17C嫩嫩草色视频蜜桃,亚洲精品久久久蜜桃