本發(fā)明涉及通信控制領(lǐng)域,尤其涉及一種高效的負(fù)載均衡器,還涉及一種包含所述負(fù)載均衡器的負(fù)載均衡系統(tǒng)。
背景技術(shù):
通常情況下的負(fù)載均衡要在靈活性和性能之間做權(quán)衡,用戶態(tài)軟件層面有haproxy和nginx這樣的老牌負(fù)載均衡軟件,他們一般配置和使用起來都比較容易,但是由于需要數(shù)據(jù)包從網(wǎng)卡到內(nèi)核再到軟件一層層向上處理,再一層層向下轉(zhuǎn)發(fā),堆棧比較深單機(jī)性能通常都比較一般。
為了提高單機(jī)性能,減少堆棧層級(jí)就有了lvs(linux虛擬服務(wù)器),其實(shí)質(zhì)上是工作在內(nèi)核層的負(fù)載均衡器,性能有著數(shù)量級(jí)的提高,然而配置起來相對(duì)也比較復(fù)雜而且對(duì)網(wǎng)絡(luò)條件要求也有特殊要求;另外網(wǎng)絡(luò)數(shù)據(jù)到達(dá)lvs之前還要經(jīng)過完整的tcp/ip協(xié)議棧比如數(shù)據(jù)包要經(jīng)過網(wǎng)卡的驅(qū)動(dòng)層、鏈路層、ip層、tcp層、應(yīng)用層等以及內(nèi)核的一系列filter模塊,而這些對(duì)于轉(zhuǎn)發(fā)來說是非常冗繁并且沒有必要的。
技術(shù)實(shí)現(xiàn)要素:
為解決現(xiàn)有技術(shù)中的問題,本發(fā)明提供一種高效的負(fù)載均衡器,還提供一種包含所述負(fù)載均衡器的負(fù)載均衡系統(tǒng)。
本發(fā)明高效的負(fù)載均衡器設(shè)置在網(wǎng)卡上,所述負(fù)載均衡器輸入輸出端分別與網(wǎng)卡的輸入和輸出隊(duì)列相連,所述負(fù)載均衡器設(shè)有接收解析模塊、均衡模塊和發(fā)送模塊,所述解析模塊用于接收網(wǎng)卡輸入隊(duì)列的數(shù)據(jù)包并解析數(shù)據(jù)包的轉(zhuǎn)發(fā)信息,所述均衡模塊用于對(duì)解析的數(shù)據(jù)包均衡分配到發(fā)送隊(duì)列中;發(fā)送模塊用于從發(fā)送隊(duì)列中讀取數(shù)據(jù)包,并把數(shù)據(jù)包通過網(wǎng)卡的輸出隊(duì)列均衡分發(fā)給后端服務(wù)器。
本發(fā)明作進(jìn)一步改進(jìn),所述接收解析模塊只解析數(shù)據(jù)包的前幾個(gè)字節(jié),提取出轉(zhuǎn)發(fā)信息,所述轉(zhuǎn)發(fā)信息包括源地址、源端口、目標(biāo)地址、目標(biāo)端口和協(xié)議號(hào)。
本發(fā)明作進(jìn)一步改進(jìn),還包括檢測(cè)模塊,設(shè)置在接收解析模塊和均衡模塊之間,用于對(duì)進(jìn)入均衡模塊的數(shù)據(jù)包進(jìn)行檢測(cè),如果數(shù)據(jù)包的檢測(cè)結(jié)果為丟棄,則該數(shù)據(jù)包不進(jìn)入均衡模塊。
本發(fā)明作進(jìn)一步改進(jìn),所述負(fù)載均衡器與網(wǎng)卡的內(nèi)存共享,所述負(fù)載均衡器和網(wǎng)卡共享一個(gè)數(shù)據(jù)池空間,所述負(fù)載均衡器能夠讀取網(wǎng)卡的內(nèi)存數(shù)據(jù)。
本發(fā)明作進(jìn)一步改進(jìn),利用dpdk技術(shù),支持uio,提供應(yīng)用空間下驅(qū)動(dòng)程序的支持。
本發(fā)明作進(jìn)一步改進(jìn),包括內(nèi)存池,所述內(nèi)存池采用無鎖環(huán)形緩存管理。
本發(fā)明作進(jìn)一步改進(jìn),所述負(fù)載均衡器設(shè)置在linux操作系統(tǒng)的服務(wù)器上時(shí),把控制器面線程及各個(gè)數(shù)據(jù)面線程綁定到不同的cpu核。
本發(fā)明還提供一種包含所述負(fù)載均衡器的負(fù)載均衡系統(tǒng),包括客戶端、域名解析服務(wù)器、路由器、多個(gè)服務(wù)器,所述客戶端分別與路由器和域名解析服務(wù)器相連,所述負(fù)載均衡系統(tǒng)設(shè)置在路由器和多個(gè)服務(wù)器之間。
本發(fā)明作進(jìn)一步改進(jìn),當(dāng)客戶端發(fā)送請(qǐng)求包時(shí),所述域名解析服務(wù)器根據(jù)請(qǐng)求的客戶端的位置返回一個(gè)離請(qǐng)求的客戶端地理位置最近的vip地址;所述請(qǐng)求包到達(dá)vip地址對(duì)應(yīng)的路由器;路由器分別將多個(gè)請(qǐng)求包平均分配到與之連接的多個(gè)負(fù)載均衡器上;負(fù)載均衡器的均衡模塊再將請(qǐng)求包均衡分發(fā)給與之連接的多個(gè)服務(wù)器。
本發(fā)明作進(jìn)一步改進(jìn),所述負(fù)載均衡器在接收到請(qǐng)求包轉(zhuǎn)發(fā)給服務(wù)器時(shí),將請(qǐng)求包的源地址修改為用戶請(qǐng)求時(shí)的地址,服務(wù)器響應(yīng)時(shí),將響應(yīng)包的源地址改為用戶的vip地址,將響應(yīng)包不通過負(fù)載均衡器直接發(fā)送給與客戶端相連的路由器。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:數(shù)據(jù)包只需要在進(jìn)入網(wǎng)卡的驅(qū)動(dòng)層被負(fù)載均衡器調(diào)用,不需要進(jìn)入ip層、tcp層、應(yīng)用層等進(jìn)行完整的tcp/ip協(xié)議棧的解析,并且本發(fā)明的數(shù)據(jù)包只需要分析前幾個(gè)字節(jié),極大提高了數(shù)據(jù)處理性能。能夠?qū)ω?fù)載均衡器進(jìn)行橫向擴(kuò)展和縱向擴(kuò)展,有效加快處理網(wǎng)絡(luò)數(shù)據(jù)包的速率。
附圖說明
圖1為本發(fā)明負(fù)載均衡器結(jié)構(gòu)示意圖;
圖2為負(fù)載均衡器數(shù)據(jù)處理示意圖;
圖3為負(fù)載均衡器與網(wǎng)卡內(nèi)存數(shù)據(jù)共享示意圖;
圖4為本發(fā)明負(fù)載均衡系統(tǒng)結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明做進(jìn)一步詳細(xì)說明。
如圖1所示,本發(fā)明提供一種高效的負(fù)載均衡器,所述負(fù)載均衡器設(shè)置在網(wǎng)卡上,所述負(fù)載均衡器輸入輸出端分別與網(wǎng)卡的輸入和輸出隊(duì)列相連,所述負(fù)載均衡器設(shè)有接收解析模塊、均衡模塊和發(fā)送模塊,所述解析模塊用于接收網(wǎng)卡輸入隊(duì)列的數(shù)據(jù)包并解析數(shù)據(jù)包的轉(zhuǎn)發(fā)信息,所述均衡模塊用于對(duì)解析的數(shù)據(jù)包均衡分配到發(fā)送隊(duì)列中;發(fā)送模塊用于從發(fā)送隊(duì)列中讀取數(shù)據(jù)包,并把數(shù)據(jù)包通過網(wǎng)卡的輸出隊(duì)列均衡分發(fā)給后端服務(wù)器。
本例的接收解析模塊為接收隊(duì)列及數(shù)據(jù)包頭改寫單元,其中的均衡模塊包括接收ip匹配單元、連接會(huì)話管理單元、數(shù)據(jù)重新封包單元等。當(dāng)數(shù)據(jù)重新封裝好后,通過數(shù)據(jù)包發(fā)送單元發(fā)送。
通過本例的設(shè)置,數(shù)據(jù)網(wǎng)絡(luò)能夠繞過內(nèi)核,不需要經(jīng)過內(nèi)核的一系列模塊處理,并且,針對(duì)數(shù)據(jù)包,也不需要經(jīng)過網(wǎng)卡的驅(qū)動(dòng)層、鏈路層、ip層、tcp層、應(yīng)用層等進(jìn)行完整的的tcp/ip協(xié)議棧的解析。本例的數(shù)據(jù)包只需要在進(jìn)入網(wǎng)卡的驅(qū)動(dòng)層被負(fù)載均衡器調(diào)用,并且通過本例的接收解析模塊分析前幾個(gè)字節(jié),提取出轉(zhuǎn)發(fā)信息,有效節(jié)約了數(shù)據(jù)處理時(shí)間,提高數(shù)據(jù)處理效率。本例的轉(zhuǎn)發(fā)信息包括源地址、源端口、目標(biāo)地址、目標(biāo)端口和協(xié)議號(hào)這五元組,對(duì)于轉(zhuǎn)發(fā)來說就已經(jīng)足夠;剩下的諸如payload,序列號(hào)之類的東西統(tǒng)統(tǒng)不關(guān)心,直接塞到網(wǎng)卡輸出口給后面的實(shí)現(xiàn)服務(wù)器。
如圖2所示,作為本發(fā)明的一個(gè)實(shí)施例,本例的數(shù)據(jù)包為報(bào)文,本例的負(fù)載均衡器分別通過相應(yīng)的線程來實(shí)現(xiàn)。本例的負(fù)載均衡器的數(shù)據(jù)處理流程為:
1.接收:接收網(wǎng)卡把收到的報(bào)文dma(直接存儲(chǔ)器訪問)到自已的硬件接收環(huán)緩沖區(qū)中,接收線程從硬件的環(huán)緩沖區(qū)中取出報(bào)文,解釋報(bào)文類型,把類型標(biāo)識(shí)到報(bào)文和管理結(jié)構(gòu)rte_mbuf->pk.hash.sched中,其實(shí)就是標(biāo)識(shí)報(bào)文的subport,pipe,traffic_class,queue,color字段,最后把報(bào)文暫存在一個(gè)接收隊(duì)列中,等待均衡調(diào)度線程把報(bào)文調(diào)度到相應(yīng)的隊(duì)列。
2.入隊(duì):均衡調(diào)度線程從接收隊(duì)列中取出一定數(shù)量的報(bào)文,根據(jù)每個(gè)報(bào)文的標(biāo)識(shí),找到相應(yīng)的隊(duì)列,把報(bào)文分配到相應(yīng)的隊(duì)列中,然后到bit圖(一種海量數(shù)據(jù)處理算法)中激活該隊(duì)列。
值得一提的是,本例還包括檢測(cè)模塊,設(shè)置在接收解析模塊和均衡模塊之間,用于對(duì)進(jìn)入均衡模塊的數(shù)據(jù)包進(jìn)行檢測(cè),如果數(shù)據(jù)包的檢測(cè)結(jié)果為丟棄,則該數(shù)據(jù)包不進(jìn)入均衡模塊。
比如,如果配置了檢測(cè)模塊,在入隊(duì)前需要先做檢測(cè),比如設(shè)置的條件為接收隊(duì)列中的數(shù)據(jù)不能大于設(shè)定值,或者數(shù)據(jù)包的數(shù)量不能超過一定閾值,當(dāng)某些數(shù)據(jù)包傳輸時(shí),達(dá)到這些條件,那么就將其丟棄,以提高數(shù)據(jù)傳輸效率。
3.出隊(duì):均衡調(diào)度線程把一定數(shù)目的報(bào)文入隊(duì)后,采用相應(yīng)的均衡算法,從隊(duì)列中選擇一個(gè)隊(duì)列,然后從所選擇的隊(duì)列中把報(bào)文取出保存到發(fā)送隊(duì)列中,等待發(fā)送線程發(fā)送。
本例的負(fù)載均衡算法包括隨機(jī)數(shù)生成算法、輪詢算法、加權(quán)輪詢算法、最少連接算法、最快傳輸算法、預(yù)判算法等等。本例優(yōu)選輪詢算法,按照順序把數(shù)據(jù)包平均分配給連接的多個(gè)服務(wù)器。
4.發(fā)送:發(fā)送線程從發(fā)送隊(duì)列中讀取報(bào)文,把報(bào)文發(fā)送到外出網(wǎng)卡的緩沖區(qū)中。
如圖3所示,為了提高本例的數(shù)據(jù)處理效率,本例的負(fù)載均衡器與網(wǎng)卡的內(nèi)存共享,這樣就不需要將數(shù)據(jù)包再從網(wǎng)卡進(jìn)行一次復(fù)制到負(fù)載均衡器中,也不需要把數(shù)據(jù)包再從負(fù)載均衡器復(fù)制到網(wǎng)卡。本例網(wǎng)卡輸入隊(duì)列、負(fù)載均衡器和網(wǎng)卡輸出隊(duì)列共享一個(gè)數(shù)據(jù)池空間,所述負(fù)載均衡器能夠讀取網(wǎng)卡的內(nèi)存數(shù)據(jù),負(fù)載均衡器的接收隊(duì)列和發(fā)送隊(duì)列的三個(gè)指針不斷的在內(nèi)存共享池移動(dòng)處理數(shù)據(jù)包,減少了復(fù)制數(shù)據(jù)的開銷。
本例的負(fù)載均衡器能夠利用dpdk(dataplanedevelopmentkit)技術(shù)垂直擴(kuò)展,其中,dpdk是intel提供的提升數(shù)據(jù)面報(bào)文快速處理速率的應(yīng)用程序開發(fā)包,本負(fù)載均衡器主要利用dpdk的下面幾個(gè)特性加快處理網(wǎng)絡(luò)數(shù)據(jù)包的速率:
1.采用大頁緩存支持來提高內(nèi)存訪問效率;
2.利用uio(userspacei/o,是運(yùn)行在用戶空間的i/o技術(shù))支持,提供應(yīng)用空間下驅(qū)動(dòng)程序的支持,也就是說網(wǎng)卡驅(qū)動(dòng)是運(yùn)行在用戶空間的,減下了報(bào)文在用戶空間和應(yīng)用空間的多次拷貝;
3.利用linux親和性支持,把控制面線程及各個(gè)數(shù)據(jù)面線程綁定到不同的cpu核,節(jié)省了線程在各個(gè)cpu核來回調(diào)度;
4.提供內(nèi)存池,并對(duì)內(nèi)存池進(jìn)行無鎖環(huán)形緩存管理,加快內(nèi)存訪問效率。
如圖4所示,本例還提供了一種包含所述負(fù)載均衡器的負(fù)載均衡系統(tǒng),包括客戶端、域名解析服務(wù)器(dns服務(wù)器)、路由器、多個(gè)服務(wù)器,所述客戶端分別與路由器和域名解析服務(wù)器相連,所述負(fù)載均衡系統(tǒng)設(shè)置在路由器和多個(gè)服務(wù)器之間。實(shí)現(xiàn)負(fù)載均衡器的橫向擴(kuò)展及負(fù)載均衡系統(tǒng)整體均衡分配,進(jìn)一步提高數(shù)據(jù)處理效率。其中,客戶端和dns服務(wù)器之間進(jìn)行dns消息的互通,所述負(fù)載均衡器和路由器之間除了網(wǎng)絡(luò)流量的轉(zhuǎn)發(fā)外,還發(fā)送bgp信令給路由器,所述bgp(邊界網(wǎng)關(guān)協(xié)議)信令是運(yùn)行于tcp上的一種自治系統(tǒng)的路由協(xié)議。
一般來說,負(fù)載均衡器本身就是后端服務(wù)橫向擴(kuò)展的一個(gè)接入點(diǎn),對(duì)于一般站點(diǎn)一個(gè)負(fù)載均衡器就夠了;然而應(yīng)對(duì)高級(jí)別的流量,負(fù)載均衡器本身也要能橫向擴(kuò)展,還要處理負(fù)載均衡器的高可用。本例與路由器連接的負(fù)載均衡器為1個(gè)以上,每個(gè)負(fù)載均衡器連接多個(gè)服務(wù)器,當(dāng)負(fù)載均衡器為多個(gè)時(shí),本例的處理流程為:
當(dāng)客戶端發(fā)送請(qǐng)求時(shí),dns服務(wù)器(域名解析服務(wù)器)會(huì)根據(jù)客戶端請(qǐng)求的位置返回一個(gè)離請(qǐng)求地理位置最近的vip地址,先在dns這一層做一個(gè)橫向擴(kuò)展。
然后,當(dāng)請(qǐng)求包到達(dá)vip地址對(duì)應(yīng)的路由器;路由器通過ecmp(等價(jià)多路徑)協(xié)議,可以將請(qǐng)求平均分配到下面對(duì)等的多個(gè)負(fù)載均衡器上,這樣在路由器這一層做了個(gè)負(fù)載均衡,讓后面的負(fù)載均衡器也實(shí)現(xiàn)了橫向擴(kuò)展;負(fù)載均衡器的均衡模塊再將請(qǐng)求包均衡分發(fā)給與之連接的多個(gè)服務(wù)器。
優(yōu)選地,在負(fù)載均衡器處理環(huán)節(jié),本例負(fù)載均衡器在接收到請(qǐng)求包轉(zhuǎn)發(fā)給服務(wù)器時(shí),將請(qǐng)求包的源地址修改為用戶請(qǐng)求時(shí)的地址,服務(wù)器響應(yīng)時(shí),將響應(yīng)包的源地址改為用戶的vip地址,將響應(yīng)包不通過負(fù)載均衡器直接發(fā)送給與客戶端相連的路由器,從而降低負(fù)載均衡器壓力。
本發(fā)明通過對(duì)負(fù)載均衡器進(jìn)行橫向擴(kuò)展和縱向擴(kuò)展,有效加快處理網(wǎng)絡(luò)數(shù)據(jù)包的速率。
以上所述之具體實(shí)施方式為本發(fā)明的較佳實(shí)施方式,并非以此限定本發(fā)明的具體實(shí)施范圍,本發(fā)明的范圍包括并不限于本具體實(shí)施方式,凡依照本發(fā)明所作的等效變化均在本發(fā)明的保護(hù)范圍內(nèi)。