李峻屹
(陜西警官職業(yè)學(xué)院,信息技術(shù)系, 陜西,西安 710021)
隨著信息技術(shù)的普及,日常生活中的各個領(lǐng)域都離不開信息化系統(tǒng),系統(tǒng)運行需要進行海量數(shù)據(jù)的存儲及讀取操作,單一計算機無法實現(xiàn)高效處理,在這種背景下分布式數(shù)據(jù)庫應(yīng)運而生。分布式數(shù)據(jù)庫將物理上集中的數(shù)據(jù)庫分散為多個數(shù)據(jù)存儲單元存儲于多個存儲節(jié)點之中,利用網(wǎng)絡(luò)將存儲節(jié)點連接起來組成分布式數(shù)據(jù)庫。這種方式具有更高的處理性能,但由于每個節(jié)點的訪問頻率不同容易導(dǎo)致部分節(jié)點負載過重、性能下降甚至崩潰。因此,需要設(shè)計良好的負載均衡策略,利用均衡分配提升分布式數(shù)據(jù)庫的穩(wěn)定性。本研究以HBase開源分布式數(shù)據(jù)庫為例,研究一種改進的負載均衡算法,以此規(guī)避節(jié)點崩潰風險、提升分布式數(shù)據(jù)庫的安全性。
HBase是利用BigTable思想實現(xiàn)分布式面向列的數(shù)據(jù)庫,在Hadoop上實現(xiàn)了類似于BigTable的存儲功能,具有多維、稀疏、持久化映射等特性,在非結(jié)構(gòu)化數(shù)據(jù)的存儲方面具有高可靠性、高性能以及高伸縮性,在大規(guī)模集群中應(yīng)用廣泛[1]。
某種意義上來講HBase可以看作巨大的表,通過行鍵Rowkey、列族ColumnFamily、時間戳Timestamp等實現(xià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ù)庫在結(jié)構(gòu)上包括客戶端Client、分布式服務(wù)組件ZooKeeper、主服務(wù)器Master、Region Server服務(wù)器以及文件系統(tǒng)hdfs 5個部分組成。總體架構(gòu)如圖1所示。其中,Client負責與Master、Region Server進行通信,ZooKeeper負責節(jié)點監(jiān)控狀況感知、同步及配置管理等服務(wù),Master負責集群負載均衡管理,Region Server Cluster負責Region的讀寫,實現(xiàn)數(shù)據(jù)處理。Region是HBase中的基本單元,由Store組成,分布于集群的各個節(jié)點之中,每個Region擴大到一定大小之后會進行自動拆分。Store作為Region的存儲單元主要包括MemStore和StoreFile。接收到寫入請求時,數(shù)據(jù)線寫入MemStore,達到閾值后再存入HFile[4-5]。

圖1 HBase架構(gòu)
目前市面上存在多種負載均衡產(chǎn)品,從不同的側(cè)重點實現(xiàn)不同場景下的均衡算法,常用的負載均衡技術(shù)包括以下幾類。
(1) 軟件和硬件。硬件方式主要是增加節(jié)點數(shù)量,一方面增加了成本,另一方面也造成資源浪費;軟件方式主要是利用均衡算法進行負載分配,成本低且易實現(xiàn)。
(2) 本地和全局。本地方式是節(jié)點均在本地,通過設(shè)備搭建排除節(jié)點故障;全局方式則是節(jié)點處于不同位置,適用于各地均存在設(shè)備的大型公司。
(3) 網(wǎng)絡(luò)。網(wǎng)絡(luò)層是OSI的7層網(wǎng)絡(luò)模型根據(jù)不同層面制定不同的負載策略。
(4) 鏈路。將網(wǎng)絡(luò)中多條鏈路看做一條,根據(jù)IP匹配運營商接口進行分流。
因此,綜合對比之下,本研究采用軟件方式利用算法實現(xiàn)HBase分布式數(shù)據(jù)庫的負載均衡。
HBase原有負載策略主要調(diào)整集群節(jié)點的Region數(shù)量來實現(xiàn)。首先,篩選出負載過重或空閑的節(jié)點。然后,利用迭代的方式調(diào)整節(jié)點Region進行交換或者遷移,根據(jù)判定因素保留有效調(diào)整,在調(diào)整后各節(jié)點的數(shù)值近似時完成負載均衡。通過使用空間總和、節(jié)點數(shù)量計算單個節(jié)點在均衡后的目標空間使用率如式(1)[6-7],
(1)
式中,avgcnt為空間利用率,regioncount為區(qū)域空間,servercount為節(jié)點數(shù)量,利用配置項slop計算閾值的上限ceil與下限floor:
floor=Math.fioor(avg_cnt×(1-slop))
(2)
ceil=Math.ceil(avg_cnt×(1+slop))
(3)
以此上下限閾值進行篩選,將篩選出的節(jié)點作為一個邏輯新集群,利用遷移計劃表記錄Region的遷移及交換情況。設(shè)目前集群狀態(tài)值為cost,cost值的計算包括3個影響因素:
(4)


圖2 原有策略算法流程
HBase的原負載策略必須是3個重要環(huán)節(jié)都不出差錯才能實現(xiàn)均衡,在策略上存在缺陷:首先,節(jié)點篩選過程必須找出全部的空閑及過載節(jié)點;其次,需要根據(jù)當前準確負載情況才能確定判定因素;最后,迭代方式的選擇需考慮計算過程中的潛在問題,但它只考慮分布式數(shù)據(jù)庫集群節(jié)點的空間負載情況,未考慮節(jié)點存在熱點訪問的情況。
針對原有策略的缺陷,基于熱點訪問對負載均衡算法進行改進。首先根據(jù)熱點訪問負載情況篩選出需要調(diào)整的節(jié)點,然后再進行region調(diào)整。與此同時,判定因素也基于熱點訪問進行確定,迭代時以不破壞已有環(huán)境為前提逐步進行調(diào)整與優(yōu)化。改進的方面主要包括以下幾點。
(1) 信息采集時既需要收集region count,也需要收集節(jié)點的request數(shù),并且記錄region與request的關(guān)系。
(2) 針對原算法中最終集群以及初始集群里未篩選到的節(jié)點,再次計算request per second值以及floor_req、ceil_req值如式(5)~式(7):
(5)
floorreq=avgreq×(1-reqslop)
(6)
ceilreq=avgreq×(1+reqslop)
(7)
其中,server_count為節(jié)點數(shù)量,floorreq、ceilreq為是否需要進行負載調(diào)整的閾值下限與上限,avg_req為空間利用率負載,reqslop為配置項。
(3) 計算集群狀態(tài)cost值時,除了region遷移成本和region本地化成本之外還要考慮熱點訪問的負載情況,采用加權(quán)平方和進行計算[8-9],即:
(8)

(4) 選擇策略時cost值計算依然沿用原有方式:計算新的cost值與前值比較,保留有效調(diào)整存于遷移計劃表。
(5) 重復(fù)改進策略直至迭代次數(shù),按照遷移計劃表執(zhí)行即可[10-11]。
整體改進后基于熱點訪問的負載均衡算法流程如圖3所示。

圖3 基于熱點訪問改進的算法流程
在算法實現(xiàn)上基于熱點訪問的負載均衡算法主要包括采集模塊、處理模塊及迭代模塊3個部分。首先,采集模塊負責收集節(jié)點的count數(shù)、request數(shù)并與region對應(yīng);其次,處理模塊負責計算閾值對節(jié)點進行篩選并將request值進行記錄,request表結(jié)構(gòu)如表1所示。其中,第一橫行為region_id,regionx_x代表節(jié)點,第二行為region在上一時段的request數(shù)量,最后一行為region在當前時段的request計數(shù)器,隨讀寫次數(shù)而增加。在一個采集時段結(jié)束之后,利用request cnt數(shù)據(jù)更新request值并將request cnt置為0。最后,迭代模塊計算cost值并實現(xiàn)數(shù)值對比后選擇策略進行迭代[12-13]。

表1 request表結(jié)構(gòu)
為了驗證改進負載均衡算法的有效性及算法的均衡效果,通過虛擬機VMware搭建Hadoop集群環(huán)境進行測試,版本采用HBase1.2.6,各個節(jié)點Master、S1、S2、S3分別分配置20G空間、1G內(nèi)存。
采用原負載策略與基于熱點訪問改進的算法進行對比分析,利用同樣的shell讀寫數(shù)據(jù),確保2種算法的初始數(shù)據(jù)一致[6]。
對3個節(jié)點分別寫入數(shù)據(jù),采集region與request值,得到在負載均衡前后2種算法各個節(jié)點的region count數(shù)量與request數(shù)量對比結(jié)果如圖4和圖5所示。

圖4 region count值對比結(jié)果

圖5 request值對比結(jié)果
由圖4可知,未執(zhí)行負載均衡前各節(jié)點的region count數(shù)量相差較大,進行負載均衡后2種算法都達到了較好的均衡效果。由圖5可知,若利用shell腳本只對S1節(jié)點讀寫數(shù)據(jù)(即S1節(jié)點處于熱點訪問)時,原策略不能達到均衡狀態(tài),而改進的算法各節(jié)點的request值相差不大,均衡效果更好,性能更為優(yōu)異[14-15]。
本研究分析了HBase數(shù)據(jù)格式及系統(tǒng)架構(gòu),通過比較當前負載產(chǎn)品的優(yōu)缺點,最終選擇軟件方式對HBase數(shù)據(jù)庫進行負載均衡,根據(jù)原有策略的缺陷提出了基于熱點訪問的改進算法。經(jīng)過驗證與分析,改進算法負載均衡效果更佳。但也有不足之處,改進算法是以集群中各節(jié)點的性能一致為前提,未考慮節(jié)點自身性能的差異。后續(xù)將繼續(xù)研究節(jié)點性能的評估算法,改進算法在節(jié)點自身性能不同情況下的均衡策略。