什么是負載均衡(Load balancing)
在網(wǎng)站創(chuàng)立初期,我們一般都使用單臺機器對臺提供集中式服務(wù)髓考,但隨著業(yè)務(wù)量越來越大影暴,無論性能還是穩(wěn)定性上都有了更大的挑戰(zhàn)。
這時候我們就會想到通過擴容的方式來提供更好的服務(wù)及穗。我們一般會把多臺機器組成一個集群對外提供服務(wù)。
然而绵载,我們的網(wǎng)站對外提供的訪問入口都是一個的埂陆,比如www.taobao.com苛白。
那么當(dāng)用戶在瀏覽器輸入 www.taobao.com 的時候如何將用戶的請求分發(fā)到集群中不同的機器上呢,這就是負載均衡在做的事情焚虱。
當(dāng)前大多數(shù)的互聯(lián)網(wǎng)系統(tǒng)都使用了服務(wù)器集群技術(shù)购裙,集群即將相同服務(wù)部署在多臺服務(wù)器上構(gòu)成一個集群整體對外提供服務(wù),這些集群可以是 Web 應(yīng)用服務(wù)器集群鹃栽,也可以是數(shù)據(jù)庫服務(wù)器集群躏率,還可以是分布式緩存服務(wù)器集群等。
在實際應(yīng)用中民鼓,在 Web 服務(wù)器集群之前總會有一臺負載均衡服務(wù)器薇芝,負載均衡設(shè)備的任務(wù)就是作為 Web 服務(wù)器流量的入口,挑選最合適的一臺 Web 服務(wù)器丰嘉,將客戶端的請求轉(zhuǎn)發(fā)給它處理夯到,實現(xiàn)客戶端到真實服務(wù)端的透明轉(zhuǎn)發(fā)。
最近幾年很火的「云計算」以及分布式架構(gòu)饮亏,本質(zhì)上也是將后端服務(wù)器作為計算資源耍贾、存儲資源,由某臺管理服務(wù)器封裝成一個服務(wù)對外提供路幸,客戶端不需要關(guān)心真正提供服務(wù)的是哪臺機器荐开,在它看來,就好像它面對的是一臺擁有近乎無限能力的服務(wù)器简肴,而本質(zhì)上晃听,真正提供服務(wù)的是后端的集群。
軟件負載解決的兩個核心問題是:選誰着帽、轉(zhuǎn)發(fā)杂伟,其中最著名的是 LVS(Linux Virtual Server)。
一個典型的互聯(lián)網(wǎng)應(yīng)用的拓撲結(jié)構(gòu)是這樣的:
負載均衡分類
現(xiàn)在我們知道仍翰,負載均衡就是一種計算機網(wǎng)絡(luò)技術(shù)赫粥,用來在多個計算機(計算機集群)、網(wǎng)絡(luò)連接予借、CPU越平、磁碟驅(qū)動器或其它資源中分配負載,以達到最佳化資源使用灵迫、最大化吞吐率秦叛、最小化響應(yīng)時間、同時避免過載的目的瀑粥。
那么挣跋,這種計算機技術(shù)的實現(xiàn)方式有多種。
大致可以分為以下幾種狞换,其中最常用的是四層和七層負載均衡:
二層負載均衡
負載均衡服務(wù)器對外依然提供一個 VIP(虛IP)避咆,集群中不同的機器采用相同 IP地址舟肉,但機器的 MAC 地址不一樣。
當(dāng)負載均衡服務(wù)器接受到請求之后查库,通過改寫報文的目標(biāo) MAC 地址的方式將請求轉(zhuǎn)發(fā)到目標(biāo)機器實現(xiàn)負載均衡路媚。
三層負載均衡
和二層負載均衡類似,負載均衡服務(wù)器對外依然提供一個 VIP(虛IP)樊销,但集群中不同的機器采用不同的 IP 地址整慎。
當(dāng)負載均衡服務(wù)器接受到請求之后,根據(jù)不同的負載均衡算法围苫,通過 IP 將請求轉(zhuǎn)發(fā)至不同的真實服務(wù)器裤园。
四層負載均衡
四層負載均衡工作在 OSI 模型的傳輸層,由于在傳輸層剂府,只有 TCP/UDP 協(xié)議比然,這兩種協(xié)議中除了包含源 IP、目標(biāo) IP 以外周循,還包含源端口號及目的端口號。
四層負載均衡服務(wù)器在接受到客戶端請求后万俗,以后通過修改數(shù)據(jù)包的地址信息( IP+端口號 )將流量轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器湾笛。
七層負載均衡
七層負載均衡工作在 OSI 模型的應(yīng)用層,應(yīng)用層協(xié)議較多闰歪,常用 HTTP嚎研、Radius、DNS 等库倘。七層負載就可以基于這些協(xié)議來負載临扮。
這些應(yīng)用層協(xié)議中會包含很多有意義的內(nèi)容。
比如同一個 Web 服務(wù)器的負載均衡教翩,除了根據(jù) IP 加端口進行負載外杆勇,還可根據(jù)七層的 URL、瀏覽器類別饱亿、語言來決定是否要進行負載均衡蚜退。
圖:四層和七層負載均衡
對于一般的應(yīng)用來說,有了 Nginx 就夠了彪笼。
Nginx 可以用于七層負載均衡钻注。
但是對于一些大的網(wǎng)站,一般會采用 DNS+四層負載+七層負載的方式進行多層次負載均衡配猫。
常用負載均衡工具
硬件負載均衡性能優(yōu)越幅恋,功能全面,但價格昂貴泵肄,一般適合初期或者土豪級公司長期使用捆交。
因此軟件負載均衡在互聯(lián)網(wǎng)領(lǐng)域大量使用淑翼。常用的軟件負載均衡軟件有 Nginx、LVS零渐、HaProxy 等窒舟。
Nginx/LVS/HAProxy 是目前使用最廣泛的三種負載均衡軟件。
1诵盼、 LVS
LVS(Linux Virtual Server)惠豺,也就是 Linux 虛擬服務(wù)器,是一個由章文嵩博士發(fā)起的自由軟件項目风宁。
使用 LVS 技術(shù)要達到的目標(biāo)是:通過 LVS 提供的負載均衡技術(shù)和 Linux 操作系統(tǒng)實現(xiàn)一個高性能洁墙、高可用的服務(wù)器群集,它具有良好可靠性戒财、可擴展性和可操作性热监。
從而以低廉的成本實現(xiàn)最優(yōu)的服務(wù)性能。
LVS 主要用來做四層負載均衡饮寞。
LVS 架構(gòu)
LVS 架設(shè)的服務(wù)器集群系統(tǒng)由三個部分組成:最前端的負載均衡層(Loader Balancer)孝扛,中間的服務(wù)器群組層,用 Server Array 表示幽崩,最底層的數(shù)據(jù)共享存儲層苦始,用 Shared Storage 表示。
在用戶看來所有的應(yīng)用都是透明的慌申,用戶只是在使用一個虛擬服務(wù)器提供的高性能服務(wù)陌选。
LVS 的各個層次的詳細介紹:
Load Balancer 層:位于整個集群系統(tǒng)的最前端,有一臺或者多臺負載調(diào)度器(Director Server)組成蹄溉,LVS 模塊就安裝在 Director Server上咨油,而 Director 的主要作用類似于一個路由器,它含有完成 LVS 功能所設(shè)定的路由表柒爵,通過這些路由表把用戶的請求分發(fā)給 Server Array 層的應(yīng)用服務(wù)器(Real Server)上役电。
同時,在 Director Server 上還要安裝對 Real Server 服務(wù)的監(jiān)控模塊 Ldirectord棉胀,此模塊用于監(jiān)測各個 Real Server 服務(wù)的健康狀況宴霸。在 Real Server 不可用時把它從 LVS 路由表中剔除,恢復(fù)時重新加入膏蚓。
Server Array 層:由一組實際運行應(yīng)用服務(wù)的機器組成瓢谢,Real Server 可以是 Web 服務(wù)器、Mail 服務(wù)器驮瞧、FTP 服務(wù)器氓扛、DNS 服務(wù)器、視頻服務(wù)器中的一個或者多個,每個 Real Server 之間通過高速的 LAN 或分布在各地的 WAN 相連接采郎。
在實際的應(yīng)用中千所,Director Server 也可以同時兼任 Real Server 的角色。
Shared Storage 層:是為所有 Real Server 提供共享存儲空間和內(nèi)容一致性的存儲區(qū)域蒜埋,在物理上一般由磁盤陣列設(shè)備組成淫痰,為了提供內(nèi)容的一致性,一般可以通過 NFS 網(wǎng)絡(luò)文件系統(tǒng)共享數(shù) 據(jù)整份,但 NFS 在繁忙的業(yè)務(wù)系統(tǒng)中待错,性能并不是很好,此時可以采用集群文件系統(tǒng)烈评,例如 Redhat 的 GFS 文件系統(tǒng)火俄、Oracle 提供的 OCFS2 文件系統(tǒng)等。
從整個 LVS 結(jié)構(gòu)可以看出讲冠,Director Server 是整個 LVS 的核心瓜客,目前用于 Director Server 的操作系統(tǒng)只能是 Linux 和 FreeBSD,Linux 2.6 內(nèi)核不用任何設(shè)置就可以支持 LVS 功能竿开,而 FreeBSD 作為 Director Server 的應(yīng)用還不是很多谱仪,性能也不是很好。
對于 Real Server否彩,幾乎可以是所有的系統(tǒng)平臺芽卿,Linux、windows胳搞、Solaris、AIX称杨、BSD 系列都能很好地支持肌毅。
2、Nginx
Nginx(發(fā)音同 engine x)是一個網(wǎng)頁服務(wù)器姑原,它能反向代理 HTTP悬而、HTTPS,、SMTP锭汛、POP3笨奠、IMAP的協(xié)議鏈接,以及一個負載均衡器和一個HTTP緩存唤殴。
Nginx 主要用來做七層負載均衡般婆。
并發(fā)性能:官方支持每秒 5 萬并發(fā),實際國內(nèi)一般到每秒 2 萬并發(fā)朵逝,有優(yōu)化到每秒 10 萬并發(fā)的蔚袍。具體性能看應(yīng)用場景。
特點:
模塊化設(shè)計:良好的擴展性,可以通過模塊方式進行功能擴展啤咽。
高可靠性:主控進程和 worker 是同步實現(xiàn)的晋辆,一個 worker 出現(xiàn)問題,會立刻啟動另一個 worker宇整。
內(nèi)存消耗低:一萬個長連接(keep-alive),僅消耗 2.5 MB 內(nèi)存瓶佳。
支持熱部署:不用停止服務(wù)器,實現(xiàn)更新配置文件鳞青,更換日志文件霸饲、更新服務(wù)器程序版本。
并發(fā)能力強:官方數(shù)據(jù)每秒支持 5 萬并發(fā)盼玄;
功能豐富:優(yōu)秀的反向代理功能和靈活的負載均衡策略
Nginx 的基本工作模式
一個 master 進程贴彼,生成一個或者多個 worker 進程。但這里 master 是使用 root 身份啟動的埃儿,因為 Nginx 要工作在 80 端口器仗。而只有管理員才有權(quán)限啟動小于低于 1023 的端口。
master 主要是負責(zé)的作用只是啟動 worker童番,加載配置文件精钮,負責(zé)系統(tǒng)的平滑升級。其它的工作是交給 worker剃斧。
那當(dāng) worker 被啟動之后轨香,也只是負責(zé)一些 web 最簡單的工作,而其它的工作都是由 worker 中調(diào)用的模塊來實現(xiàn)的幼东。
模塊之間是以流水線的方式實現(xiàn)功能的臂容。流水線,指的是一個用戶請求根蟹,由多個模塊組合各自的功能依次實現(xiàn)完成的脓杉。
比如:第一個模塊只負責(zé)分析請求首部,第二個模塊只負責(zé)查找數(shù)據(jù)简逮,第三個模塊只負責(zé)壓縮數(shù)據(jù)球散,依次完成各自工作。來實現(xiàn)整個工作的完成散庶。
它們是如何實現(xiàn)熱部署的呢蕉堰?是這樣的,我們前面說 master 不負責(zé)具體的工作悲龟,而是調(diào)用 worker 工作屋讶,它只是負責(zé)讀取配置文件,因此當(dāng)一個模塊修改或者配置文件發(fā)生變化须教,是由 master 進行讀取丑婿,因此此時不會影響到 worker 工作。
在 master 進行讀取配置文件之后,不會立即把修改的配置文件告知 worker 羹奉。而是讓被修改的 worker 繼續(xù)使用老的配置文件工作秒旋,當(dāng) worker 工作完畢之后,直接當(dāng)?shù)暨@個子進程诀拭,更換新的子進程迁筛,使用新的規(guī)則。
3耕挨、HAProxy
HAProxy 也是使用較多的一款負載均衡軟件细卧。HAProxy 提供高可用性、負載均衡以及基于 TCP 和 HTTP 應(yīng)用的代理筒占,支持虛擬主機贪庙,是免費、快速并且可靠的一種解決方案翰苫。
特別適用于那些負載特大的 Web站點止邮。運行模式使得它可以很簡單安全的整合到當(dāng)前的架構(gòu)中,同時可以保護你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上奏窑。
HAProxy 是一個使用 C 語言編寫的自由及開放源代碼軟件导披,其提供高可用性、負載均衡埃唯,以及基于 TCP 和 HTTP 的應(yīng)用程序代理撩匕。
Haproxy 主要用來做七層負載均衡。
常見負載均衡算法
上面介紹負載均衡技術(shù)的時候提到過墨叛,負載均衡服務(wù)器在決定將請求轉(zhuǎn)發(fā)到具體哪臺真實服務(wù)器時止毕,是通過負載均衡算法來實現(xiàn)的。
負載均衡算法可以分為兩類:靜態(tài)負載均衡算法和動態(tài)負載均衡算法漠趁。
靜態(tài)負載均衡算法包括:輪詢扁凛、比率、優(yōu)先權(quán)棚潦。
動態(tài)負載均衡算法包括:最少連接數(shù)、最快響應(yīng)速度膝昆、觀察方法丸边、預(yù)測法、動態(tài)性能分配荚孵、動態(tài)服務(wù)器補充妹窖、服務(wù)質(zhì)量、服務(wù)類型收叶、規(guī)則模式骄呼。
輪詢(Round Robin):順序循環(huán)將請求一次順序循環(huán)地連接每個服務(wù)器。當(dāng)其中某個服務(wù)器發(fā)生第二到第 7 層的故障,BIG-IP 就把其從順序循環(huán)隊列中拿出蜓萄,不參加下一次的輪詢隅茎,直到其恢復(fù)正常。
以輪詢的方式依次請求調(diào)度不同的服務(wù)器嫉沽;實現(xiàn)時辟犀,一般為服務(wù)器帶上權(quán)重;這樣有兩個好處:針對服務(wù)器的性能差異可分配不同的負載绸硕;當(dāng)需要將某個結(jié)點剔除時堂竟,只需要將其權(quán)重設(shè)置為0即可;
優(yōu)點:實現(xiàn)簡單玻佩、高效出嘹;易水平擴展
缺點:請求到目的結(jié)點的不確定,造成其無法適用于有寫的場景(緩存咬崔,數(shù)據(jù)庫寫)
應(yīng)用場景:數(shù)據(jù)庫或應(yīng)用服務(wù)層中只有讀的場景
隨機方式:請求隨機分布到各個結(jié)點税稼;在數(shù)據(jù)足夠大的場景能達到一個均衡分布;
優(yōu)點:實現(xiàn)簡單刁赦、易水平擴展
缺點:同 Round Robin娶聘,無法用于有寫的場景
應(yīng)用場景:數(shù)據(jù)庫負載均衡,也是只有讀的場景
哈希方式:根據(jù) key 來計算需要落在的結(jié)點上甚脉,可以保證一個同一個鍵一定落在相同的服務(wù)器上丸升;
優(yōu)點:相同 key 一定落在同一個結(jié)點上,這樣就可用于有寫有讀的緩存場景
缺點:在某個結(jié)點故障后牺氨,會導(dǎo)致哈希鍵重新分布狡耻,造成命中率大幅度下降
解決:一致性哈希 or 使用 keepalived 保證任何一個結(jié)點的高可用性,故障后會有其它結(jié)點頂上來
應(yīng)用場景:緩存猴凹,有讀有寫
一致性哈希:在服務(wù)器一個結(jié)點出現(xiàn)故障時夷狰,受影響的只有這個結(jié)點上的 key,最大程度的保證命中率郊霎;如 twemproxy 中的 ketama方案沼头;生產(chǎn)實現(xiàn)中還可以規(guī)劃指定子 key 哈希,從而保證局部相似特征的鍵能分布在同一個服務(wù)器上书劝;
優(yōu)點:結(jié)點故障后命中率下降有限
應(yīng)用場景:緩存
根據(jù)鍵的范圍來負載:根據(jù)鍵的范圍來負載进倍,前 1 億個鍵都存放到第一個服務(wù)器,1~2 億在第二個結(jié)點购对。
優(yōu)點:水平擴展容易猾昆,存儲不夠用時,加服務(wù)器存放后續(xù)新增數(shù)據(jù)
缺點:負載不均骡苞;數(shù)據(jù)庫的分布不均衡垂蜗;
(數(shù)據(jù)有冷熱區(qū)分楷扬,一般最近注冊的用戶更加活躍,這樣造成后續(xù)的服務(wù)器非常繁忙贴见,而前期的結(jié)點空閑很多)
適用場景:數(shù)據(jù)庫分片負載均衡
根據(jù)鍵對服務(wù)器結(jié)點數(shù)取模來負載:根據(jù)鍵對服務(wù)器結(jié)點數(shù)取模來負載烘苹;比如有 4 臺服務(wù)器,key 取模為 0 的落在第一個結(jié)點蝇刀,1 落在第二個結(jié)點上螟加。
優(yōu)點:數(shù)據(jù)冷熱分布均衡,數(shù)據(jù)庫結(jié)點負載均衡分布吞琐;
缺點:水平擴展較難捆探;
適用場景:數(shù)據(jù)庫分片負載均衡
純動態(tài)結(jié)點負載均衡:根據(jù) CPU、IO站粟、網(wǎng)絡(luò)的處理能力來決策接下來的請求如何調(diào)度黍图。
優(yōu)點:充分利用服務(wù)器的資源,保證個結(jié)點上負載處理均衡
缺點:實現(xiàn)起來復(fù)雜奴烙,真實使用較少
不用主動負載均衡:使用消息隊列轉(zhuǎn)為異步模型助被,將負載均衡的問題消滅;負載均衡是一種推模型切诀,一直向你發(fā)數(shù)據(jù)揩环,那么將所有的用戶請求發(fā)到消息隊列中,所有的下游結(jié)點誰空閑幅虑,誰上來取數(shù)據(jù)處理丰滑;轉(zhuǎn)為拉模型之后,消除了對下行結(jié)點負載的問題倒庵。
優(yōu)點:通過消息隊列的緩沖褒墨,保護后端系統(tǒng),請求劇增時不會沖垮后端服務(wù)器擎宝;水平擴展容易郁妈,加入新結(jié)點后,直接取 queue 即可绍申;
缺點:不具有實時性噩咪;
應(yīng)用場景:不需要實時返回的場景;比如极阅,12036 下訂單后胃碾,立刻返回提示信息:您的訂單進去排隊了...等處理完畢后,再異步通知涂屁;
比率(Ratio):給每個服務(wù)器分配一個加權(quán)值為比例书在,根椐這個比例灰伟,把用戶的請求分配到每個服務(wù)器拆又。當(dāng)其中某個服務(wù)器發(fā)生第 2 到第 7 層的故障儒旬,BIG-IP 就把其從服務(wù)器隊列中拿出,不參加下一次的用戶請求的分配帖族,直到其恢復(fù)正常栈源。
優(yōu)先權(quán)(Priority):給所有服務(wù)器分組,給每個組定義優(yōu)先權(quán)竖般,BIG-IP 用戶的請求甚垦,分配給優(yōu)先級最高的服務(wù)器組(在同一組內(nèi),采用輪詢或比率算法涣雕,分配用戶的請求)艰亮;當(dāng)最高優(yōu)先級中所有服務(wù)器出現(xiàn)故障,BIG-IP 才將請求送給次優(yōu)先級的服務(wù)器組挣郭。這種方式迄埃,實際為用戶提供一種熱備份的方式。
最少的連接方式(Least Connection):傳遞新的連接給那些進行最少連接處理的服務(wù)器兑障。當(dāng)其中某個服務(wù)器發(fā)生第 2 到第 7 層的故障侄非,BIG-IP 就把其從服務(wù)器隊列中拿出,不參加下一次的用戶請求的分配流译,直到其恢復(fù)正常逞怨。
最快模式(Fastest):傳遞連接給那些響應(yīng)最快的服務(wù)器。當(dāng)其中某個服務(wù)器發(fā)生第二到第7 層的故障福澡,BIG-IP 就把其從服務(wù)器隊列中拿出叠赦,不參加下一次的用戶請求的分配,直到其恢復(fù)正常竞漾。
觀察模式(Observed):連接數(shù)目和響應(yīng)時間以這兩項的最佳平衡為依據(jù)為新的請求選擇服務(wù)器眯搭。當(dāng)其中某個服務(wù)器發(fā)生第二到第 7 層的故障,BIG-IP 就把其從服務(wù)器隊列中拿出业岁,不參加下一次的用戶請求的分配鳞仙,直到其恢復(fù)正常。
預(yù)測模式(Predictive):BIG-IP 利用收集到的服務(wù)器當(dāng)前的性能指標(biāo)笔时,進行預(yù)測分析棍好,選擇一臺服務(wù)器在下一個時間片內(nèi),其性能將達到最佳的服務(wù)器相應(yīng)用戶的請求允耿。(被 BIG-IP 進行檢測)
動態(tài)性能分配(Dynamic Ratio-APM):BIG-IP 收集到的應(yīng)用程序和應(yīng)用服務(wù)器的各項性能參數(shù)借笙,動態(tài)調(diào)整流量分配。
動態(tài)服務(wù)器補充(Dynamic Server Act.):當(dāng)主服務(wù)器群中因故障導(dǎo)致數(shù)量減少時较锡,動態(tài)地將備份服務(wù)器補充至主服務(wù)器群业稼。
服務(wù)質(zhì)量(QoS):按不同的優(yōu)先級對數(shù)據(jù)流進行分配。
服務(wù)類型(ToS): 按不同的服務(wù)類型(在 Type of Field 中標(biāo)識)負載均衡對數(shù)據(jù)流進行分配蚂蕴。
規(guī)則模式:針對不同的數(shù)據(jù)流設(shè)置導(dǎo)向規(guī)則低散,用戶可自行俯邓。