讀透DNS負(fù)載均衡的排名算法
前面我們介紹了DNS負(fù)載均衡的一些概念,那么現(xiàn)在針對(duì)這種負(fù)載均衡技術(shù),我們?cè)賮?lái)討論一下相關(guān)的算法問(wèn)題,以及排名問(wèn)題。這個(gè)是在服務(wù)器負(fù)載應(yīng)用中很重要的一個(gè)概念。那么更多的知識(shí),我們還是從下文中來(lái)了解吧,望大家能對(duì)這方面的問(wèn)題有個(gè)總結(jié)。
負(fù)載均衡算法
最初,負(fù)載均衡只是為了允許DNS代理可以支持機(jī)器簇的概念,在這里,這些機(jī)器的功能都是類似的或者相同的。而且,它并不需要特別關(guān)心選擇了哪臺(tái)機(jī)器。這樣,負(fù)載就被平均地分配在一系列實(shí)際上并不相同的主機(jī)上。因?yàn)闄C(jī)器有著不同的配置和能力,這樣,我們就需要更加復(fù)雜的算法。
“循環(huán)算法A"可以以一種循環(huán)方式在服務(wù)器中平均的分配請(qǐng)求。但是,盡管這些請(qǐng)求是被動(dòng)態(tài)地處理,對(duì)于不同的性能特點(diǎn)的忽視使這種算法的一個(gè)問(wèn)題。
“負(fù)載平均算法A"可以根據(jù)服務(wù)器的負(fù)載分配請(qǐng)求。這個(gè)設(shè)計(jì)非常簡(jiǎn)單而且也較為低廉。但是這種算法卻不能應(yīng)付服務(wù)器在配置和潛力方面有差異的情況。
“排名算法A"基于如下所示的用戶的數(shù)目和負(fù)載平均的列表。這個(gè)算法是比較合理的,因?yàn)樗鶕?jù)最少的單個(gè)訪問(wèn)以及較低負(fù)載平均來(lái)進(jìn)行排名***主機(jī)的。這個(gè)算法在dlbDNS中確定***服務(wù)器的時(shí)候被使用。
WT_PER_USER=100
USER_PER_LOAD_UNIT=3
FUDGE=(TOT_USER-UNIQ_USER)*(WT_PER_USER/5)
WEIGHT=(UNIQ_USER*WT_PER_USER)+(USER_PER_LOAD_UNIT*LOAD)+FUDGE
在這個(gè)列表中,變量的名稱的含義如下:
TOT_USER:登錄的用戶的總數(shù)
UNIQ_USERS:登錄的不重復(fù)用戶的數(shù)目(比如說(shuō),用戶a和用戶b就是兩個(gè)不重復(fù)的用戶,而不管他們登錄了多少次)
LOAD:***一分鐘的負(fù)載平均乘100
WT_PER_USER:每個(gè)用戶的負(fù)載量
FUDGE:如果用戶多次登錄之后的修正參數(shù)
WEIGHT:服務(wù)器的排名
dlbDNS的使用
首先,我們從InternetSoftwareConsortium(http://www.isc.org/bind.html)下載BIND8.1.2(在BIND8.1.2中就支持了dlbDNS的特性),在示例中DNS被安裝在dydns.clinux.org上,在一個(gè)獨(dú)立的Linux工作站上進(jìn)行測(cè)試。請(qǐng)看我們的配置:
在我們的配置中,由一個(gè)新的屬性稱為DNAME被加入來(lái)區(qū)分參加到動(dòng)態(tài)負(fù)載均衡的主機(jī)。在我們上面這個(gè)配置中,我們可以看到,back1.dydns.clinux.org,back2.dydns.clinux.org和b.dydns.clinux.org被用來(lái)充當(dāng)www1.dydns.clinux.org的動(dòng)態(tài)負(fù)載,hack1.dydns.clinux.org,hack2.dydns.clinux.org和h.dydns.clinux.org被用來(lái)充當(dāng)www2.dydns.clinux.org的動(dòng)態(tài)負(fù)載。
服務(wù)器端的算法
以下是dlbDNS中的算法。如果一個(gè)服務(wù)器的請(qǐng)求是DNAME類型,那么,服務(wù)器就會(huì)進(jìn)行如下的一些動(dòng)作:
1、確定在這個(gè)服務(wù)中參與的服務(wù)器的集合。
2、通過(guò)和每個(gè)服務(wù)器建立一個(gè)同步的非連接性的連接獲取每個(gè)參與的服務(wù)器的排名值。
3、根據(jù)返回的排名值,確定***服務(wù)器。
4、處理錯(cuò)誤信息。
排名服務(wù)算法
一個(gè)排名服務(wù)運(yùn)行在參與到動(dòng)態(tài)負(fù)載均衡的每個(gè)服務(wù)器上,以下是算法:
1、從dlbDNS接收排名請(qǐng)求。
2、每一分鐘都對(duì)主機(jī)的排名進(jìn)行計(jì)算,而不是在得到請(qǐng)求的時(shí)候才進(jìn)行計(jì)算。因?yàn)榛貞?yīng)時(shí)非常重要的一個(gè)因素。
3、確認(rèn)主機(jī)排名是每分鐘都進(jìn)行更新的。
4、處理錯(cuò)誤情況,比如說(shuō)dlbDNS在未等待主機(jī)回應(yīng)的情況下關(guān)閉了UDP接口。
dlbDNS的好處
這個(gè)就不需要多說(shuō)了,除了可以充分地利用資源之外,因?yàn)槲覀兺ㄟ^(guò)DNS來(lái)實(shí)現(xiàn)負(fù)載均衡,這樣FTP和TELNET之類的程序也可以使用dlbDNS。
發(fā)展方向
目前,在通過(guò)BIND的代碼中,gethostbyname系統(tǒng)將不能正常工作,這個(gè)問(wèn)題可以通過(guò)一個(gè)主機(jī)和IP地址的列表的配置文件來(lái)解決。當(dāng)然,我們希望由一個(gè)更好的解決方法。
第二,排名算法還不完善,算法還不能考慮處理器的數(shù)目,對(duì)CPU和內(nèi)存的考慮會(huì)使得算法更加有效。
第三,在Linux服務(wù)器上,排名算法使用的是/proc文件結(jié)構(gòu)中的文件,這樣只能說(shuō)是動(dòng)態(tài)平衡配置,應(yīng)該還需要一個(gè)更加強(qiáng)大的設(shè)計(jì)。
備注:dlbDNS的源代碼可以從http://www.cs.twsu.edu/~hcvillia/acads/project/獲得。