引言
面完了RPC相關(guān)的一系列問題,面試官確定我對(duì)分布式架構(gòu)的理論知識(shí)和服務(wù)間通訊框架(RPC) 確實(shí)了解了。
接下來又開始問我網(wǎng)絡(luò)相關(guān)的知識(shí),但不是直接問HTTP三次握手,TCP,UPD這些,因?yàn)檫@些基礎(chǔ)已經(jīng)在一面問完了,這一面只圍繞分布式系統(tǒng)相關(guān)的網(wǎng)絡(luò)概念,從最基本的代理開始。
1、面試官:完看你簡歷提到使用過Nginx做代理,你是如何理解“正向代理”,“反向代理”的?
問題分析: 即使作為業(yè)務(wù)開發(fā)人員也會(huì)經(jīng)常遇到需要配置Nginx或其他負(fù)載均衡的問題,比如你做了一個(gè)文件上傳服務(wù),上線后發(fā)現(xiàn)文件被攔截了,看看報(bào)錯(cuò)信息一看是被Nginx 代理攔截了,Nginx限制了文件大小,這個(gè)時(shí)候代理的概念是啥怎么看明白這個(gè)問題呢?
答:
正向代理: 代理用戶端請(qǐng)求服務(wù)端,相對(duì)于服務(wù)器用戶端是匿名的,比如單位內(nèi)網(wǎng)使用了正向代理軟件,所有員工都訪問百度,但是百度看到的只有一個(gè)IP地址,百度也不知道到底是哪個(gè)員工訪問的。
反向代理: 代理服務(wù)端提供服務(wù),相對(duì)于用戶服務(wù)端是匿名的,同樣是訪問www.baidu.com,所有用戶輸入的都是一個(gè)網(wǎng)站或者一個(gè)IP,但是百度背后有成千上萬的服務(wù)器,你也不知道你訪問的是哪一個(gè)。
2、面試官:那服務(wù)端為什么要使用代理?有啥好處?
問題分析: 面試官點(diǎn)點(diǎn)頭,對(duì)我理解的代理表示認(rèn)可,隨后問我使用代理有什么用,考察代理技術(shù)的原理。
答:比如用 Nginx 做代理,這樣就可以開buffer,Nginx 可以把 Request 請(qǐng)求和 Response 在讀取完整之前 buffer 住,好比飯店服務(wù)員,所有顧客要什么菜和一個(gè)服務(wù)員說一下就行了,不會(huì)直接找廚師,一個(gè)服務(wù)員接待10個(gè)顧客,最后把點(diǎn)的20道菜分發(fā)給5個(gè)廚子做就行了,廚子好比服務(wù)器,這樣廚子就可以專心做菜了,接待這種事就有Nginx代理做,同時(shí),還可以根據(jù)顧客數(shù)量多增加或者減少廚師數(shù)量,把任務(wù)均勻分給每個(gè)廚師,這就是負(fù)載均衡的作用,Nginx 就可以有效分發(fā)流量。
總的來說:
- 讓IO和服務(wù)器分離,突破IO性能,提高服務(wù)器吞吐能力。
- 控制流量分發(fā),管理服務(wù)集群,起到負(fù)載均衡作用。
- 安全性和匿名性:通過攔截前端服務(wù)器的請(qǐng)求,反向代理服務(wù)器可以保護(hù)其身份,并可以抵御安全攻擊。它還確保可以從單個(gè)記錄定位器或URL訪問多個(gè)服務(wù)器,而不管服務(wù)端網(wǎng)絡(luò)的結(jié)構(gòu)如何。
3、面試官:那你知道哪些負(fù)載均衡算法?
問題分析: 聊到了負(fù)載面試官要繼續(xù)深挖算法了。
答:
輪詢算法:簡單的理解就好比性感荷官在線發(fā)牌,從左到右依次發(fā)牌,最后每個(gè)人獲得的紙牌張數(shù)一樣,輪詢算法就是將多個(gè)用戶請(qǐng)求按順序依次分發(fā)到1-10號(hào)機(jī)器上,目的就是讓每臺(tái)機(jī)器承受相同的壓力,100W次查詢理論上每臺(tái)機(jī)器分?jǐn)偭?0W次查詢。
加權(quán)輪詢算法:輪詢算法和加權(quán)輪詢算法有什么區(qū)別?想象一下,如果10臺(tái)服務(wù)器的配置不相同,8臺(tái)機(jī)器是8核32G,剩下兩臺(tái)是4核16G,如果按照算法1輪詢,每臺(tái)機(jī)器分擔(dān)10W次請(qǐng)求,那兩臺(tái)低配的服務(wù)器說我扛不住呀,你們配置比我好,這不公平,我要宕機(jī)休息一下,加權(quán)輪詢算法就是為了應(yīng)對(duì)這種情況,設(shè)置不同機(jī)器的權(quán)重不同,10臺(tái)同配置機(jī)器分別均攤10%的流量,如果機(jī)器性能不同,那讓兩臺(tái)低配的權(quán)重降低,只承擔(dān)5%的流量,這樣就公平了,能者多勞。每臺(tái)機(jī)器都不閑著發(fā)揮自己最大的性能。
隨機(jī)算法:隨機(jī)算法和輪詢算法類似,讓所有請(qǐng)求隨機(jī)分配到不同的機(jī)器上,請(qǐng)求越多最后分散在每臺(tái)機(jī)器上的請(qǐng)求數(shù)約接近相等。
加權(quán)隨機(jī)算法:和加權(quán)輪詢算法道理相似,這里不多說了。
最小連接數(shù)算法:最小鏈接數(shù)就是請(qǐng)求分發(fā)以前,先看當(dāng)前10臺(tái)機(jī)器誰最清閑,誰當(dāng)前處理的鏈接數(shù)最少那就把活分給誰,最后的分工也相對(duì)公平。
Hash 算法:前5種算法有一個(gè)問題,就是同一個(gè)用戶的請(qǐng)求多次,可能每次都會(huì)被分配到不同機(jī)器上,這樣有什么不好?如果服務(wù)器緩存了用戶 Session,那每次請(qǐng)求不同服務(wù)器都需要保存用戶的 Session,最壞的結(jié)果就是用戶請(qǐng)求10次,10臺(tái)服務(wù)器都緩存了同一個(gè)用戶的 Session,這顯然是浪費(fèi)服務(wù)器資源。這個(gè)時(shí)候 Hash 算法就出現(xiàn)了,如果讀者還不知道 Hash,建議先 Google 下 Hash,hash(client:ip) % N,N就是服務(wù)器的數(shù)量,只要用戶的 IP不變,最后 Hash 取余的結(jié)果就不會(huì)變,這樣就能保證同一個(gè)用戶每次請(qǐng)求都會(huì)在同一臺(tái)機(jī)器上,這里的IP還可以是用戶的其他唯一ID。
一致性Hash:hash(client:ip) % N 上面的公式中如果N變了怎么辦?比如一臺(tái)服務(wù)器斷電了,那最后 Hash 取余的結(jié)果就全變了,所有用戶會(huì)被分配到哪臺(tái)機(jī)器需要全部重新計(jì)算,這對(duì)有 Session 狀態(tài)的服務(wù)就是一場災(zāi)難,一致性Hash 就是為了解決這個(gè)問題。
深入分析
負(fù)載均衡幾乎是各大互聯(lián)網(wǎng)公司搭建系統(tǒng)必用的技術(shù)了,也會(huì)有初學(xué)者學(xué)習(xí)分布式系統(tǒng)時(shí)會(huì)問我,什么是負(fù)載均衡,為什么要使用負(fù)載均衡,多加一層負(fù)載均衡會(huì)讓服務(wù)調(diào)用變慢嗎?帶著這些問題學(xué)習(xí)一下這一章。
先看下沒有負(fù)載均衡的網(wǎng)站架構(gòu)
不知道你有沒有發(fā)現(xiàn),如果服務(wù)端是單臺(tái)服務(wù)器,直接通過網(wǎng)絡(luò)就可以鏈接。為什么說負(fù)載均衡幾乎是各大互聯(lián)網(wǎng)公司搭建系統(tǒng)必用的技術(shù),除了個(gè)人網(wǎng)站,比如我的博客還是單體服務(wù)器以外,相信沒有哪家互聯(lián)網(wǎng)公司的服務(wù)敢這樣,一臺(tái)機(jī)器如果宕機(jī)怎么辦?讓用戶等一會(huì)兒嗎?那估計(jì)這家公司離倒閉就不遠(yuǎn)了。
那怎么解決單機(jī)故障的問題,再看下面的圖。
可以看出,多臺(tái)服務(wù)器的情況,增加了一層負(fù)載均衡。
什么是負(fù)載均衡
負(fù)載平衡(Load balancing)是一種計(jì)算機(jī)技術(shù),用來在多個(gè)計(jì)算機(jī)(計(jì)算機(jī)集群、網(wǎng)絡(luò)連接、CPU、磁碟驅(qū)動(dòng)器或其他資源中分配負(fù)載,以達(dá)到最佳化資源使用、最大化吞吐率、最小化響應(yīng)時(shí)間、同時(shí)避免過載的目的。 使用帶有負(fù)載平衡的多個(gè)伺服器組件,取代單一的組件,可以通過冗余提高可靠性。負(fù)載平衡服務(wù)通常是由專用軟件和硬件來完成。 主要作用是將大量作業(yè)合理地分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行執(zhí)行,用于解決互聯(lián)網(wǎng)架構(gòu)中的高并發(fā)和高可用的問題。
? ——— 維基百科
簡單地理解負(fù)載均衡的作用就是流量分發(fā),將大量用戶請(qǐng)求分發(fā)到不同服務(wù)器上分擔(dān)壓力,如果有機(jī)器宕機(jī),負(fù)載均衡服務(wù)器會(huì)負(fù)責(zé)把故障機(jī)器自動(dòng)摘除。
常用的負(fù)載均衡框架
Nginx:NGINX | High Performance Load Balancer, Web Server, & Reverse Proxy ,來自俄羅斯的軟件,不光可以用作負(fù)載均衡,反向代理,還是出色的web服務(wù)器,使用廣泛,所以也是面試常問的知識(shí)點(diǎn)。如果英文不錯(cuò)可以參考。
LVS:The Linux Virtual Server Project - Linux Server Cluster for Load Balancing ,Linux Virtual Server的縮寫,一個(gè)Linux下的開源服務(wù)器集群系統(tǒng),章?文嵩博?士于1998年5月創(chuàng)立。
HAProxy:http://www.haproxy.org/ ,一款高可用http/TCP負(fù)載均衡。
F5:F5 | Multi-Cloud Security and Application Delivery 硬件負(fù)載均衡。
上述都是常見負(fù)載均衡,在企業(yè)里具體使用哪種框架并不是絕對(duì)的,主要取決于系統(tǒng)的需求和工程師對(duì)每個(gè)框架的了解程度。
一個(gè)框架能存活下來一定是具有自己的優(yōu)點(diǎn),沒有最好,適合自己的就是最好的。
比如F5,性能出色價(jià)格昂貴而出名,從十幾萬到上百萬不等,有強(qiáng)大的售后和技術(shù)支持,我工作多年只有工作第一年參加國家電網(wǎng)項(xiàng)目上使用過F5,當(dāng)時(shí)還給了我們一臺(tái)測試用的機(jī)器,后來辭職后面試別的公司,面試官問我以前的項(xiàng)目組是使用的什么負(fù)載均衡,我說F5,面試官感嘆國家隊(duì)果然財(cái)大氣粗,我那個(gè)時(shí)候不了解還有什么其他解決方案,表示F5很奇怪嗎?面試完回家才慢慢了解,原來有很多解決方案,阿里使用LVS,也使用Nginx,美團(tuán)最初使用Nginx + LVS,以及后來獨(dú)立研發(fā)的MGW。
有人會(huì)問,怎么一個(gè)負(fù)載均衡就這么多種算法,心好累,企業(yè)開發(fā)里能用這么多算法嗎?真正到企業(yè)開發(fā)中,一般都只用一種,如果負(fù)責(zé)的服務(wù)器沒有帶狀態(tài)的 Session,也不存在機(jī)器配置不相同的情況,那就可以用輪詢或隨機(jī)算法,工程師根據(jù)實(shí)際情況選擇最合適自己的算法。
正向代理&反向代理
正向代理
生活中的正向代理,打個(gè)比方,你想去俄羅斯旅行,需要去使館辦理簽證,手續(xù)麻煩,你完全不知道從何下手,這個(gè)時(shí)候你想到找旅行社,有專門的導(dǎo)游可你幫你代辦,你只需提供資料就在家等著拿簽證就可以了,你是客戶端,俄羅斯使館是服務(wù)端,導(dǎo)游就是代理端。
正向代理就是代理客戶端,服務(wù)端不知道客戶端是誰。
反向代理
互聯(lián)網(wǎng)不夠發(fā)達(dá)的時(shí)候,我們都打過10086,有事兒就找客服,全國31個(gè)省都有自己的客服中心,每個(gè)客服中心都有上百個(gè)客服小哥小姐姐,我們不關(guān)心給你分配的是誰,只需要接通10086后會(huì)自動(dòng)給你分配客服給你,這就是反向代理。
反向代理就是代理服務(wù)端,客戶端不知道服務(wù)端是誰。
反向代理服務(wù)器可以充當(dāng)“交通警察”,如上圖,位于后端服務(wù)器(baidu)前面,并以最大化速度和容量利用率的方式在一組服務(wù)器上分發(fā)客戶端請(qǐng)求,同時(shí)確保沒有一個(gè)服務(wù)器過載,可以降低性能。如果服務(wù)器出現(xiàn)故障,負(fù)載均衡器會(huì)將流量重定向到其它正常的服務(wù)器上。
總結(jié)
這一節(jié)主要講了負(fù)載均衡在網(wǎng)站后臺(tái)建設(shè)中的應(yīng)用和代理的概念,負(fù)載均衡算法和正/反向代理的概念也是面試中容易碰到的基礎(chǔ)問題,是初學(xué)者必須掌握的概念。
以上就是分布式架構(gòu)中關(guān)于正向代理反向代理面試提問的詳細(xì)內(nèi)容,更多關(guān)于分布式架構(gòu)正向代理反向代理面試的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!
原文地址:https://blog.csdn.net/qq_34272760/article/details/120734825