接入層負載均衡策略——“反向代理層”絕不能替代“DNS輪詢”!
目錄
原文出處:http://wemedia.ifeng.com/90964503/wemedia.shtml
這篇文章對負載均衡架構寫的非常詳細,最近正在學習這塊,也在工程得到了實際應用。好文一定要轉,一定要學!!!
1、原文以兩個問題引出話題
問題一:DNS輪詢技術是不是過時了?
問題二:有了反向代理層(如Nginx、LVS、F5等),是不是 不需要DNS輪詢了?
我的回答是,DNS並未過時,並且反向代理層也不能替代DNS輪詢!
問題三:Nginx與LVS支援的最大併發數大約是多少?
在高併發情況下,Nginx 可支援高達50000個併發連線數的響應。
2、反向代理層的作用是什麼?架構實現時需要注意什麼問題?
(1) 作為服務端統一入口,遮蔽後端WEB叢集細節,代表整個WEB叢集;
話外音:這就是為啥它叫反向代理。
(2) 保證WEB叢集的擴充套件性,Nginx後端可隨時加WEB例項;
(3) 實施負載均衡,反向代理層會將請求均勻分發給後端WEB叢集的每一個例項;
(4) 保證WEB叢集的高可用,任何一個WEB例項掛了,服務都不受影響;
(5) 注意自身高可用
3、反向代理還存在的問題
反向代理層自身的擴充套件性問題並沒有得到很好的解決。但是,可以通過DNS輪詢解決。
例如,當Nginx成為系統瓶頸的時候,無法擴容。
4、DNS輪詢如何解決反向代理層的擴充套件性問題?
通過在DNS-server上對一個域名設定多個IP解析,能夠增加入口Nginx例項個數,起到水平擴容的作用,解決反向代理層的擴充套件性問題。
因此,反向代理和DNS輪詢並不是互斥的技術。然而,這裡詳細展開講一下接入層的架構漸進歷程。
4.1 、裸奔時代:單機架構
裸奔時代的架構圖如上:
(1) 瀏覽器通過DNS-server,域名解析到ip;
(2) 瀏覽器通過ip訪問web-server;
缺點:
(1) 非高可用,web-server掛了整個系統就掛了;
(2) 擴充套件性差,當吞吐量達到web-server上限時,無法擴容;
話外音:單機不涉及負載均衡問題。
4.2、簡易擴容方案:DNS輪詢
假設tomcat的吞吐量是1000次每秒,當系統總吞吐量達到3000時,如何擴容是首先要解決的問題,DNS輪詢是一個很容易想到的方案。
話外音:DNS輪詢解決擴充套件性問題。
此時的架構圖如上:
(1) 多部署幾份web-server,1個tomcat抗1000,部署3個tomcat就能抗3000;
(2) 在DNS-server層面,域名每次解析到不同的ip;
優點:
(1) 成本低:在DNS-server上多配幾個ip即可,功能也不收費;
(2) 部署簡單:多部署幾個web-server即可,原系統架構不需要做任何改造,新增的Web伺服器只要增加一個公網IP即可。
缺點:
(1) 健康檢查:如果某臺伺服器宕機,DNS伺服器是無法知曉的,仍舊會將訪問分配到此伺服器。修改DNS記錄全部生效起碼要3-4小時,甚至更久;
(2) 負載不均:如果幾臺Web伺服器之間的配置不同,能夠承受的壓力也就不同,但是DNS解析分配的訪問卻是均勻分配的。其實DNS也是有分配演算法的,可以根據當前連線較少的分配、可以設定Rate權重分配等等;
(3) 會話保持:如果是需要身份驗證的網站,在不修改軟體構架的情況下,這點是比較致命的,因為DNS解析無法將驗證使用者的訪問持久分配到同一伺服器。雖然有一定的本地DNS快取,但是很難保證在使用者訪問期間,本地DNS不過期,而重新查詢伺服器並指向新的伺服器,那麼原伺服器儲存的使用者資訊是無法被帶到新伺服器的,而且可能要求被重新認證身份,來回切換時間長了各臺伺服器都儲存有使用者不同的資訊,對伺服器資源也是一種浪費。
(4) 擴容非實時:DNS解析有一個生效週期;
(3) 暴露了太多的外網ip。
“DNS輪詢” 更多:負載均衡手段之DNS輪詢、DNS如何實現全域性負載均衡?
4.3、簡易擴容方案:反向代理Nginx
tomcat的效能較差,但Nginx作為反向代理的效能就強很多,假設線上跑到1w,就比tomcat高了10倍,可以利用這個特性來做擴容。
此時的架構圖如上:
(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.4、高可用方案:keepalived
為了解決高可用的問題,keepalived出場了。
(1) 做兩臺Nginx組成一個叢集,分別部署上keepalived,設定成相同的虛IP,保證Nginx的高可用;
(2) 當一臺Nginx掛了,keepalived能夠探測到,並將流量自動遷移到另一臺Nginx上,整個過程對呼叫方透明;
優點:
(1) 解決了高可用的問題;
話外音:反向代理的高可用也解決了。
缺點:
(1) 資源利用率只有50%;
(2) Nginx仍然是接入單點,如果接入吞吐量超過的Nginx的效能上限怎麼辦,例如qps達到了50000咧?
4.5、scale up擴容方案:LVS/F5
Nginx是應用軟體,效能比tomcat好,但總有個上限,超出了上限,還是扛不住。
LVS就不一樣了,它實施在作業系統層面;F5的效能又更好了,它實施在硬體層面;它們效能比Nginx好很多,例如每秒可以抗10w,這樣可以利用他們來擴容,常見的架構圖如下:
(1) 如果通過Nginx可以擴充套件多個tomcat一樣,可以通過LVS來擴充套件多個Nginx;
(2) 通過Keepalived+VIP的方案可以保證可用性;
99.9999%的公司到這一步基本就結束了,解決了接入層高可用、擴充套件性、負載均衡的問題。
話外音:上游再加一層擴充效能。
完美了嘛,還有什麼潛在問題?
好吧,不管是使用lvs還是f5,這些都是scale up的方案,根本上,lvs/f5還是會有效能上限,假設每秒能處理10w的請求,一天也只能處理80億的請求(10w秒吞吐量*8w秒),那萬一系統的日PV超過80億怎麼辦呢?
4.6、scale out擴容方案:DNS輪詢
如之前文章所述,水平擴充套件,才是解決效能問題的根本方案,能夠通過加機器擴充效能的方案才具備最好的擴充套件性。
facebook,google,baidu的PV是不是超過80億呢,它們的域名只對應一個ip麼,終點又是起點,還是得通過DNS輪詢來進行擴容。
話外音:DNS輪詢解決擴充套件性問題。
(1) 通過DNS輪詢來線性擴充套件入口lvs層的效能;
(2) 通過keepalived來保證高可用;
(3) 通過lvs來擴充套件多個Nginx;
(4) 通過Nginx來做負載均衡,業務七層路由。
5、總結
稍微做一個簡要的總結:
(1) 接入層架構要考慮的問題域為:高可用、擴充套件性、反向代理、負載均衡;
(2) Nginx、keepalived、lvs、f5可以很好的解決高可用、擴充套件性、反向代理、負載均衡的問題;
(3) 水平擴充套件scale out是解決擴充套件性問題的根本方案,DNS輪詢是不能完全被Nginx/lvs/f5所替代的。
更多內容:
關於DNS域名解析:負載均衡之DNS域名解析、DNS原理及其解析過程、DNS原理總結及其解析過程詳解