一篇文章講清楚,接入層架構(gòu)演進
- 接入層架構(gòu)?
- 不就是反向代理層(Nginx、LVS、F5等)嗎?
- 不是很成熟嗎?
- 有什么好講的?
知其然,知其所以然。

一、開篇
1. 反向代理層有什么用?
(1) 作為服務端統(tǒng)一入口,屏蔽后端WEB集群細節(jié),代表整個WEB集群;
畫外音:這就是為啥它叫反向代理。
(2) 保證WEB集群的擴展性,Nginx后端可隨時加WEB實例;
(3) 實施負載均衡,反向代理層會將請求均勻分發(fā)給后端WEB集群的每一個實例;
(4) 保證WEB集群的高可用,任何一個WEB實例掛了,服務都不受影響;
2. 反向代理層還存在啥問題?
反向代理層自身的擴展性問題并沒有得到很好的解決,例如當Nginx成為系統(tǒng)瓶頸的時候,無法擴容。
3. DNS輪詢?nèi)绾谓鉀Q反向代理層的擴展性問題?
通過在DNS-server上對一個域名設(shè)置多個IP解析,能夠增加入口Nginx實例個數(shù),起到水平擴容的作用,解決反向代理層的擴展性問題。
因此,反向代理和DNS輪詢并不是互斥的技術(shù),而是互補的技術(shù)。
接入層架構(gòu)演進,聽我娓娓道來。
二、裸奔方案:單機接入架構(gòu)

裸奔時代的架構(gòu)圖如上:
- 瀏覽器通過DNS-server,域名解析到ip;
- 瀏覽器通過ip訪問web-server;
缺點:
- 非高可用,web-server掛了整個系統(tǒng)就掛了;
- 擴展性差,當吞吐量達到web-server上限時,無法擴容;
畫外音:單機不涉及負載均衡問題。
三、簡易擴容方案:DNS輪詢
假設(shè)tomcat的吞吐量是1000次每秒,當系統(tǒng)總吞吐量達到3000時,如何擴容是首先要解決的問題,DNS輪詢是一個很容易想到的方案。
畫外音:DNS輪詢解決擴展性問題。

此時的架構(gòu)圖如上:
- 多部署幾份web-server,1個tomcat抗1000,部署3個tomcat就能抗3000;
- 在DNS-server層面,域名每次解析到不同的ip;
優(yōu)點:
- 零成本:在DNS-server上多配幾個ip即可,功能也不收費;
- 部署簡單:多部署幾個web-server即可,原系統(tǒng)架構(gòu)不需要做任何改造;
- 負載均衡:變成了多機,負載也是均衡的;
缺點:
- 非高可用:DNS-server只負責域名解析ip,這個ip對應的服務是否可用,DNS-server是不保證的,假設(shè)有一個web-server掛了,部分服務會受到影響;
- 擴容非實時:DNS解析有一個生效周期;
- 暴露了太多的外網(wǎng)ip;
四、統(tǒng)一接入方案:反向代理
tomcat的性能較差,但Nginx作為反向代理的性能就強很多,假設(shè)線上跑到1w,就比tomcat高了10倍,可以利用這個特性來做擴容。

此時的架構(gòu)圖如上:
- 站點層與瀏覽器層之間加入了一個反向代理層,利用高性能的Nginx來做反向代理;
- Nginx將http請求分發(fā)給后端多個web-server;
優(yōu)點:
- DNS-server不需要動;
- 負載均衡:通過Nginx來保證;
- 只暴露一個外網(wǎng)ip,Nginx->tomcat之間使用內(nèi)網(wǎng)訪問;
- 擴容實時:Nginx內(nèi)部可控,隨時增加web-server隨時實時擴容;
- 能夠保證站點層的可用性:任何一臺tomcat掛了,Nginx可以將流量遷移到其他tomcat;
畫外音:反向代理,能夠更實時,更方便的擴容了。
缺點:
- 時延增加+架構(gòu)更復雜了:中間多加了一個反向代理層;
- 反向代理層成了單點,非高可用:tomcat掛了不影響服務,Nginx掛了怎么辦?
五、高可用反向代理方案:keepalived
為了解決高可用的問題,keepalived出場了。

- 做兩臺Nginx組成一個集群,分別部署上keepalived,設(shè)置成相同的虛IP,保證Nginx的高可用;
- 當一臺Nginx掛了,keepalived能夠探測到,并將流量自動遷移到另一臺Nginx上,整個過程對調(diào)用方透明;

優(yōu)點:解決了高可用的問題;
畫外音:反向代理的高可用也解決了。
缺點:
- 資源利用率只有50%;
- Nginx仍然是接入單點,如果接入吞吐量超過Nginx的性能上限怎么辦,例如qps達到了50000咧?
六、多級反向代理方案:lvs/f5
Nginx是應用軟件,性能比tomcat好,但總有個上限,超出了上限,還是扛不住。
lvs就不一樣了,它實施在操作系統(tǒng)層面;f5的性能又更好了,它實施在硬件層面;它們性能比Nginx好很多,例如每秒可以抗10w,這樣可以利用他們來擴容,常見的架構(gòu)圖如下:

- 如果通過Nginx可以擴展多個tomcat一樣,可以通過lvs來擴展多個Nginx;
- 通過keepalived+VIP的方案可以保證可用性;
99.99%的公司到這一步基本就結(jié)束了,解決了接入層高可用、擴展性、負載均衡的問題。
完美了嘛,還有什么潛在問題?
好吧,不管是使用lvs還是f5,這些都是scale up的方案,根本上,lvs/f5還是會有性能上限,假設(shè)每秒能處理10w的請求,一天也只能處理80億的請求(10w秒吞吐量*8w秒),那萬一系統(tǒng)的日PV超過80億怎么辦呢?
七、scale out擴容方案:DNS輪詢
如之前文章所述,水平擴展,才是解決性能問題的根本方案,能夠通過加機器擴充性能的方案才具備最好的擴展性。
facebook,google,baidu的PV是不是超過80億呢,它們的域名只對應一個ip么,終點又是起點,還是得通過DNS輪詢來進行擴容。
畫外音:DNS輪詢解決擴展性問題。

- 通過DNS輪詢來線性擴展入口lvs層的性能;
- 通過keepalived來保證高可用;
- 通過lvs來擴展多個Nginx;
- 通過Nginx來做負載均衡,業(yè)務七層路由;
八、簡單總結(jié)
接入層架構(gòu)演進,有一個循序漸進的過程,其核心設(shè)計點如下:
- 需要考慮:高可用、擴展性、反向代理、負載均衡;
- Nginx、keepalived、lvs、f5可以很好的解決高可用、擴展性、反向代理、負載均衡的問題;
- 水平擴展scale out是解決擴展性問題的根本方案,DNS輪詢不能完全被Nginx/lvs/f5所替代;
知其然,知其所以然。
思路比結(jié)論更重要。



























