Ngin專題五:深入理解負(fù)載均衡

1.前言

最近參加一個(gè)筆試的面試,題目很簡(jiǎn)單端辱,就是簡(jiǎn)述負(fù)載均衡的原理梁剔,以及你用過的哪些中間件實(shí)現(xiàn)了負(fù)載均衡,怎么實(shí)現(xiàn)的舞蔽,以及對(duì)應(yīng)的負(fù)載策略荣病,題目看似簡(jiǎn)單,其實(shí)不然喷鸽,如果你是一個(gè)高級(jí)或者資深java研發(fā)的話众雷,并不應(yīng)該止于表面,一個(gè)合格的高級(jí)java研發(fā),一定是一個(gè)業(yè)務(wù)的多面手砾省,一定可以結(jié)合實(shí)際業(yè)務(wù)給出合適的解決方案鸡岗;

2.負(fù)載均衡的由來

在業(yè)務(wù)初期,我們一般會(huì)先使用單臺(tái)服務(wù)器對(duì)外提供服務(wù)编兄。隨著業(yè)務(wù)流量越來越大轩性,單臺(tái)服務(wù)器無論如何優(yōu)化,無論采用多好的硬件狠鸳,總會(huì)有性能天花板揣苏,當(dāng)單服務(wù)器的性能無法滿足業(yè)務(wù)需求時(shí),就需要把多臺(tái)服務(wù)器組成集群系統(tǒng)提高整體的處理性能件舵;
基于上述需求卸察,我們要使用統(tǒng)一的流量入口來對(duì)外提供服務(wù),本質(zhì)上就是需要一個(gè)流量調(diào)度器铅祸,通過均衡的算法坑质,將用戶大量的請(qǐng)求流量均衡地分發(fā)到集群中不同的服務(wù)器上
使用負(fù)載均衡可以給我們帶來的幾個(gè)好處:
1.提高了系統(tǒng)的整體性能;
2.提高了系統(tǒng)的擴(kuò)展性临梗;
3.提高了系統(tǒng)的可用性涡扼;

3.負(fù)載均衡的類型

廣義上的負(fù)載均衡器大概可以分為 3 類,包括:DNS 方式實(shí)現(xiàn)負(fù)載均衡盟庞、硬件負(fù)載均衡吃沪、軟件負(fù)載均衡。

4. DNS實(shí)現(xiàn)負(fù)載均衡

DNS 實(shí)現(xiàn)負(fù)載均衡是最基礎(chǔ)簡(jiǎn)單的方式什猖。一個(gè)域名通過 DNS 解析到多個(gè) IP票彪,每個(gè) IP 對(duì)應(yīng)不同的服務(wù)器實(shí)例,這樣就完成了流量的調(diào)度卸伞,雖然沒有使用常規(guī)的負(fù)載均衡器抹镊,但實(shí)現(xiàn)了簡(jiǎn)單的負(fù)載均衡功能


image.png

通過 DNS 實(shí)現(xiàn)負(fù)載均衡的方式,最大的優(yōu)點(diǎn)就是實(shí)現(xiàn)簡(jiǎn)單荤傲,成本低,無需自己開發(fā)或維護(hù)負(fù)載均衡設(shè)備颈渊,不過存在一些缺點(diǎn):

  • 服務(wù)器故障切換延遲大遂黍,服務(wù)器升級(jí)不方便。(例如:業(yè)務(wù)服務(wù)故障俊嗽,DNS修改或者摘除故障服務(wù)器雾家,需要經(jīng)過運(yùn)營(yíng)商的DNS緩存,時(shí)效性會(huì)很慢)
  • 流量調(diào)度不均衡绍豁,粒度太粗(地區(qū)運(yùn)營(yíng)商不可能只服務(wù)你一家芯咧,背后服務(wù)了多少用戶,也會(huì)造成流量調(diào)度的不均勻)
  • 流量分配策略太簡(jiǎn)單,支持的算法太少敬飒。(DNS一般只支持輪詢的方式邪铲,流量分配策略比較簡(jiǎn)單,不支持權(quán)重无拗、Hash調(diào)度等算法)
  • DNS 支持的 IP 列表有限制(比如阿里的DNS 系統(tǒng)針對(duì)同一個(gè)域名支持配置 10 個(gè)不同的 IP 地址)
    備注:實(shí)際上生產(chǎn)環(huán)境中很少使用這種方式來實(shí)現(xiàn)負(fù)載均衡带到,畢竟缺點(diǎn)很明顯。文中之所以描述 DNS 負(fù)載均衡方式英染,是為了能夠更清楚地解釋負(fù)載均衡的概念揽惹;
    但是像 BAT 體量的公司一般會(huì)利用 DNS 來實(shí)現(xiàn)地理級(jí)別的全局負(fù)載均衡,實(shí)現(xiàn)就近訪問四康,提高訪問速度搪搏,這種方式一般是入口流量的基礎(chǔ)負(fù)載均衡,下層會(huì)有更專業(yè)的負(fù)載均衡設(shè)備實(shí)現(xiàn)的負(fù)載架構(gòu)

5.硬件負(fù)載均衡

硬件負(fù)載均衡是通過專門的硬件設(shè)備來實(shí)現(xiàn)負(fù)載均衡功能闪金,是專用的負(fù)載均衡設(shè)備疯溺。目前業(yè)界典型的硬件負(fù)載均衡設(shè)備有兩款:F5 和 A10
這類設(shè)備性能強(qiáng)勁、功能強(qiáng)大毕泌,但價(jià)格非常昂貴喝检,一般只有土豪公司才會(huì)使用此類設(shè)備,中小公司一般負(fù)擔(dān)不起撼泛,業(yè)務(wù)量沒那么大挠说,用這些設(shè)備也是挺浪費(fèi)的
硬件負(fù)載均衡的優(yōu)點(diǎn):
- 功能強(qiáng)大:全面支持各層級(jí)的負(fù)載均衡愿题,支持全面的負(fù)載均衡算法损俭。
- 性能強(qiáng)大:性能遠(yuǎn)超常見的軟件負(fù)載均衡器。
- 穩(wěn)定性高:商用硬件負(fù)載均衡潘酗,經(jīng)過了良好的嚴(yán)格測(cè)試杆兵,經(jīng)過大規(guī)模使用,穩(wěn)定性高仔夺。
- 安全防護(hù):還具備防火墻琐脏、防 DDoS 攻擊等安全功能,以及支持 SNAT 功能缸兔。

SNAT(源地址轉(zhuǎn)換):是源地址轉(zhuǎn)換,其作用是將ip數(shù)據(jù)包的源地址轉(zhuǎn)換成另外一個(gè)地址
硬件負(fù)載均衡的缺點(diǎn)也很明顯:
價(jià)格貴日裙;
擴(kuò)展性差,無法進(jìn)行擴(kuò)展和定制惰蜜;
調(diào)試和維護(hù)比較麻煩昂拂,需要專業(yè)人員;

6.軟件負(fù)載均衡(重點(diǎn))

軟件負(fù)載均衡抛猖,可以在普通的服務(wù)器上運(yùn)行負(fù)載均衡軟件格侯,實(shí)現(xiàn)負(fù)載均衡功能鼻听。目前常見的有 Nginx、HAproxy联四、LVS撑碴。
下面只介紹Nginx,原因是國(guó)內(nèi)公司使用最多碎连,其他只做了解即可灰羽;
nginx應(yīng)用場(chǎng)景之一就是負(fù)載均衡。在訪問量較多的時(shí)候鱼辙,可以通過負(fù)載均衡廉嚼,將多個(gè)請(qǐng)求分?jǐn)偟蕉嗯_(tái)服務(wù)器上,相當(dāng)于把一臺(tái)服務(wù)器需要承擔(dān)的負(fù)載量交給多臺(tái)服務(wù)器處理倒戏,進(jìn)而提高系統(tǒng)的吞吐率怠噪;另外如果其中某一臺(tái)服務(wù)器掛掉,其他服務(wù)器還可以正常提供服務(wù)杜跷,以此來提高系統(tǒng)的可伸縮性與可靠性

6.1 nginx負(fù)載均衡

image.png

6.1 Nginx負(fù)載均衡策略

以下截圖為nginx官網(wǎng)文檔


image.png

nginx內(nèi)置負(fù)載均衡策略主要分為三大類傍念,分別是輪詢、最少連接和ip hash

1.輪詢:以循環(huán)方式分發(fā)對(duì)應(yīng)用服務(wù)器的請(qǐng)求葛闷,將請(qǐng)求平均分發(fā)到每臺(tái)服務(wù)器上憋槐。

1.1輪詢實(shí)現(xiàn)方案
1.1.1普通輪詢方式
該方式是默認(rèn)方式,輪詢適合服務(wù)器配置相當(dāng)淑趾,無狀態(tài)且短平快的服務(wù)使用阳仔。另外在輪詢中,如果服務(wù)器掛掉扣泊,會(huì)自動(dòng)剔除該服務(wù)器近范。

http {
    # 定義轉(zhuǎn)發(fā)分配規(guī)則
    upstream myapp1 {
        server srv1.com; # 要轉(zhuǎn)發(fā)到的服務(wù)器,如ip延蟹、ip:端口號(hào)评矩、域名、域名:端口號(hào)
        server srv2.com:8088;
        server 192.168.0.100:8088;
    }

    server {
        listen 80; # nginx監(jiān)聽的端口

        location / {
            # 使用myapp1分配規(guī)則阱飘,即剛自定義添加的upstream節(jié)點(diǎn)
            # 將所有請(qǐng)求轉(zhuǎn)發(fā)到myapp1服務(wù)器組中配置的某一臺(tái)服務(wù)器上
            proxy_pass http://myapp1; 
        }
    }
}

1.1.2權(quán)重輪詢方式
如果在 upstream 中配置的server參數(shù)后追加 weight 配置斥杜,則會(huì)根據(jù)配置的權(quán)重進(jìn)行請(qǐng)求分發(fā)。此策略可以與least_conn和ip_hash結(jié)合使用沥匈,適合服務(wù)器的硬件配置差別比較大的情況果录。

# 定義轉(zhuǎn)發(fā)分配規(guī)則
upstream myapp1 {
    server srv1.com weight=1; # 該臺(tái)服務(wù)器接受1/6的請(qǐng)求量
    server srv2.com:8088 weight=2; # 該臺(tái)服務(wù)器接受2/6的請(qǐng)求量
    server 192.168.0.100:8088 weight=3; # 該臺(tái)服務(wù)器接受3/6的請(qǐng)求量;
}

2.最少連接

輪詢算法是把請(qǐng)求平均的轉(zhuǎn)發(fā)給各個(gè)后端,使它們的負(fù)載大致相同咐熙;但是,有些請(qǐng)求占用的時(shí)間很長(zhǎng)辨萍,會(huì)導(dǎo)致其所在的后端負(fù)載較高棋恼。這種情況下返弹,least_conn這種方式就可以達(dá)到更好的負(fù)載均衡效果,適合請(qǐng)求處理時(shí)間長(zhǎng)短不一造成服務(wù)器過載的情況爪飘。

# 定義轉(zhuǎn)發(fā)分配規(guī)則
upstream myapp1 {
    least_conn; # 把請(qǐng)求分派給連接數(shù)最少的服務(wù)器
    server srv1.com;
    server srv2.com:8088;
    server 192.168.0.100:8088;
}

3.ip hash (有針對(duì)的場(chǎng)景:)

這個(gè)方法確保了相同的客戶端請(qǐng)求一直發(fā)送到相同的服務(wù)器义起,這樣每個(gè)訪客都固定訪問一個(gè)后端服務(wù)器。如用戶需要分片上傳文件到服務(wù)器下师崎,然后再由服務(wù)器將分片合并默终,這時(shí)如果用戶的請(qǐng)求到達(dá)了不同的服務(wù)器,那么分片將存儲(chǔ)于不同的服務(wù)器目錄中犁罩,導(dǎo)致無法將分片合并齐蔽,該場(chǎng)景則需要使用ip hash策略。
備注:需要注意的是床估,ip_hash不能與backup同時(shí)使用含滴,另外當(dāng)有服務(wù)器需要剔除,必須手動(dòng)down掉丐巫,此模式適合有狀態(tài)服務(wù)谈况,比如session

# 定義轉(zhuǎn)發(fā)分配規(guī)則
upstream myapp1 {
    ip_hash; # #保證每個(gè)請(qǐng)求固定訪問一個(gè)后端服務(wù)器
    server srv1.com;
    server srv2.com:8088;
    server 192.168.0.100:8088;
}

參考鏈接:https://blog.csdn.net/guo_ridgepole/article/details/124517113

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市递胧,隨后出現(xiàn)的幾起案子碑韵,更是在濱河造成了極大的恐慌,老刑警劉巖缎脾,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祝闻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赊锚,警方通過查閱死者的電腦和手機(jī)治筒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舷蒲,“玉大人耸袜,你說我怎么就攤上這事∩剑” “怎么了堤框?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)纵柿。 經(jīng)常有香客問我蜈抓,道長(zhǎng),這世上最難降的妖魔是什么昂儒? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任沟使,我火速辦了婚禮,結(jié)果婚禮上渊跋,老公的妹妹穿的比我還像新娘腊嗡。我一直安慰自己着倾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布燕少。 她就那樣靜靜地躺著卡者,像睡著了一般。 火紅的嫁衣襯著肌膚如雪客们。 梳的紋絲不亂的頭發(fā)上崇决,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音底挫,去河邊找鬼恒傻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凄敢,可吹牛的內(nèi)容都是我干的碌冶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涝缝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼扑庞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拒逮,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤罐氨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后滩援,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栅隐,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年玩徊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了租悄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恩袱,死狀恐怖泣棋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畔塔,我是刑警寧澤潭辈,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站澈吨,受9級(jí)特大地震影響把敢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谅辣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一修赞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桑阶,春花似錦榔组、人聲如沸熙尉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至包归,卻和暖如春锨推,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背公壤。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工换可, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厦幅。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓沾鳄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親确憨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子译荞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容