摘 要: 針對數(shù)據(jù)庫集群負載問題,提出了一種動態(tài)負載均衡方法,并進一步設(shè)計、實現(xiàn)了包括CPU使用率、磁盤存儲量、磁盤響應(yīng)效率、網(wǎng)絡(luò)延時、內(nèi)存使用率等在內(nèi)的多指標的節(jié)點負載測量和實時監(jiān)控。該算法根據(jù)各節(jié)點的負載反饋信息進行任務(wù)分配,實現(xiàn)了負載均衡。性能分析和實驗表明,該算法具有較高的負載均衡度和較低的系統(tǒng)開銷。
關(guān)鍵詞: 動態(tài)負載均衡;數(shù)據(jù)庫集群;負載測量;實時監(jiān)控
隨著數(shù)據(jù)庫技術(shù)的發(fā)展和各種數(shù)據(jù)庫產(chǎn)品的產(chǎn)生,數(shù)據(jù)庫系統(tǒng)在各行各業(yè)應(yīng)用廣泛,隨著應(yīng)用需求的不斷增加,越來越多的用戶希望能夠透明地訪問和處理來自多個數(shù)據(jù)庫的數(shù)據(jù)。同時,電子商務(wù)和信息技術(shù)的迅猛發(fā)展使數(shù)據(jù)庫管理系統(tǒng)(DBMS)不堪重負,將這些數(shù)據(jù)庫有機地連接起來,統(tǒng)一管理,協(xié)調(diào)工作,不但能提高數(shù)據(jù)庫的性能和可用性,而且解決了遺留系統(tǒng)的問題。對于這些通過網(wǎng)絡(luò)連接起來的數(shù)據(jù)庫而言,必須能夠?qū)崟r處理大量的用戶請求,而且必須能向客戶提供高質(zhì)量服務(wù)。但是這些系統(tǒng)潛在性能的實際利用率通常僅為1%~10%[1],導(dǎo)致系統(tǒng)運行效率低下。如何才能提高由網(wǎng)絡(luò)連接起來的數(shù)據(jù)庫的響應(yīng)速度、穩(wěn)定性和擴展性,并且保護最初的硬件投資;如何避免大量用戶請求對系統(tǒng)帶來的沖擊,負載均衡為設(shè)計者提供了一條途徑,它是提高系統(tǒng)資源利用率的一個關(guān)鍵技術(shù)[2-3],它在后端數(shù)據(jù)庫間分發(fā)客戶請求,以達到減少系統(tǒng)瓶頸、增強系統(tǒng)響應(yīng)能力。
1 負載均衡
對于一個分布式計算機系統(tǒng),由于任務(wù)到達的隨機性,以及各處理節(jié)點處理能力上的差異,當系統(tǒng)運行一段時間后,某些節(jié)點分配的任務(wù)還很多(稱之為超載),而另一些節(jié)點卻是空閑的(稱之為輕載)。一方面,使超載節(jié)點盡可能快地完成任務(wù)是當務(wù)之急;另一方面,使某些節(jié)點空閑是一種浪費。如何避免這種空閑與忙等待并存的情況,從而有效地提高系統(tǒng)的資源利用率,減少任務(wù)的平均響應(yīng)時間,促使負載均衡的產(chǎn)生與發(fā)展。
負載均衡設(shè)法對分配給各節(jié)點的任務(wù)進行重新調(diào)度,并通過進程遷移(又稱為任務(wù)遷移),使各節(jié)點負載大致相等。
目前普遍使用的數(shù)據(jù)庫集群系統(tǒng)負載均衡方法包括:
(1)Random:即隨機選擇法。在后端中隨機選擇一個節(jié)點來執(zhí)行用戶查詢請求;
(2)Round Robin:即輪詢法。第一個請求發(fā)送到第一個后端,第二個請求發(fā)送到第二個后端,依此類推。不斷地循環(huán),直到請求又從第一個后端開始;
(3)Weight Round Robin:即加權(quán)輪詢法。與輪詢方法相同,但是給每個后端數(shù)據(jù)庫分配了一個權(quán)重值。這個值決定了這個后端相對于其他后端接受負載的比例。例如,一個后端的權(quán)重值為2,那么其負載的請求數(shù)是權(quán)重為1的后端的兩倍。
然而,上述負載均衡方法均沒有考慮到不同計算機節(jié)點的差異性。隨機選擇法總是隨機選擇數(shù)據(jù)庫節(jié)點,完全不了解后端狀態(tài)也完全沒有可控性。而輪詢法和加權(quán)輪詢法在各個后端數(shù)據(jù)庫之間按順序循環(huán)執(zhí)行,這雖然可以使每個后端都有任務(wù),但并不能做到各個后端任務(wù)的最優(yōu)分配。
因此,需要提供一種數(shù)據(jù)庫集群系統(tǒng)中進行動態(tài)負載均衡的方法和系統(tǒng),通過對數(shù)據(jù)庫后端節(jié)點的運行狀態(tài)進行測量,實時獲得后端節(jié)點的響應(yīng)效率評價值,當集群控制器收到用戶請求時,選擇效率評價值最高的后端節(jié)點來執(zhí)行,以避免后端節(jié)點的過熱和故障。
2 動態(tài)負載均衡設(shè)計
針對上面負載均衡方法的不足,提出了基于節(jié)點狀態(tài)的動態(tài)負載均衡方法可對存儲節(jié)點的即時狀態(tài)進行動態(tài)測量和計算,與傳統(tǒng)的節(jié)點狀態(tài)無關(guān)的均衡方法相比,動態(tài)均衡方法可以更有效地均衡負載、防止熱點和單點故障。
在如圖1所示的數(shù)據(jù)庫集群系統(tǒng)中,用戶提出請求后通過集群控制器對數(shù)據(jù)庫后端節(jié)點進行操作。集群控制器包含負載均衡決策組件、后端檢測組件、用戶請求分發(fā)組件和負載信息表,其中,負載均衡決策組件用于執(zhí)行負載均衡決策過程;后端檢測組件用于執(zhí)行后端負載檢測過程;負載信息表用于保存后端負載檢測過程所得出的測量值;用戶請求分發(fā)組件用于暫存用戶請求、發(fā)起后端負載檢測過程、發(fā)起負載均衡決策過程、并將用戶請求發(fā)至決策結(jié)果所包含的數(shù)據(jù)庫后端節(jié)點執(zhí)行。
數(shù)據(jù)庫后端節(jié)點包含通信組件、數(shù)據(jù)庫服務(wù)器和負載測量組件,其中,通信組件用于接收后端檢測請求、發(fā)起負載測量、將負載測量值存入集群控制中的負載信息表中,并接受集群控制器發(fā)來的用戶請求,將其發(fā)給數(shù)據(jù)庫服務(wù)器執(zhí)行,將得到的結(jié)果集返回至集群控制器;數(shù)據(jù)庫服務(wù)器用于接收通信組件發(fā)來的用戶請求并作出應(yīng)答;負載測量組件用于接收通信組件發(fā)來的負載測量請求并作出應(yīng)答。負載測量組件又進一步包含:CPU使用率檢測模塊、內(nèi)存使用率檢測模塊、磁盤已占用空間比例檢測模塊、空閑磁盤大小檢測模塊、磁盤IO延遲檢測模塊和網(wǎng)絡(luò)延遲檢測模塊。
動態(tài)負載均衡算法如下:
Step1:Measure the load balancing information
Create load balance table
Create load balance trigger
Step2:Compute the load balancing information
Normalize the load data
Compute the entropy of the load data
Compute the weight of the load data based on the entropy
Compute the sum of the weight to quantify the load
Step3:Select the node to execute
3 動態(tài)負載均衡實現(xiàn)
3.1 負載信息測量
負載信息測量主要解決節(jié)點負載評價問題,目的是為了更確切有效地對節(jié)點負載情況進行評價,以準確發(fā)現(xiàn)節(jié)點是否超載,同時有助于更有效地尋找空閑節(jié)點。
負載測量在動態(tài)負載均衡中起著重要的作用,只有負載信息測量準確,才能為進一步的負載決策提供條件,才可以確定節(jié)點是否超載,是否需要轉(zhuǎn)移新任務(wù)。
本文中以CPU使用率、內(nèi)存使用率、空閑磁盤占用比例、空閑磁盤大小、網(wǎng)絡(luò)延遲、磁盤IO延遲作為負載信息的測量對象。
3.1.1 CPU使用率測量CU
利用Windows API函數(shù)可得知CPU空閑時間和系統(tǒng)時間,從而得知CPU空閑使用率,進而得知CPU使用率。CPU空閑使用率CurrentCpuIdle=SysPerfInfo.liIdleTime/SysTimeInfo.liKeSystemTime;CPU
使用率CurrentCpuUsage%=100-(CurrentCpuIdle×100)。
3.1.2 內(nèi)存使用率測量MU
利用Windows API函數(shù)可直接得知內(nèi)存使用率,GlobalMemoryStatus(&stat);memory_usage%=stat.dwMemoryLoad。
3.1.3 空閑磁盤占用比例測量DFE
利用Windows API函數(shù)直接可得知空閑磁盤和整個磁盤的大小,它們的比值即為空閑磁盤占用比例。
fResult=pGetDiskFreeSpaceEx(pszDrive,
(PULARGE_INTEGER)&i64FreeBytesToCaller,
(PULARGE_INTEGER)&i64TotalBytes,
(PULARGE_INTEGER)&i64FreeBytes);
空閑磁盤占用比例disk_usage%=i64FreeBytes×100/i64TotalBytes。
3.1.4 空閑磁盤大小測量DF
根據(jù)上面的pGetDiskFreeSpaceEx函數(shù)可直接得出空閑磁盤大小diskfree=i64FreeBytes/(1024×1024)。
3.1.5 磁盤IO延遲測量IO
磁盤IO延遲的原理是通過讀取磁盤上的文件時間來得出磁盤IO延遲。
OutSpeed=(sysafter.wMinute-sysbefore.wMinute)×60000+
(sysafter.wSecond-sysbefore.wSecond)×1000+
(sysafter.wMilliseconds-sysbefore.wMilliseconds);
3.1.6 網(wǎng)絡(luò)延遲測量ND
網(wǎng)絡(luò)延遲的原理是對各個后端節(jié)點執(zhí)行一條SQL語句,SQL語句運行的時間即為網(wǎng)絡(luò)延遲。
long before=System.currentTimeMillis();
PreparedStatement pm =conn.prepareStatement("DELETE FROM loadstate");
pm.executeUpdate();
long now=System.currentTimeMillis();
long timegap=now-before;
圖2所示為在集群管理器中負載均衡測量截圖。
3.2 負載決策
節(jié)點的負載決策是負載均衡的一個重要因素,因為只有系統(tǒng)準確及時地對節(jié)點負載進行評價記錄,節(jié)點才可以及時準確地確定本身是否超載,是否需要轉(zhuǎn)移新進任務(wù),同時忙節(jié)點也可以有效地尋找空閑節(jié)點以轉(zhuǎn)移自身的超載任務(wù),相反,如果節(jié)點負載決策不準確,則節(jié)點無法及時準確定位自己的狀態(tài),以至于忙節(jié)點在超載的狀態(tài)下仍接受新的任務(wù)。
一般地,某個屬性的屬性值變異程度越大,信息熵越小,該屬性提供的信息量越大,即該屬性在方案排序中所起的作用越大,從而該屬性的權(quán)重也應(yīng)該越大;反之,某個屬性的屬性值變異程度越小,信息熵越大,該屬性提供的信息量越小,即該屬性在方案排序中所起的作用越小,從而該屬性的權(quán)重也應(yīng)該越小。
計算節(jié)點p上的模糊效用值zi;
步驟5:根據(jù)zi(i∈M)對節(jié)點進行排序和擇優(yōu),zi值最大的為最優(yōu)節(jié)點。
下面通過一組測得的負載信息數(shù)據(jù)來說明整個負載決策的流程。
從3個節(jié)點采集到的負載決策矩陣如表1所示。
步驟1:根據(jù)式(1)、式(2)規(guī)范化決策矩陣,得到規(guī)范化矩陣R如表2所示。
步驟5:根據(jù)表格5中模糊效用值對節(jié)點進行排序和擇優(yōu),zi最大的為最優(yōu)節(jié)點,即第一個節(jié)點為最優(yōu)節(jié)點,這時將把任務(wù)分配給第一個節(jié)點。
4 性能測試與分析
為了驗證該負載均衡算法的有效性和優(yōu)越性[5-6],通過實驗進行了驗證。集群由4臺電腦組成,它們由局域網(wǎng)連接而成,網(wǎng)絡(luò)帶寬100 Mb/s,4臺電腦配置相同:CPU是Intel(R) Xeon(R) E5405 2.00 GHz,3G內(nèi)存,Windows XP SP3操作系統(tǒng)。在其中的一臺電腦上配置集群控制器,另外3臺電腦上裝有SQL Server2005數(shù)據(jù)庫。
實驗對隨機法、輪詢法、加權(quán)輪詢法和動態(tài)負載均衡算法的效率進行對比,分別讓集群中幾個節(jié)點的狀態(tài)不同,首先在3個節(jié)點輕載的情況下對4種負載均衡方法進行對比;然后使其中一個節(jié)點超載對4種負載均衡進行對比;使其中兩個節(jié)點超載再進行對比。
根據(jù)實驗數(shù)據(jù)得出以上三種實驗的對比圖如圖3、圖4、圖5所示。
根據(jù)實驗可以得出:在節(jié)點都很空閑(輕載)的情況下,動態(tài)負載均衡不一定是最優(yōu)的,反而有時因為決策運算會花費時間導(dǎo)致其查詢的時間會更長。在節(jié)點輕載和超載不一的時候,動態(tài)負載均衡體現(xiàn)出它的優(yōu)越性,是幾種負載策略中效率最高的;加權(quán)輪詢法次之;隨機法和輪詢法效率較低。
針對分布式數(shù)據(jù)庫集群關(guān)鍵技術(shù)的負載均衡進行研究,提出了一種動態(tài)負載均衡策略,對于縮短事務(wù)平均響應(yīng)時間和提高整個系統(tǒng)資源利用率起了很好的作用,并通過實驗和其他負載均衡策略進行對比,證明了它的有效性和高效性。在今后的工作中,將進一步完善本文提出的負載均衡這一數(shù)據(jù)庫集群關(guān)鍵技術(shù),進一步提升分布式集群數(shù)據(jù)庫系統(tǒng)的可靠性、穩(wěn)定性以及高效性。
參考文獻
[1] YANG X J,DOU Y,HU Q F.Progress and challenges in high performance computer technology[J].J Comput Sci & Technol,2006,21(5):674-681.
[2] 蔣江,張民選,廖湘科.基于多種資源的負載均衡算法的研究[J].電子學報,2002,30(8):1148-1152.
[3] ZHENG G B.Achieving high performance on extremely large parallel machines:Performance Prediction and Load Balancing[D].Urbana:UIUC,2005.
[4] 徐澤水.不確定多屬性決策方法及應(yīng)用[M].北京:清華大學出版社,2004.
[5] 陳勇.一種高效的分布式反饋流量負載均衡算法[J].計算機工程,2009,35(2):98-102.
[6] 谷鳳娜,張志斌,王麗宏.基于分布式入侵檢測系統(tǒng)的負載均衡算法的比較[J].計算機科學,2008,35(11):63-73.