1,什么是負(fù)載均衡?當(dāng)一臺(tái)服務(wù)器的性能達(dá)到極限時(shí),我們可以使用服務(wù)器集群來提高網(wǎng)站的整體性能。那么,在服務(wù)器集群中,需要有一臺(tái)服務(wù)器充當(dāng)調(diào)度者的角色,用戶的所有請(qǐng)求都會(huì)首先由它接收,調(diào)度者再根據(jù)每臺(tái)服務(wù)器的負(fù)載情況將請(qǐng)求分配給某一臺(tái)后端服務(wù)器去處理。 那么在這個(gè)過程中,調(diào)度者如何合理分配任務(wù),保證所有后端服務(wù)器都將性能充分發(fā)揮,從而保持服務(wù)器集群的整體性能最優(yōu),這就是負(fù)載均衡問題。 下面詳細(xì)介紹負(fù)載均衡的四種實(shí)現(xiàn)方式。 (一)HTTP重定向?qū)崿F(xiàn)負(fù)載均衡過程描述當(dāng)用戶向服務(wù)器發(fā)起請(qǐng)求時(shí),請(qǐng)求首先被集群調(diào)度者截獲;調(diào)度者根據(jù)某種分配策略,選擇一臺(tái)服務(wù)器,并將選中的服務(wù)器的IP地址封裝在HTTP響應(yīng)消息頭部的Location字段中,并將響應(yīng)消息的狀態(tài)碼設(shè)為302,最后將這個(gè)響應(yīng)消息返回給瀏覽器。 當(dāng)瀏覽器收到響應(yīng)消息后,解析Location字段,并向該URL發(fā)起請(qǐng)求,然后指定的服務(wù)器處理該用戶的請(qǐng)求,最后將結(jié)果返回給用戶。 在使用HTTP重定向來實(shí)現(xiàn)服務(wù)器集群負(fù)載均衡的過程中,需要一臺(tái)服務(wù)器作為請(qǐng)求調(diào)度者。用戶的一項(xiàng)操作需要發(fā)起兩次HTTP請(qǐng)求,一次向調(diào)度服務(wù)器發(fā)送請(qǐng)求,獲取后端服務(wù)器的IP,第二次向后端服務(wù)器發(fā)送請(qǐng)求,獲取處理結(jié)果。 調(diào)度策略調(diào)度服務(wù)器收到用戶的請(qǐng)求后,究竟選擇哪臺(tái)后端服務(wù)器處理請(qǐng)求,這由調(diào)度服務(wù)器所使用的調(diào)度策略決定。
由于輪詢策略需要調(diào)度者維護(hù)一個(gè)值用于記錄上次分配的服務(wù)器IP,因此需要額外的開銷;此外,由于這個(gè)值屬于互斥資源,那么當(dāng)多個(gè)請(qǐng)求同時(shí)到來時(shí),為了避免線程的安全問題,因此需要鎖定互斥資源,從而降低了性能。而隨機(jī)分配策略不需要維護(hù)額外的值,也就不存在線程安全問題,因此性能比輪詢要高。 優(yōu)缺點(diǎn)分析采用HTTP重定向來實(shí)現(xiàn)服務(wù)器集群的負(fù)載均衡實(shí)現(xiàn)起來較為容易,邏輯比較簡單,但缺點(diǎn)也較為明顯。 在HTTP重定向方法中,調(diào)度服務(wù)器只在客戶端第一次向網(wǎng)站發(fā)起請(qǐng)求的時(shí)候起作用。當(dāng)調(diào)度服務(wù)器向?yàn)g覽器返回響應(yīng)信息后,客戶端此后的操作都基于新的URL進(jìn)行的(也就是后端服務(wù)器),此后瀏覽器就不會(huì)與調(diào)度服務(wù)器產(chǎn)生關(guān)系,進(jìn)而會(huì)產(chǎn)生如下幾個(gè)問題:
(二)DNS負(fù)載均衡DNS是什么?在了解DNS負(fù)載均衡之前,我們首先需要了解DNS域名解析的過程。 我們知道,數(shù)據(jù)包采用IP地址在網(wǎng)絡(luò)中傳播,而為了方便用戶記憶,我們使用域名來訪問網(wǎng)站。那么,我們通過域名訪問網(wǎng)站之前,首先需要將域名解析成IP地址,這個(gè)工作是由DNS完成的。也就是域名服務(wù)器。 我們提交的請(qǐng)求不會(huì)直接發(fā)送給想要訪問的網(wǎng)站,而是首先發(fā)給域名服務(wù)器,它會(huì)幫我們把域名解析成IP地址并返回給我們。我們收到IP之后才會(huì)向該IP發(fā)起請(qǐng)求。 那么,DNS服務(wù)器有一個(gè)天然的優(yōu)勢(shì),如果一個(gè)域名指向了多個(gè)IP地址,那么每次進(jìn)行域名解析時(shí),DNS只要選一個(gè)IP返回給用戶,就能夠?qū)崿F(xiàn)服務(wù)器集群的負(fù)載均衡。 具體做法首先需要將我們的域名指向多個(gè)后端服務(wù)器(將一個(gè)域名解析到多個(gè)IP上),再設(shè)置一下調(diào)度策略,那么我們的準(zhǔn)備工作就完成了,接下來的負(fù)載均衡就完全由DNS服務(wù)器來實(shí)現(xiàn)。 當(dāng)用戶向我們的域名發(fā)起請(qǐng)求時(shí),DNS服務(wù)器會(huì)自動(dòng)地根據(jù)我們事先設(shè)定好的調(diào)度策略選一個(gè)合適的IP返回給用戶,用戶再向該IP發(fā)起請(qǐng)求。 調(diào)度策略一般DNS提供商會(huì)提供一些調(diào)度策略供我們選擇,如隨機(jī)分配、輪詢、根據(jù)請(qǐng)求者的地域分配離他最近的服務(wù)器。 優(yōu)缺點(diǎn)分析DNS負(fù)載均衡最大的優(yōu)點(diǎn)就是配置簡單。服務(wù)器集群的調(diào)度工作完全由DNS服務(wù)器承擔(dān),那么我們就可以把精力放在后端服務(wù)器上,保證他們的穩(wěn)定性與吞吐量。而且完全不用擔(dān)心DNS服務(wù)器的性能,即便是使用了輪詢策略,它的吞吐率依然卓越。 此外,DNS負(fù)載均衡具有較強(qiáng)了擴(kuò)展性,你完全可以為一個(gè)域名解析較多的IP,而且不用擔(dān)心性能問題。 但是,由于把集群調(diào)度權(quán)交給了DNS服務(wù)器,從而我們沒辦法隨心所欲地控制調(diào)度者,沒辦法定制調(diào)度策略。 DNS服務(wù)器也沒辦法了解每臺(tái)服務(wù)器的負(fù)載情況,因此沒辦法實(shí)現(xiàn)真正意義上的負(fù)載均衡。它和HTTP重定向一樣,只不過把所有請(qǐng)求平均分配給后端服務(wù)器罷了。 此外,當(dāng)我們發(fā)現(xiàn)某一臺(tái)后端服務(wù)器發(fā)生故障時(shí),即使我們立即將該服務(wù)器從域名解析中去除,但由于DNS服務(wù)器會(huì)有緩存,該IP仍然會(huì)在DNS中保留一段時(shí)間,那么就會(huì)導(dǎo)致一部分用戶無法正常訪問網(wǎng)站。這是一個(gè)致命的問題!好在這個(gè)問題可以用動(dòng)態(tài)DNS來解決。 動(dòng)態(tài)DNS動(dòng)態(tài)DNS能夠讓我們通過程序動(dòng)態(tài)修改DNS服務(wù)器中的域名解析。從而當(dāng)我們的監(jiān)控程序發(fā)現(xiàn)某臺(tái)服務(wù)器掛了之后,能立即通知DNS將其刪掉。 綜上所述DNS負(fù)載均衡是一種粗獷的負(fù)載均衡方法,這里只做介紹,不推薦使用。 (三)反向代理負(fù)載均衡什么是反向代理負(fù)載均衡?反向代理服務(wù)器是一個(gè)位于實(shí)際服務(wù)器之前的服務(wù)器,所有向我們網(wǎng)站發(fā)來的請(qǐng)求都首先要經(jīng)過反向代理服務(wù)器,服務(wù)器根據(jù)用戶的請(qǐng)求要么直接將結(jié)果返回給用戶,要么將請(qǐng)求交給后端服務(wù)器處理,再返回給用戶。 之前我們介紹了用反向代理服務(wù)器實(shí)現(xiàn)靜態(tài)頁面和常用的動(dòng)態(tài)頁面的緩存。接下來我們介紹反向代理服務(wù)器更常用的功能——實(shí)現(xiàn)負(fù)載均衡。 我們知道,所有發(fā)送給我們網(wǎng)站的請(qǐng)求都首先經(jīng)過反向代理服務(wù)器。那么,反向代理服務(wù)器就可以充當(dāng)服務(wù)器集群的調(diào)度者,它可以根據(jù)當(dāng)前后端服務(wù)器的負(fù)載情況,將請(qǐng)求轉(zhuǎn)發(fā)給一臺(tái)合適的服務(wù)器,并將處理結(jié)果返回給用戶。 優(yōu)點(diǎn)
缺點(diǎn)
粘滯會(huì)話反向代理服務(wù)器會(huì)引起一個(gè)問題。若某臺(tái)后端服務(wù)器處理了用戶的請(qǐng)求,并保存了該用戶的session或存儲(chǔ)了緩存,那么當(dāng)該用戶再次發(fā)送請(qǐng)求時(shí),無法保證該請(qǐng)求仍然由保存了其Session或緩存的服務(wù)器處理,若由其他服務(wù)器處理,先前的Session或緩存就找不到了。 解決辦法1: 解決辦法2: 2,負(fù)載均衡組件1.1、apache 1.4、HAProxy —— HAProxy提供高可用性、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理,支持虛擬主機(jī),它是免費(fèi)、快速并且可靠的一種解決方案。HAProxy特別適用于那些負(fù)載特大的web站點(diǎn), 這些站點(diǎn)通常又需要會(huì)話保持或七層處理。HAProxy運(yùn)行在當(dāng)前的硬件上,完全可以支持?jǐn)?shù)以萬計(jì)的并發(fā)連接。并且它的運(yùn)行模式使得它可以很簡單安全的整合進(jìn)您當(dāng)前的架構(gòu)中, 同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上. |
|