「反向代理層」毫不能替代「DNS輪詢」!

有朋友問我,DNS輪詢是否是過期的技術了?有了反向代理層(Nginx、LVS、F5等),是否是就不須要DNS輪詢了?web

然而,反向代理層毫不能替代DNS輪詢!後端

反向代理層有什麼用?架構實現時要注意什麼?
(1) 做爲服務端統一入口,屏蔽後端WEB集羣細節,表明整個WEB集羣;
畫外音:這就是爲啥它叫反向代理。
(2) 保證WEB集羣的擴展性,Nginx後端可隨時加WEB實例;
(3) 實施負載均衡,反向代理層會將請求均勻分發給後端WEB集羣的每個實例;
(4) 保證WEB集羣的高可用,任何一個WEB實例掛了,服務都不受影響;
(5) 注意自身高可用,防止一臺Nginx掛了,服務端統一入口受影響;瀏覽器

反向代理層還存在啥問題?
反向代理層自身的擴展性問題並無獲得很好的解決,例如當Nginx成爲系統瓶頸的時候,沒法擴容。tomcat

DNS輪詢如何解決反向代理層的擴展性問題?
經過在DNS-server上對一個域名設置多個IP解析,可以增長入口Nginx實例個數,起到水平擴容的做用,解決反向代理層的擴展性問題。架構

所以,反向代理和DNS輪詢並非互斥的技術,however,這裏詳細展開講一下接入層的架構漸進歷程。負載均衡

裸奔時代(1)單機架構ide

裸奔時代的架構圖如上:
(1) 瀏覽器經過DNS-server,域名解析到ip;
(2) 瀏覽器經過ip訪問web-server;性能

缺點:
(1) 非高可用,web-server掛了整個系統就掛了;
(2) 擴展性差,當吞吐量達到web-server上限時,沒法擴容;
畫外音:單機不涉及負載均衡問題。google

簡易擴容方案(2)DNS輪詢
假設tomcat的吞吐量是1000次每秒,當系統總吞吐量達到3000時,如何擴容是首先要解決的問題,DNS輪詢是一個很容易想到的方案。
畫外音:DNS輪詢解決擴展性問題。
「反向代理層」毫不能替代「DNS輪詢」!操作系統

此時的架構圖如上:
(1) 多部署幾份web-server,1個tomcat抗1000,部署3個tomcat就能抗3000;
(2) 在DNS-server層面,域名每次解析到不一樣的ip;

優勢:
(1) 零成本:在DNS-server上多配幾個ip便可,功能也不收費;
(2) 部署簡單:多部署幾個web-server便可,原系統架構不須要作任何改造;
(3) 負載均衡:變成了多機,負載也是均衡的;

缺點:
(1) 非高可用:DNS-server只負責域名解析ip,這個ip對應的服務是否可用,DNS-server是不保證的,假設有一個web-server掛了,部分服務會受到影響;
(2) 擴容非實時:DNS解析有一個生效週期;
(3) 暴露了太多的外網ip;

簡易擴容方案(3)反向代理Nginx
tomcat的性能較差,但Nginx做爲反向代理的性能就強不少,假設線上跑到1w,就比tomcat高了10倍,能夠利用這個特性來作擴容。
「反向代理層」毫不能替代「DNS輪詢」!

此時的架構圖如上:
(1) 站點層與瀏覽器層之間加入了一個反向代理層,利用高性能的Nginx來作反向代理;
(2) Nginx將http請求分發給後端多個web-server;

優勢:
(1) DNS-server不須要動;
(2) 負載均衡:經過Nginx來保證;
(3) 只暴露一個外網ip,Nginx->tomcat之間使用內網訪問;
(4) 擴容實時:Nginx內部可控,隨時增長web-server隨時實時擴容;
(5) 可以保證站點層的可用性:任何一臺tomcat掛了,Nginx能夠將流量遷移到其餘tomcat;
畫外音:反向代理,可以更實時,更方便的擴容了。

缺點:
(1) 時延增長+架構更復雜了:中間多加了一個反向代理層;
(2) 反向代理層成了單點,非高可用:tomcat掛了不影響服務,Nginx掛了怎麼辦?

高可用方案(4)keepalived
爲了解決高可用的問題,keepalived出場了。
「反向代理層」毫不能替代「DNS輪詢」!

(1) 作兩臺Nginx組成一個集羣,分別部署上keepalived,設置成相同的虛IP,保證Nginx的高可用;
(2) 當一臺Nginx掛了,keepalived可以探測到,並將流量自動遷移到另外一臺Nginx上,整個過程對調用方透明;
「反向代理層」毫不能替代「DNS輪詢」!
優勢:
(1) 解決了高可用的問題;
畫外音:反向代理的高可用也解決了。

缺點:
(1) 資源利用率只有50%;
(2) Nginx仍然是接入單點,若是接入吞吐量超過的Nginx的性能上限怎麼辦,例如qps達到了50000咧?

scale up擴容方案(5)lvs/f5
Nginx是應用軟件,性能比tomcat好,但總有個上限,超出了上限,仍是扛不住。

lvs就不同了,它實施在操做系統層面;f5的性能又更好了,它實施在硬件層面;它們性能比Nginx好不少,例如每秒能夠抗10w,這樣能夠利用他們來擴容,常見的架構圖以下:
「反向代理層」毫不能替代「DNS輪詢」!

(1) 若是經過Nginx能夠擴展多個tomcat同樣,能夠經過lvs來擴展多個Nginx;
(2) 經過keepalived+VIP的方案能夠保證可用性;

99.9999%的公司到這一步基本就結束了,解決了接入層高可用、擴展性、負載均衡的問題。
畫外音:上游再加一層擴充性能。

完美了嘛,還有什麼潛在問題?
好吧,無論是使用lvs仍是f5,這些都是scale up的方案,根本上,lvs/f5仍是會有性能上限,假設每秒能處理10w的請求,一天也只能處理80億的請求(10w秒吞吐量*8w秒),那萬一系統的日PV超過80億怎麼辦呢?

scale out擴容方案(6)DNS輪詢
如以前文章所述,水平擴展,纔是解決性能問題的根本方案,可以經過加機器擴充性能的方案才具有最好的擴展性。

facebook,google,baidu的PV是否是超過80億呢,它們的域名只對應一個ip麼,終點又是起點,仍是得經過DNS輪詢來進行擴容。
畫外音:DNS輪詢解決擴展性問題。
「反向代理層」毫不能替代「DNS輪詢」!

(1) 經過DNS輪詢來線性擴展入口lvs層的性能;
(2) 經過keepalived來保證高可用;
(3) 經過lvs來擴展多個Nginx;
(4) 經過Nginx來作負載均衡,業務七層路由;

總結
稍微作一個簡要的總結:
(1) 接入層架構要考慮的問題域爲:高可用、擴展性、反向代理、負載均衡;
(2) Nginx、keepalived、lvs、f5能夠很好的解決高可用、擴展性、反向代理、負載均衡的問題;
(3) 水平擴展scale out是解決擴展性問題的根本方案,DNS輪詢是不能徹底被Nginx/lvs/f5所替代的;

但願你們有收穫。

相關文章
相關標籤/搜索