上一篇文章「一分鐘瞭解負載均衡的一切」引發了很多同窗的關注,評論中你們爭論的比較多的一個技術點是接入層負載均衡技術,部分同窗持這樣的觀點:前端
1)nginx前端加入lvs和keepalived能夠替代「DNS輪詢」linux
2)F5能搞定接入層高可用、擴展性、負載均衡,能夠替代「DNS輪詢」nginx
「DNS輪詢」到底是不是過期的技術,是否是能夠被其餘方案替代,接入層架構技術演進,是本文將要細緻討論的內容。web
nginx、lvs、keepalived、f五、DNS輪詢,往往提到這些技術,每每討論的是接入層的這樣幾個問題:後端
1)可用性:任何一臺機器掛了,服務受不受影響瀏覽器
2)擴展性:可否經過增長機器,擴充系統的性能tomcat
3)反向代理+負載均衡:請求是否均勻分攤到後端的操做單元執行服務器
因爲每一個技術人的背景和知識域不一樣,上面那些名詞縮寫(運維的同窗再熟悉不過了),仍是花1分鐘簡單說明一下(詳細請自行「百度」):架構
1)nginx:一個高性能的web-server和實施反向代理的軟件負載均衡
2)lvs:Linux Virtual Server,使用集羣技術,實如今linux操做系統層面的一個高性能、高可用、負載均衡服務器
3)keepalived:一款用來檢測服務狀態存活性的軟件,經常使用來作高可用
4)f5:一個高性能、高可用、負載均衡的硬件設備(聽上去和lvs功能差很少?)
5)DNS輪詢:經過在DNS-server上對一個域名設置多個ip解析,來擴充web-server性能及實施負載均衡的技術
裸奔時代的架構圖如上:
1)瀏覽器經過DNS-server,域名解析到ip
2)瀏覽器經過ip訪問web-server
1)非高可用,web-server掛了整個系統就掛了
2)擴展性差,當吞吐量達到web-server上限時,沒法擴容
注:單機不涉及負載均衡的問題
假設tomcat的吞吐量是1000次每秒,當系統總吞吐量達到3000時,如何擴容是首先要解決的問題,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
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掛了怎麼辦?
爲了解決高可用的問題,keepalived出場了(以前的文章「使用shadow-master保證系統可用性」詳細介紹過):
此時:
1)作兩臺nginx組成一個集羣,分別部署上keepalived,設置成相同的虛IP,保證nginx的高可用
2)當一臺nginx掛了,keepalived可以探測到,並將流量自動遷移到另外一臺nginx上,整個過程對調用方透明
1)解決了高可用的問題
1)資源利用率只有50%
2)nginx仍然是接入單點,若是接入吞吐量超過的nginx的性能上限怎麼辦,例如qps達到了50000咧?
【scale up擴容方案(4)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億怎麼辦呢?(好吧,沒幾個公司要考慮這個問題)
【scale out擴容方案(5)DNS輪詢】
如以前文章所述,水平擴展,纔是解決性能問題的根本方案,可以經過加機器擴充性能的方案才具有最好的擴展性。
facebook,google,baidu的PV是否是超過80億呢,它們的域名只對應一個ip麼,終點又是起點,仍是得經過DNS輪詢來進行擴容:
此時:
1)經過DNS輪詢來線性擴展入口lvs層的性能
2)經過keepalived來保證高可用
3)經過lvs來擴展多個nginx
4)經過nginx來作負載均衡,業務七層路由
聊了這麼多,稍微作一個簡要的總結:
1)接入層架構要考慮的問題域爲:高可用、擴展性、反向代理+擴展均衡
2)nginx、keepalived、lvs、f5能夠很好的解決高可用、擴展性、反向代理+擴展均衡的問題
3)水平擴展scale out是解決擴展性問題的根本方案,DNS輪詢是不能徹底被nginx/lvs/f5所替代的
末了,上一篇文章有同窗留言問58到家採用什麼方案,58到家目前部署在阿里雲上,前端購買了SLB服務(能夠先粗暴的認爲是一個lvs+keepalived的高可用負載均衡服務),後端是nginx+tomcat。
接入層講了這麼多,下一章,準備講講服務層「異構服務的負載均」(牛逼的機器應該分配更多的流量,如何作到?)。
但願你們有收穫,轉發一篇文章只須要3秒鐘,求3秒。
==【完】==