Nginx負(fù)載均衡機(jī)制

Nginx(反向代理服務(wù)器)

正向代理

場(chǎng)景:在國(guó)內(nèi)是無(wú)法正常使用google.com。如果想要訪問(wèn)google.com,可以購(gòu)買一臺(tái)國(guó)外的服務(wù)器A,此時(shí)你和服務(wù)器A的網(wǎng)絡(luò)是相通的。而服務(wù)器A又跟google.com相通, 此時(shí)可以由服務(wù)器A代理你(客戶端),去訪問(wèn)google.com。這個(gè)過(guò)程稱之為正向代理,服務(wù)端(google.com)只需要知道代理服務(wù)器的ip,不需要知道客戶端的ip。

示例1:


示例2:


結(jié)論:正向代理,是用于代理客戶端的。

反向代理

場(chǎng)景:當(dāng)一個(gè)服務(wù)器接受過(guò)多來(lái)自客戶端的請(qǐng)求時(shí),服務(wù)器難以處理和響應(yīng)這些請(qǐng)求,會(huì)使得整個(gè)系統(tǒng)性能下降。為了解決這個(gè)難題,可以提供多臺(tái)部署相同應(yīng)用的服務(wù)器,讓客戶端的請(qǐng)求分別發(fā)送到不同的服務(wù)器上,這樣單機(jī)服務(wù)器的壓力就會(huì)降低很多,整體性能便會(huì)提升。但是有一個(gè)問(wèn)題,每個(gè)服務(wù)器ip都是不同的,也就是說(shuō)客戶端的請(qǐng)求要發(fā)送到多個(gè)不同的ip上。讓客戶手動(dòng)指定ip進(jìn)行請(qǐng)求,這種方式很不明智。首先是客戶的隨機(jī)性,不知道會(huì)訪問(wèn)哪臺(tái)服務(wù)器,其次,會(huì)造成一部分服務(wù)器壓力大,一部分服務(wù)器幾乎沒(méi)有使用,浪費(fèi)資源。因此,這里就需要一個(gè)角色去代理服務(wù)器,讓客戶端的請(qǐng)求直接發(fā)送到這個(gè)角色上,由這個(gè)角色去分發(fā)請(qǐng)求到不同的服務(wù)器上。

這個(gè)角色就是反向代理服務(wù)器。

結(jié)論:反向代理,是用于代理服務(wù)端的。

負(fù)載均衡

場(chǎng)景:反向代理過(guò)程中,每臺(tái)服務(wù)器處理來(lái)自客戶端的請(qǐng)求都應(yīng)該是均衡的。
原理:使用一個(gè)反向代理服務(wù)器指向多臺(tái)部署相同應(yīng)用的服務(wù)器,客戶端請(qǐng)求直接向反向代理服務(wù)器發(fā)起,反向代理服務(wù)器根據(jù)負(fù)載均衡機(jī)制,將請(qǐng)求轉(zhuǎn)發(fā)到不同的應(yīng)用服務(wù)器上。


nginx提供了以下三種負(fù)載均衡機(jī)制:

  • round-robin:請(qǐng)求以循環(huán)、輪轉(zhuǎn)的方式分發(fā)到服務(wù)器
  • least-connected:下一個(gè)請(qǐng)求被分配到擁有最少活動(dòng)連接數(shù)的服務(wù)器
  • ip-hash:使用一個(gè)哈希函數(shù),基于客戶端ip地址判斷下一個(gè)請(qǐng)求應(yīng)該被分發(fā)到哪臺(tái)服務(wù)器

循環(huán)、輪轉(zhuǎn)負(fù)載均衡

round-robin:默認(rèn)情況下,使用循環(huán)、輪轉(zhuǎn)的方式分發(fā)請(qǐng)求到服務(wù)器
配置示例:

http{
  upstream myapp{
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
  }
  server{
    listen 80;
    location / {
      proxy_pass http://myapp;
    }
  }
}

當(dāng)不指定負(fù)載均衡方式時(shí),默認(rèn)以round-robin方式實(shí)現(xiàn)。所有請(qǐng)求都會(huì)被代理到myapp服務(wù)器,根據(jù)負(fù)載均衡機(jī)制分發(fā)請(qǐng)求。

最少連接負(fù)載均衡

least-connected:當(dāng)一些請(qǐng)求處理的時(shí)間比較長(zhǎng)時(shí),最少連接負(fù)載均衡能夠爭(zhēng)取到更大的公平。

配置示例:

upstream myapp{
  least-conn;
  server srv1.example.com;
  server srv2.example.com;
  server srv3.example.com;
}

基于ip地址的負(fù)載均衡

ip-hash:采用目標(biāo)地址散列調(diào)度(Destination Hashing Scheduling)算法,根據(jù)請(qǐng)求的目標(biāo)ip地址,作為散列鍵(Hash Key)從靜態(tài)分配的散列表找出對(duì)應(yīng)的服務(wù)器,若該服務(wù)器可用且未超載,則將請(qǐng)求發(fā)送帶服務(wù)器,否則返回空。

配置示例:

upstream myapp{
  ip-hash;
  server srv1.example.com;
  server srv2.example.com;
  server srv3.example.com;
}

不過(guò),Nginx雖然強(qiáng)大,但是還是有很多問(wèn)題的。
1. 單純使用Nginx,會(huì)造成配置維護(hù)成本變高。
2. 單點(diǎn)故障率增加,因?yàn)闊狳c(diǎn)服務(wù)的訪問(wèn)量很高,如果這個(gè)服務(wù)的負(fù)載均衡服務(wù)出現(xiàn)問(wèn)題,整個(gè)服務(wù)都會(huì)掛點(diǎn)。
因此,可以結(jié)合Zookeeper去使用。

Nginx和Zookeeper搭配使用,詳情見:https://blog.csdn.net/xiangjai/article/details/56844400

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容