今天的問題是:負載均衡是為了解決什么問題?有哪幾種實現負載均衡的方式?
解決的問題
把用戶的請求分發到多台服務器(更多的資源),解決高並發的問題。
硬件負載均衡
成本比較高,並發數在百萬級別,比如F5;
軟件負載均衡
HTTP重定向負載均衡
負載均衡過程如上圖:
1 請求到負載均衡服務器,
2 根據均衡算法,返回304,重定向到實際負責計算的服務器ip到瀏覽器,
3 然后瀏覽器直接請求實際負責計算的服務器,
4 最后實際計算的服務器響應到客戶端瀏覽器。
缺點:
1,請求經過兩次服務器(負載均衡服務器,實際計算服務器),增加了響應時間。
2,暴露了實際負載的服務器公網ip到瀏覽器,安全性比較低。
java代碼實現:
response.sendRedirct("http://ip/xxxService?parama=a");
DNS負載均衡
負載均衡過程如上圖:
1, 用戶請求域名,請求到DNS服務器;
2,DNS服務返回解析的IP地址到客戶端;並不暴露到瀏覽器進行重定向;
3,客戶端拿到返回的負責計算的服務器IP,請求服務器;
4,計算服務器返回響應信息;
改進:
1,不用每次都請求負載的ip,可以緩存起來,重復使用,提高性能;
2,dns不用暴露實際計算的服務器ip(不是采用重定向的方式暴露在瀏覽器,而且做了二次負載均衡,內網的IP不會暴露出來),安全性略好;
異地多活采用的這種方式,一個ip解析到不同區域的IP,實現第一層級的負載均衡,然后基於區域ip做二級的負載均衡;
反向代理負載均衡
負載均衡過程如下:
1,客戶端發起請求到負載均衡服務器,負載均衡服務器根據算法得到負載的IP;
2,負載均衡服務器構造請求,請求內網負載的計算服務器;
3, 計算服務器返回響應結果到負載均衡服務器;
4,負載均衡服務器返回響應結果給到客戶端。
比如nginx, apache
缺點:基於http層做的負載均衡,是一個比較重的協議,效率略低;
一般適用於比較小的集群,10+規模;
IP層的負載均衡
對網絡層的IP地址進行替換,不需要在http層工作,直接在操作系統內核的IP數據包中替換地址。效率比基於HTTP層的反向代理高。
負載均衡過程:
1,客戶端請求負載均衡服務器;
2,負載均衡服務器修改目的ip為內網機器的IP ;
3, 內網機器計算完畢,響應的IP改為負載均衡服務器ip的內網地址;
4,負載均衡服務器修改響應的IP為自己的外網IP ,返回結果給到客戶端;
缺點:
請求和響應度需要經過負載均衡服務器進行ip層替換,響應數據會成為后期的瓶頸。
數據鏈路層負載均衡
解決響應數據體量過大效率低的問題。
通過修改數據鏈路層的mac地址,ip使用的是虛擬IP,來實現負載均衡。
負載均衡過程:
1,客戶端請求負載均衡服務器;
2,負載均衡服務器替換mac地址為計算服務器,Ip為負載均衡服務器ip;
3, 計算服務器直接響應數據到客戶端;
這種負載均衡方式吞吐量最高,大型互聯網公司都是采用這種負載均衡方式。
LVS負載均衡是結合了IP層和數據鏈路層的負載均衡方式。linux通過配置可以實現這兩種負載均衡方式。
小結
本篇從負載均衡出發的目的出發,即為了應對高並發,把請求分攤到更多的服務器上。
從簡單到復雜,依次介紹了HTTP重定向實現負載均衡,DNS實現負載均衡,反向代理實現負載均衡,IP層實現負載均衡,數據鏈路層實現負載均衡。一圖勝千言,給出了負載均衡的過程。
一般常用的是DNS和數據鏈路層負載均衡。
原創不易,點贊關注支持一下吧!轉載請注明出處,讓我們互通有無,共同進步,歡迎溝通交流。
我會持續分享Java軟件編程知識和程序員發展職業之路,歡迎關注,我整理了這些年編程學習的各種資源,關注公眾號‘李福春持續輸出’,發送'學習資料'分享給你!