李峻屹
(陜西警官職業(yè)學(xué)院,信息技術(shù)系, 陜西,西安 710021)
隨著信息技術(shù)的普及,日常生活中的各個(gè)領(lǐng)域都離不開(kāi)信息化系統(tǒng),系統(tǒng)運(yùn)行需要進(jìn)行海量數(shù)據(jù)的存儲(chǔ)及讀取操作,單一計(jì)算機(jī)無(wú)法實(shí)現(xiàn)高效處理,在這種背景下分布式數(shù)據(jù)庫(kù)應(yīng)運(yùn)而生。分布式數(shù)據(jù)庫(kù)將物理上集中的數(shù)據(jù)庫(kù)分散為多個(gè)數(shù)據(jù)存儲(chǔ)單元存儲(chǔ)于多個(gè)存儲(chǔ)節(jié)點(diǎn)之中,利用網(wǎng)絡(luò)將存儲(chǔ)節(jié)點(diǎn)連接起來(lái)組成分布式數(shù)據(jù)庫(kù)。這種方式具有更高的處理性能,但由于每個(gè)節(jié)點(diǎn)的訪問(wèn)頻率不同容易導(dǎo)致部分節(jié)點(diǎn)負(fù)載過(guò)重、性能下降甚至崩潰。因此,需要設(shè)計(jì)良好的負(fù)載均衡策略,利用均衡分配提升分布式數(shù)據(jù)庫(kù)的穩(wěn)定性。本研究以HBase開(kāi)源分布式數(shù)據(jù)庫(kù)為例,研究一種改進(jìn)的負(fù)載均衡算法,以此規(guī)避節(jié)點(diǎn)崩潰風(fēng)險(xiǎn)、提升分布式數(shù)據(jù)庫(kù)的安全性。
HBase是利用BigTable思想實(shí)現(xiàn)分布式面向列的數(shù)據(jù)庫(kù),在Hadoop上實(shí)現(xiàn)了類似于BigTable的存儲(chǔ)功能,具有多維、稀疏、持久化映射等特性,在非結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)方面具有高可靠性、高性能以及高伸縮性,在大規(guī)模集群中應(yīng)用廣泛[1]。
某種意義上來(lái)講HBase可以看作巨大的表,通過(guò)行鍵Rowkey、列族ColumnFamily、時(shí)間戳Timestamp等實(shí)現(xiàn)信息檢索,在缺失時(shí)間戳的情況下默認(rèn)返回最新數(shù)據(jù)。利用JSON數(shù)據(jù)格式可直觀展示HBase數(shù)據(jù)模型,JSON格式可表示為[2-3]
RowKey{
ColumnFamilyA{
ColumnX:
t2 value2
t1 value1
ColumnY:
t1 value4
}
ColumnFamilyB{
t2 value3
}
}
HBase分布式數(shù)據(jù)庫(kù)在結(jié)構(gòu)上包括客戶端Client、分布式服務(wù)組件ZooKeeper、主服務(wù)器Master、Region Server服務(wù)器以及文件系統(tǒng)hdfs 5個(gè)部分組成。總體架構(gòu)如圖1所示。其中,Client負(fù)責(zé)與Master、Region Server進(jìn)行通信,ZooKeeper負(fù)責(zé)節(jié)點(diǎn)監(jiān)控狀況感知、同步及配置管理等服務(wù),Master負(fù)責(zé)集群負(fù)載均衡管理,Region Server Cluster負(fù)責(zé)Region的讀寫(xiě),實(shí)現(xiàn)數(shù)據(jù)處理。Region是HBase中的基本單元,由Store組成,分布于集群的各個(gè)節(jié)點(diǎn)之中,每個(gè)Region擴(kuò)大到一定大小之后會(huì)進(jìn)行自動(dòng)拆分。Store作為Region的存儲(chǔ)單元主要包括MemStore和StoreFile。接收到寫(xiě)入請(qǐng)求時(shí),數(shù)據(jù)線寫(xiě)入MemStore,達(dá)到閾值后再存入HFile[4-5]。
圖1 HBase架構(gòu)
目前市面上存在多種負(fù)載均衡產(chǎn)品,從不同的側(cè)重點(diǎn)實(shí)現(xiàn)不同場(chǎng)景下的均衡算法,常用的負(fù)載均衡技術(shù)包括以下幾類。
(1) 軟件和硬件。硬件方式主要是增加節(jié)點(diǎn)數(shù)量,一方面增加了成本,另一方面也造成資源浪費(fèi);軟件方式主要是利用均衡算法進(jìn)行負(fù)載分配,成本低且易實(shí)現(xiàn)。
(2) 本地和全局。本地方式是節(jié)點(diǎn)均在本地,通過(guò)設(shè)備搭建排除節(jié)點(diǎn)故障;全局方式則是節(jié)點(diǎn)處于不同位置,適用于各地均存在設(shè)備的大型公司。
(3) 網(wǎng)絡(luò)。網(wǎng)絡(luò)層是OSI的7層網(wǎng)絡(luò)模型根據(jù)不同層面制定不同的負(fù)載策略。
(4) 鏈路。將網(wǎng)絡(luò)中多條鏈路看做一條,根據(jù)IP匹配運(yùn)營(yíng)商接口進(jìn)行分流。
因此,綜合對(duì)比之下,本研究采用軟件方式利用算法實(shí)現(xiàn)HBase分布式數(shù)據(jù)庫(kù)的負(fù)載均衡。
HBase原有負(fù)載策略主要調(diào)整集群節(jié)點(diǎn)的Region數(shù)量來(lái)實(shí)現(xiàn)。首先,篩選出負(fù)載過(guò)重或空閑的節(jié)點(diǎn)。然后,利用迭代的方式調(diào)整節(jié)點(diǎn)Region進(jìn)行交換或者遷移,根據(jù)判定因素保留有效調(diào)整,在調(diào)整后各節(jié)點(diǎn)的數(shù)值近似時(shí)完成負(fù)載均衡。通過(guò)使用空間總和、節(jié)點(diǎn)數(shù)量計(jì)算單個(gè)節(jié)點(diǎn)在均衡后的目標(biāo)空間使用率如式(1)[6-7],
(1)
式中,avgcnt為空間利用率,regioncount為區(qū)域空間,servercount為節(jié)點(diǎn)數(shù)量,利用配置項(xiàng)slop計(jì)算閾值的上限ceil與下限floor:
floor=Math.fioor(avg_cnt×(1-slop))
(2)
ceil=Math.ceil(avg_cnt×(1+slop))
(3)
以此上下限閾值進(jìn)行篩選,將篩選出的節(jié)點(diǎn)作為一個(gè)邏輯新集群,利用遷移計(jì)劃表記錄Region的遷移及交換情況。設(shè)目前集群狀態(tài)值為cost,cost值的計(jì)算包括3個(gè)影響因素:
(4)
圖2 原有策略算法流程
HBase的原負(fù)載策略必須是3個(gè)重要環(huán)節(jié)都不出差錯(cuò)才能實(shí)現(xiàn)均衡,在策略上存在缺陷:首先,節(jié)點(diǎn)篩選過(guò)程必須找出全部的空閑及過(guò)載節(jié)點(diǎn);其次,需要根據(jù)當(dāng)前準(zhǔn)確負(fù)載情況才能確定判定因素;最后,迭代方式的選擇需考慮計(jì)算過(guò)程中的潛在問(wèn)題,但它只考慮分布式數(shù)據(jù)庫(kù)集群節(jié)點(diǎn)的空間負(fù)載情況,未考慮節(jié)點(diǎn)存在熱點(diǎn)訪問(wèn)的情況。
針對(duì)原有策略的缺陷,基于熱點(diǎn)訪問(wèn)對(duì)負(fù)載均衡算法進(jìn)行改進(jìn)。首先根據(jù)熱點(diǎn)訪問(wèn)負(fù)載情況篩選出需要調(diào)整的節(jié)點(diǎn),然后再進(jìn)行region調(diào)整。與此同時(shí),判定因素也基于熱點(diǎn)訪問(wèn)進(jìn)行確定,迭代時(shí)以不破壞已有環(huán)境為前提逐步進(jìn)行調(diào)整與優(yōu)化。改進(jìn)的方面主要包括以下幾點(diǎn)。
(1) 信息采集時(shí)既需要收集region count,也需要收集節(jié)點(diǎn)的request數(shù),并且記錄region與request的關(guān)系。
(2) 針對(duì)原算法中最終集群以及初始集群里未篩選到的節(jié)點(diǎn),再次計(jì)算request per second值以及floor_req、ceil_req值如式(5)~式(7):
(5)
floorreq=avgreq×(1-reqslop)
(6)
ceilreq=avgreq×(1+reqslop)
(7)
其中,server_count為節(jié)點(diǎn)數(shù)量,floorreq、ceilreq為是否需要進(jìn)行負(fù)載調(diào)整的閾值下限與上限,avg_req為空間利用率負(fù)載,reqslop為配置項(xiàng)。
(3) 計(jì)算集群狀態(tài)cost值時(shí),除了region遷移成本和region本地化成本之外還要考慮熱點(diǎn)訪問(wèn)的負(fù)載情況,采用加權(quán)平方和進(jìn)行計(jì)算[8-9],即:
(8)
(4) 選擇策略時(shí)cost值計(jì)算依然沿用原有方式:計(jì)算新的cost值與前值比較,保留有效調(diào)整存于遷移計(jì)劃表。
(5) 重復(fù)改進(jìn)策略直至迭代次數(shù),按照遷移計(jì)劃表執(zhí)行即可[10-11]。
整體改進(jìn)后基于熱點(diǎn)訪問(wèn)的負(fù)載均衡算法流程如圖3所示。
圖3 基于熱點(diǎn)訪問(wèn)改進(jìn)的算法流程
在算法實(shí)現(xiàn)上基于熱點(diǎn)訪問(wèn)的負(fù)載均衡算法主要包括采集模塊、處理模塊及迭代模塊3個(gè)部分。首先,采集模塊負(fù)責(zé)收集節(jié)點(diǎn)的count數(shù)、request數(shù)并與region對(duì)應(yīng);其次,處理模塊負(fù)責(zé)計(jì)算閾值對(duì)節(jié)點(diǎn)進(jìn)行篩選并將request值進(jìn)行記錄,request表結(jié)構(gòu)如表1所示。其中,第一橫行為region_id,regionx_x代表節(jié)點(diǎn),第二行為region在上一時(shí)段的request數(shù)量,最后一行為region在當(dāng)前時(shí)段的request計(jì)數(shù)器,隨讀寫(xiě)次數(shù)而增加。在一個(gè)采集時(shí)段結(jié)束之后,利用request cnt數(shù)據(jù)更新request值并將request cnt置為0。最后,迭代模塊計(jì)算cost值并實(shí)現(xiàn)數(shù)值對(duì)比后選擇策略進(jìn)行迭代[12-13]。
表1 request表結(jié)構(gòu)
為了驗(yàn)證改進(jìn)負(fù)載均衡算法的有效性及算法的均衡效果,通過(guò)虛擬機(jī)VMware搭建Hadoop集群環(huán)境進(jìn)行測(cè)試,版本采用HBase1.2.6,各個(gè)節(jié)點(diǎn)Master、S1、S2、S3分別分配置20G空間、1G內(nèi)存。
采用原負(fù)載策略與基于熱點(diǎn)訪問(wèn)改進(jìn)的算法進(jìn)行對(duì)比分析,利用同樣的shell讀寫(xiě)數(shù)據(jù),確保2種算法的初始數(shù)據(jù)一致[6]。
對(duì)3個(gè)節(jié)點(diǎn)分別寫(xiě)入數(shù)據(jù),采集region與request值,得到在負(fù)載均衡前后2種算法各個(gè)節(jié)點(diǎn)的region count數(shù)量與request數(shù)量對(duì)比結(jié)果如圖4和圖5所示。
圖4 region count值對(duì)比結(jié)果
圖5 request值對(duì)比結(jié)果
由圖4可知,未執(zhí)行負(fù)載均衡前各節(jié)點(diǎn)的region count數(shù)量相差較大,進(jìn)行負(fù)載均衡后2種算法都達(dá)到了較好的均衡效果。由圖5可知,若利用shell腳本只對(duì)S1節(jié)點(diǎn)讀寫(xiě)數(shù)據(jù)(即S1節(jié)點(diǎn)處于熱點(diǎn)訪問(wèn))時(shí),原策略不能達(dá)到均衡狀態(tài),而改進(jìn)的算法各節(jié)點(diǎn)的request值相差不大,均衡效果更好,性能更為優(yōu)異[14-15]。
本研究分析了HBase數(shù)據(jù)格式及系統(tǒng)架構(gòu),通過(guò)比較當(dāng)前負(fù)載產(chǎn)品的優(yōu)缺點(diǎn),最終選擇軟件方式對(duì)HBase數(shù)據(jù)庫(kù)進(jìn)行負(fù)載均衡,根據(jù)原有策略的缺陷提出了基于熱點(diǎn)訪問(wèn)的改進(jìn)算法。經(jīng)過(guò)驗(yàn)證與分析,改進(jìn)算法負(fù)載均衡效果更佳。但也有不足之處,改進(jìn)算法是以集群中各節(jié)點(diǎn)的性能一致為前提,未考慮節(jié)點(diǎn)自身性能的差異。后續(xù)將繼續(xù)研究節(jié)點(diǎn)性能的評(píng)估算法,改進(jìn)算法在節(jié)點(diǎn)自身性能不同情況下的均衡策略。