張敬偉,丁志均,楊青,張會兵,張海濤,周婭
(1.桂林電子科技大學(xué)廣西可信軟件重點實驗室,廣西桂林541004; 2.桂林電子科技大學(xué)廣西自動檢測技術(shù)與儀器重點實驗室,廣西桂林541004)
異構(gòu)Redis集群大規(guī)模評論數(shù)據(jù)存儲負(fù)載均衡設(shè)計
張敬偉1,丁志均1,楊青2,張會兵1,張海濤1,周婭1
(1.桂林電子科技大學(xué)廣西可信軟件重點實驗室,廣西桂林541004; 2.桂林電子科技大學(xué)廣西自動檢測技術(shù)與儀器重點實驗室,廣西桂林541004)
大規(guī)模評論數(shù)據(jù)的存儲與查詢性能對構(gòu)建于其上的各類應(yīng)用的快速響應(yīng)具有重要影響.同時,異構(gòu)計算環(huán)境中各計算節(jié)點性能呈現(xiàn)差異,如何充分開采各節(jié)點的計算和存儲性能,優(yōu)化大規(guī)模評論數(shù)據(jù)的存儲與查詢性能,是一個關(guān)鍵挑戰(zhàn).基于Redis集群的數(shù)據(jù)管理優(yōu)勢,首先提出了一種同構(gòu)環(huán)境下基于卡槽存儲平衡的大規(guī)模評論數(shù)據(jù)存儲模型;然后論證了卡槽數(shù)目與節(jié)點查詢效率的關(guān)系,以“負(fù)載與訪問性能相平衡”的原則分配卡槽,進一步設(shè)計了異構(gòu)環(huán)境下的集群節(jié)點負(fù)載計算和存儲分配方法,充分開采了異構(gòu)Redis集群中不同節(jié)點的性能.實驗結(jié)果表明,提出的存儲模型具有很好的存儲平衡效果,提升了集群的整體查詢效率.
大規(guī)模評論數(shù)據(jù);存儲負(fù)載均衡;查詢優(yōu)化
用戶在電子商務(wù)網(wǎng)站、Web論壇等貢獻了海量的評論數(shù)據(jù),其蘊含了用戶的興趣偏好、主觀觀點、潮流取向等信息,對在線推薦、輿情監(jiān)控、用戶畫像、公司商品服務(wù)決策等分析應(yīng)用具有重要價值.上述分析應(yīng)用通常要求以用戶、評論對象、時間段等維度為查詢約束開展高IO的數(shù)據(jù)獲取操作,以有效支撐上層的計算與分析,這對大規(guī)模評論數(shù)據(jù)的管理帶來了挑戰(zhàn).同時,快速發(fā)展的計算機硬件,例如多核CPU和大容量內(nèi)存,使得應(yīng)對大數(shù)據(jù)的分布式計算環(huán)境也不斷更新變化,異構(gòu)特征顯著,硬件的革新給大規(guī)模數(shù)據(jù)的管理帶來了新理念[1].如何利用大內(nèi)存帶來的存儲性價比優(yōu)勢進行有效的負(fù)載均衡設(shè)計,充分開采異構(gòu)集群中各計算節(jié)點的性能,是為基于大規(guī)模用戶評論數(shù)據(jù)的分析應(yīng)用及其快速響應(yīng)提供數(shù)據(jù)訪問優(yōu)化的關(guān)鍵,具有重要的應(yīng)用價值.
本文首先分析了基于評論數(shù)據(jù)分析應(yīng)用的查詢需求與特征,基于Redis的內(nèi)存數(shù)據(jù)管理優(yōu)勢,設(shè)計了一種同構(gòu)Redis集群下的評論數(shù)據(jù)平衡存儲模型,保證了各卡槽數(shù)據(jù)的均勻分配;進而根據(jù)卡槽與鍵值的對應(yīng)關(guān)系,測試配有不同卡槽數(shù)目的節(jié)點的查詢效率,并基于測試結(jié)果、運用最小二乘法擬合出各節(jié)點卡槽數(shù)目與查詢性能的關(guān)系,最后以“負(fù)載與訪問性能相平衡”的原則分配卡槽,從而充分開采了異構(gòu)Redis集群中不同性能節(jié)點的工作能力,提高了集群的整體查詢效率.測試并不考慮其他因素,只根據(jù)當(dāng)前的查詢性能進行判斷,避免了不可估計的參數(shù)影響,讓建議的方案具有較強的實時性.
本文內(nèi)容組織如下,第1節(jié)闡述了相關(guān)工作;第2節(jié)對具體問題需求進行了分析;第3節(jié)和第4節(jié)詳細介紹了建議的評論數(shù)據(jù)存儲模型,以及針對異構(gòu)Redis集群的負(fù)載計算和存儲分配的具體設(shè)計方案;第5節(jié)對提出的方法進行了實驗驗證;第6節(jié)對本文工作進行了總結(jié).
根據(jù)設(shè)計與實現(xiàn)方式的策略異同,現(xiàn)有的分布式存儲系統(tǒng)架構(gòu)主要分為兩個派別:主從結(jié)構(gòu)分布式存儲系統(tǒng)和對等網(wǎng)絡(luò)分布式存儲系統(tǒng).這兩類系統(tǒng)的主要區(qū)別在于有無中心控制節(jié)點.
HBase、BigTable[2]、HDFS[3]是前者的典型代表,其通過管理節(jié)點master管理整個集群,監(jiān)控各個存儲節(jié)點slave并維護slave節(jié)點的信息,系統(tǒng)的寫入與讀取均需要與master進行交互.因此,主從結(jié)構(gòu)分布式存儲結(jié)構(gòu)將系統(tǒng)角色劃分為master和slave,讓master節(jié)點負(fù)責(zé)slave節(jié)點系統(tǒng)負(fù)載、存儲平衡、故障恢復(fù)等問題.這種管理模式簡單,便于系統(tǒng)維護,但會造成master節(jié)點的壓力過大,成為整個系統(tǒng)的瓶頸,以及master節(jié)點的系統(tǒng)故障導(dǎo)致系統(tǒng)可用性問題[4].
對等網(wǎng)絡(luò)分布式存儲系統(tǒng)主要通過分布式哈希算法建立邏輯映射的方式,將數(shù)據(jù)與存儲節(jié)點關(guān)聯(lián).這種方式不需要設(shè)置中心管理節(jié)點,每個節(jié)點擁有并維護整個集群的信息,通過廣播方式向其他節(jié)點報告自身信息.這種分布式存儲架構(gòu)具有很好的拓展性,但由于沒有中心節(jié)點的控制,使得整個系統(tǒng)不能很好地根據(jù)當(dāng)前狀態(tài)進行負(fù)載的動態(tài)均衡.Redis即采用無中心節(jié)點的對等網(wǎng)絡(luò)存儲模式,建立有效的動態(tài)存儲負(fù)載均衡策略對Redis集群整體性能提升具有重要意義.
具體到對等網(wǎng)絡(luò)的存儲負(fù)載均衡問題,當(dāng)前的研究主要包含三個方面:1)構(gòu)建動態(tài)平衡存儲結(jié)構(gòu),維持整個集群的的平衡性.文獻[5]將各集群中主機節(jié)點構(gòu)建成一棵虛擬的平衡二叉樹,同時給出了虛擬二叉樹的路由方法以及節(jié)點的加入及刪除方法,提高了對等網(wǎng)絡(luò)的空間均衡和可用性.文獻[6]通過累積延遲周期調(diào)整邏輯分區(qū)的大小,并基于一種有向無環(huán)圖的方法實現(xiàn)邏輯分區(qū)的實時性分配.這種方式需要消耗大量時間來保證系統(tǒng)平衡,不適用于頻繁更新的存儲環(huán)境.2)設(shè)置數(shù)據(jù)的多個副本實現(xiàn)負(fù)載平衡.文獻[7-8]通過副本備份,讓集群中任意兩點的存儲內(nèi)容都有存儲交集,用戶發(fā)出請求時,可以同時向多個節(jié)點獲取內(nèi)容.這種方式可增加系統(tǒng)的局部處理能力及可靠性,但隨著副本數(shù)量的增加,維護多副本之間的一致性的開銷變大,增加了系統(tǒng)的負(fù)擔(dān).3)采用數(shù)據(jù)遷移技術(shù)實現(xiàn)系統(tǒng)負(fù)載均衡.文獻[9-10]通過權(quán)衡數(shù)據(jù)遷移獲得的收益與消耗的代價,提出分布式數(shù)據(jù)遷移算法,并借助于存儲位置優(yōu)化節(jié)點間負(fù)載平衡,提高了系統(tǒng)運行效率.本文的工作主要聚焦于構(gòu)建存儲平衡模型和負(fù)載遷移技術(shù),來解決異構(gòu)Redis集群環(huán)境下的動態(tài)存儲優(yōu)化問題.
在商品觀點分析、用戶畫像等基于評論數(shù)據(jù)的分析應(yīng)用中,通常需要以商品ID、時間范圍或用戶ID、時間范圍為條件展開查詢操作以獲取數(shù)據(jù).在采用key-value模式進行數(shù)據(jù)組織時,上述屬性需要封裝在key中,以建立與評論數(shù)據(jù)的一對一映射關(guān)系.多屬性封裝key影響數(shù)據(jù)存儲key的數(shù)量以及key包含數(shù)據(jù)的規(guī)模.當(dāng)較多數(shù)目的屬性或分割粒度較大的屬性被封裝成key時,鍵值的數(shù)目相對較少,容易實現(xiàn)整個集群的存儲平衡,但在進行部分屬性查詢時,需要以掃描的形式填充未給出屬性,降低了查詢效率;當(dāng)較少數(shù)目的屬性或分割粒度較小的屬性被封裝成key時,會使鍵值數(shù)目偏大,易造成存儲和訪問負(fù)載的不平衡.
在異構(gòu)集群環(huán)境下,高性能的節(jié)點會比低性能的節(jié)點具有更快的響應(yīng)速度,但并發(fā)訪問效率通常受低性能節(jié)點制約.如圖1(a)所示,在負(fù)載不均勻分配情況下,給予四個節(jié)點分配相同的負(fù)載量,雖然2~4節(jié)點的查詢時間小于20 ms,但最終運行時間由1號節(jié)點決定;而相對于負(fù)載均衡的負(fù)載分配(圖1(b)),所有節(jié)點返回的時間相近,從而提高了整個集群的查詢性能.Redis采用無中心控制節(jié)點的對等網(wǎng)絡(luò)分布式存儲結(jié)構(gòu),支持手動或默認(rèn)平均分配的方式分配卡槽實現(xiàn)數(shù)據(jù)存儲,這種分配方式并沒有考慮異構(gòu)集群環(huán)境下的節(jié)點性能差異,需要面向節(jié)點性能差異建立動態(tài)的負(fù)載均衡方法.
針對上述問題,本文首先設(shè)計滿足大規(guī)模評論數(shù)據(jù)查詢需求的平衡存儲模型,保證Redis中每個卡槽內(nèi)的數(shù)據(jù)量相對均勻;進而以同構(gòu)環(huán)境下存儲平衡的存儲模型為基礎(chǔ),針對Redis集群在異構(gòu)環(huán)境下存儲分配的不足,提出了動態(tài)負(fù)載計算和訪問性能預(yù)判的存儲分配方法,提高了異構(gòu)Redis集群的并發(fā)訪問效率.
評論數(shù)據(jù)主要包含商品ID、評論用戶、評論時間、評論內(nèi)容4個屬性.基于大規(guī)模評論數(shù)據(jù)的分析應(yīng)用主要以商品ID、時間范圍或評論用戶、時間范圍開展查詢操作.同時,用戶對商品的評論存在稀疏性,即一個用戶只對少量的商品進行過評論,而商品ID屬性對評論數(shù)據(jù)具有很好的聚合.依據(jù)查詢方式的不同,將評論數(shù)據(jù)的商品ID屬性與用戶屬性分別處理,商品ID屬性作為評論數(shù)據(jù)的承載單元,用戶屬性作為輔助索引.
圖1 不同存儲負(fù)載的訪問示例Fig.1 Accessing illustration on dif f erent storage loading
由于不同商品擁有的評論數(shù)目不同,導(dǎo)致基于商品ID存儲的數(shù)據(jù)規(guī)模不同.如果商品擁有的評論數(shù)目過大,將造成集群存儲不均衡.因此,本文提出以特定的評論數(shù)目(LineNum)為基準(zhǔn),對商品評論的時間屬性進行分割,構(gòu)建商品評論的二級索引.例如當(dāng)LineNum為1 000時,即將評論數(shù)據(jù)以1 000個評論條目為單位進行分割,并記錄每個分割單元的起始時間,使用Redis有序集合實現(xiàn)存儲.具體索引結(jié)構(gòu)如表1所示,其以“商品ID(ItemID)”為鍵值構(gòu)建第一層索引,“起始時間戳(StartTime)”為排序值構(gòu)建第二層索引,“商品ID:分割編號(ItemID:Number)”對應(yīng)評論數(shù)據(jù)集合.表2描述評論數(shù)據(jù)的具體組織結(jié)構(gòu),也采用有序集合進行存儲,其中具體值的內(nèi)容為“用戶ID:評論內(nèi)容(UserID:comment)”,“評論時間的時間戳(Timestamp)”仍然作為排序值使用.
表1 評論數(shù)據(jù)二級索引結(jié)構(gòu)Tab.1 Two-level index for comment data
表2 評論數(shù)據(jù)存儲結(jié)構(gòu)Tab.2 Storage structure for comment data
其次,使用“用戶ID(UserID)”屬性構(gòu)建輔助索引,其中存儲內(nèi)容形式為“ItemID:Number: Timestamp”,并通過“,”加以區(qū)分.在進行評論數(shù)據(jù)查詢時,只要涉及用戶ID屬性的查詢,通過檢索輔助索引的方式找到對應(yīng)的信息,基于用戶ID的輔助索引結(jié)構(gòu)如表3所示.
表3 基于用戶ID的輔助索引結(jié)構(gòu)Tab.3 A secondary index on UserID
上述存儲模型能滿足大規(guī)模評論數(shù)據(jù)的存儲與查詢需求,同時以商品ID屬性和Redis的卡槽數(shù)據(jù)組織模式為主要考慮因素讓評論數(shù)據(jù)分布更加均衡,確保每個卡槽的存儲數(shù)據(jù)量是相近的.
在異構(gòu)集群環(huán)境下,由于各節(jié)點的性能不一致,不合理的任務(wù)分配會降低整個集群的工作效率.鑒于Redis集群只提供了手動或默認(rèn)均勻分配存儲的方案,沒有提供根據(jù)工作當(dāng)前狀態(tài)優(yōu)化存儲分配的方法,本文設(shè)計了面向異構(gòu)Redis集群的負(fù)載計算和訪問性能預(yù)判的存儲分配方法,根據(jù)節(jié)點的實際查詢性能實現(xiàn)均衡的存儲分配.
設(shè)計的方法包含4個階段.(1)建立卡槽節(jié)點映射表與卡槽測試鍵列表:根據(jù)鍵值與Redis的卡槽映射關(guān)系,為每個卡槽生成一個測試鍵值對,將全部的測試鍵值對存儲在Redis集群中,并統(tǒng)計Redis集群信息,包括卡槽與節(jié)點關(guān)系、每個節(jié)點擁有的卡槽數(shù)目;(2)節(jié)點查詢性能測試:根據(jù)卡槽節(jié)點映射表與卡槽測試鍵列表生成各個節(jié)點的卡槽測試鍵值表,并根據(jù)節(jié)點的卡槽數(shù)目將該節(jié)點的卡槽測試鍵值集合均勻地分成10等份,以份數(shù)為單位,對各個節(jié)點進行訪問性能測試;(3)計算當(dāng)前狀態(tài)下的存儲負(fù)載:運用最小二乘法擬合出各節(jié)點的卡槽數(shù)目與查詢性能的關(guān)系,求得節(jié)點查詢性能與查詢負(fù)載相平衡的卡槽數(shù)目分配比例;(4)遷移卡槽數(shù)據(jù)實現(xiàn)存儲均衡:根據(jù)新、舊的卡槽數(shù)目運用最大卡槽轉(zhuǎn)出數(shù)目與最大卡槽移入數(shù)目相匹配的方式計算需要轉(zhuǎn)移的卡槽,執(zhí)行節(jié)點間卡槽轉(zhuǎn)移.
該階段的主要任務(wù)是生成卡槽測試鍵表以及卡槽機器映射表,記錄各機器卡槽數(shù)目等.卡槽測試鍵是基于A~Z或a~z字符集合隨機生成的4位字符串,將該字符串作為卡槽測試鍵值.鑒于Redis的最大卡槽數(shù)目是16 384個,將上述測試鍵值的CRC16碼與16 384取余為測試鍵值,建立卡槽分配函數(shù),基于獲取的卡槽索引號將字符串存儲在卡槽測試鍵列表(SlotString)中.以<key,index>鍵值對形式存儲到Redis中,其中key為生成的4位字符串,index為卡槽測試鍵列表的索引值,即Redis卡槽編號,從而使得每個卡槽都存有一個卡槽測試鍵,卡槽測試鍵表如圖2所示.
圖2 16 384個卡槽測試鍵表Fig.2 Illustrating test key table for 16 384 slots
讀取卡槽節(jié)點映射表信息,統(tǒng)計每個節(jié)點分配的卡槽數(shù)目,并存儲在節(jié)點卡槽數(shù)目列表中.卡槽節(jié)點映射表(SlotToMachine)、節(jié)點卡槽數(shù)目列表(SlotNum)具體格式如下. SlotToMachine={1,2,1,…,n,…},集合內(nèi)每個元素表示節(jié)點的索引號,一個卡槽對應(yīng)一個節(jié)點,列表長度為16 384,列表的索引值表示卡槽編號.SlotNum={N1,N2,…,Nn},其中Nn表示編號為n的節(jié)點擁有的卡槽數(shù)目.
上述預(yù)處理過程使得Redis集群中每個卡槽都具有唯一的一個測試鍵,同時設(shè)計的評論數(shù)據(jù)存儲模型保證了各卡槽映射的數(shù)據(jù)相對均勻,這使得可以將對卡槽數(shù)目的負(fù)載測試轉(zhuǎn)化為對鍵值數(shù)目的測試.每次查詢操作可簡化成基于測試鍵值計算卡槽,依據(jù)卡槽歸屬信息獲得節(jié)點,再從節(jié)點中提出數(shù)據(jù)的過程.因此,對于特定節(jié)點測試是相對獨立的,測試過程如圖3所示,具體描述如下.
(1)遍歷卡槽節(jié)點映射表,根據(jù)卡槽節(jié)點映射表的節(jié)點索引號n以及在表元素的索引值i,獲取卡槽測試鍵列表中對應(yīng)各卡槽的卡槽測試鍵集合SlotString[i],并進而建立各節(jié)點的卡槽測試鍵列表;
(2)將各節(jié)點的卡槽測試鍵列表均勻地分割10等份,當(dāng)測試鍵值(或卡槽數(shù)目)無法滿足被10整除時,將剩余的測試鍵值全部放入到最后一個等份中;
(3)以一份測試鍵集合為一個測試單位,對Redis集群進行查詢性能測試,第一次查詢第一份測試鍵集合中的所有測試鍵值,第二次查詢第一份和第二份兩個測試鍵集合中的所有測試鍵值,以此類推.每一次的測試運行5次,將查詢測試的時間存儲在測試時間列表中ResultList={t1,1,t1,2,t1,3,t1,4,t1,5,t2,1,…,tp,q,…,t10,5},其中p表示參加測試的份數(shù),q表示當(dāng)前的測試次數(shù);
(4)將各節(jié)點的測試結(jié)果根據(jù)節(jié)點索引號排序,共產(chǎn)生n×50個測試結(jié)果,n為節(jié)點的數(shù)目.
圖3 查詢負(fù)載測試過程Fig.3 The test process for query performance
上節(jié)的查詢性能測試中,影響查詢效率的因素主要有節(jié)點本身的性能,已有負(fù)載和網(wǎng)絡(luò)傳輸,鑒于節(jié)點的查詢效率與測試鍵數(shù)目成正比例關(guān)系.由于鍵值數(shù)目可轉(zhuǎn)化為卡槽數(shù)目,得如下方程(1).
其中,T表示卡槽集合查詢所需要的時間,v表示測試機器在當(dāng)前狀態(tài)下的查詢性能,N表示卡槽的數(shù)目.使用最小二乘法求得方程中v的值,即保證預(yù)測的結(jié)果與實際值的誤差最小,給出最小誤差平方和公式(2).
其中,t表示鍵值集合的查詢時間,v表示節(jié)點的查詢性能,n為當(dāng)前測試鍵集合的鍵值數(shù)目(等于卡槽數(shù)目),p為當(dāng)前參與測試鍵值集合的份數(shù).該公式轉(zhuǎn)換為矩陣表示,即(T-N v)T(T-N v),對v求導(dǎo)得到-2NT(T-N v),令其等于零,則有各個節(jié)點的卡槽數(shù)目與查詢時間的關(guān)系如(3)所示.
根據(jù)各節(jié)點卡槽數(shù)目與查詢時間的線性關(guān)系,保證查詢負(fù)載與查詢性能相平衡,即不同節(jié)點完成不同查詢?nèi)蝿?wù)的時間應(yīng)相同,有
因此,得到不同節(jié)點卡槽數(shù)目的關(guān)系應(yīng)為
且N1+N2+N3+…+Nn=16 384.在實際計算中,N若不能剛好被16 384整除,有如下約定,當(dāng)<16 384時,將剩余的應(yīng)分配卡槽分配到v值最小的節(jié)點上;當(dāng)>16 384時,將多出的冗余卡槽數(shù)目從v值最大的節(jié)點中移除,從而得到節(jié)點查詢負(fù)載平衡的新卡槽數(shù)目,將新得到的卡槽數(shù)目存儲到NewSlotNum中,NewSlotNum={cN1,cN2,…,cNn},其中,cNn表示編號為n的節(jié)點存儲的卡槽數(shù)目.
為保證數(shù)據(jù)轉(zhuǎn)移效率,本文采用最大轉(zhuǎn)出卡槽數(shù)目節(jié)點與最大移入卡槽數(shù)目節(jié)點相匹配的策略計算需要轉(zhuǎn)移的卡槽,從而保證每一次匹配都可移除一個節(jié)點的卡槽轉(zhuǎn)移計算.
首先以新卡槽數(shù)目為目標(biāo),求出各節(jié)點需要轉(zhuǎn)移卡槽的數(shù)目,節(jié)點卡槽數(shù)目增多為正值,節(jié)點卡槽數(shù)目減少為負(fù)值,生成節(jié)點卡槽轉(zhuǎn)移數(shù)目列表NodeSlotMigrateList= {M N1,M N2,M N3,…,M Nn},其中,MN為節(jié)點卡槽轉(zhuǎn)移的數(shù)目,n為集群節(jié)點的數(shù)目;再從NodeSlotMigrateList中尋找節(jié)點卡槽增加的最大值P和節(jié)點卡槽減少的最大值Q,將兩個卡槽節(jié)點的數(shù)目進行匹配,即將卡槽減少最多的節(jié)點轉(zhuǎn)向卡槽增加最多的節(jié)點.掃描卡槽節(jié)點列表(SlotToMachine)提取轉(zhuǎn)移的卡槽,并以<FromMachine,ToMachine,Index1, Index2,...,Indexi>形式存儲轉(zhuǎn)移卡槽記錄,Index表示需要轉(zhuǎn)移的卡槽編號,更新SlotToMachine列表,同時將NodeSlotMigrateList中的P與Q絕對值較小的值置為0,較大的值置為P+Q.重復(fù)上述操作,直至節(jié)點轉(zhuǎn)移卡槽的值全部為0;最后,根據(jù)卡槽節(jié)點映射表SlotToMachine記錄的卡槽轉(zhuǎn)移記錄執(zhí)行卡槽轉(zhuǎn)移.
為了測試在異構(gòu)條件下的Redis集群存儲分配優(yōu)化方案,本文在一臺Dell PowerEdge R370服務(wù)器上基于VMware云平臺搭建了Redis集群,服務(wù)器擁有20個CPU,128 G內(nèi)存.實現(xiàn)的異構(gòu)集群由3臺虛擬機節(jié)點構(gòu)成,節(jié)點的處理核心數(shù)分別為1、2、4,內(nèi)存分別為4 G、4 G、8 G,操作系統(tǒng)為red hat linux 5.6.節(jié)點與測試機在同一個局域網(wǎng)內(nèi),網(wǎng)卡為千兆以太網(wǎng)卡,Redis集群版本為3.2.6.實驗數(shù)據(jù)為真實的京東評論數(shù)據(jù),大小為900 M,472件商品,共5 241 992條評論記錄,評論數(shù)目最多的商品擁有45萬多條評論,用戶2 642 152人.
實驗分為三個部分,第一部分為評論數(shù)據(jù)存儲模型的分割跨度的設(shè)定,選出存儲平衡性最好的存儲跨度(即以特定數(shù)目LineNum對評論進行分割);第二部分測試在默認(rèn)平均分配卡槽的Redis集群下,通過本文提出的算法進行存儲負(fù)載的測試,驗證負(fù)載與卡槽數(shù)目線性關(guān)系的正確性,并計算出符合負(fù)載的卡槽分配數(shù)量;第三部分為卡槽移動前后的Redis集群查詢性能對比.
以默認(rèn)平均分配卡槽的方式構(gòu)建Redis集群,3個節(jié)點擁有卡槽數(shù)目分別為5 462、5 461、 5 461,共16 384個卡槽.將上述評論數(shù)據(jù)集以10 000為跳步,依次按照本文提出的存儲模型開展存儲效果測試,測試結(jié)果如表4所示.表4的測試結(jié)果顯示,2萬條數(shù)目進行分割的存儲平衡效果最好,隨著分割參數(shù)的增大,平衡的效果逐漸弱化,最后平衡的效果趨近于不分割的存儲平衡效果.由于Redis系統(tǒng)本身以及管理數(shù)據(jù)的結(jié)構(gòu)所占用的空間,其總量約為數(shù)據(jù)本身大小的1.5倍左右.
表4 存儲平衡分割參數(shù)(LineNum)的測試結(jié)果Tab.4 Experimental results for parameter(LineNum)of storage partition
首先,基于默認(rèn)值搭建Redis集群,則各節(jié)點分別被分配5 462、5 461、5 461個卡槽.使用存儲負(fù)載管理器對Redis集群進行測試,測試結(jié)果顯示卡槽數(shù)目與讀取時間的回歸曲線如圖4所示.該圖驗證了卡槽讀取的數(shù)目與讀取時間的線性關(guān)系,在系統(tǒng)不穩(wěn)定時,測試會稍現(xiàn)波動,例如,圖4中配置有2核心CPU、4G內(nèi)存的節(jié)點的性能有分散形狀.
圖4 節(jié)點查詢性能測試Fig.4 Performance test for node query
圖4顯示1核、2核、4核節(jié)點的查詢速度分別為v1=0.151 55毫秒/槽、v2= 0.130 67毫秒/槽、v3=0.058 305 2毫秒/槽.根據(jù)節(jié)點擁有卡槽數(shù)量與速度成反比的關(guān)系,得到新的卡槽數(shù)量應(yīng)分別為3 449、4 000、8 935.卡槽轉(zhuǎn)移前后Redis集群的數(shù)據(jù)存儲如圖5所示,卡槽移動后的存儲比例如表5所示.
圖5 遷移卡槽前后存儲數(shù)據(jù)量對比Fig.5 Comparison of data volume before and after shifting slots
表5 卡槽轉(zhuǎn)移后存儲數(shù)據(jù)比例Tab.5 Ratios after shifting slots
從數(shù)據(jù)集中隨機選出10件商品,具體數(shù)據(jù)規(guī)模如表6所示.測試查詢10件商品分別在1日、1月、半年、1年、1年半時間范圍內(nèi)的所有評論所需要的時間,測試結(jié)果如表7所示,結(jié)果顯示查詢效率有不同程度的提高,但并無明顯的變化規(guī)律.這是由于評論數(shù)據(jù)本身隨時間的密集程度不一以及單條評論內(nèi)容大小是不確定的.從表6中可以發(fā)現(xiàn)商品4、5雖然數(shù)目比商品2多,數(shù)據(jù)的大小卻小于商品2.數(shù)據(jù)的密集程度將影響查詢結(jié)果的數(shù)目,單條評論內(nèi)容大小同時影響查詢結(jié)果,二者的不確定導(dǎo)致性能提高的不確定.
表6 查詢數(shù)據(jù)表Tab.6 Data fact for testing queries
表7 范圍查詢測試結(jié)果Tab.7 The experimental results for queries
本文主要針對異構(gòu)Redis集群環(huán)境下評論數(shù)據(jù)存儲的負(fù)載均衡問題,詳細分析了大規(guī)模評論數(shù)據(jù)的查詢需求,提出了一種同構(gòu)環(huán)境下以商品ID為鍵值存儲評論數(shù)據(jù),以用戶ID為鍵值建立輔助索引的存儲模型,并以一定的分割閥值對存儲數(shù)據(jù)進行分割,從而保證存儲系統(tǒng)的平衡性.然后,根據(jù)建立的存儲平衡,提出了異構(gòu)環(huán)境下的集群節(jié)點負(fù)載計算和存儲分配方法,通過對測試鍵的查詢得到卡槽與節(jié)點查詢效率的關(guān)系,以“負(fù)載與訪問性能相平衡”的原則來分配卡槽,并進行了理論分析.建議的方法充分開采了異構(gòu)Redis集群中不同性能節(jié)點的工作能力,提高了集群的整體查詢效率.
[1]INTEL.A yearly product cadence moves the industry forward in a predictable fashion that can be planned in advance[EB/OL].[2017-05-10].https://www.intel.com/content/www/us/en/silicon-innovations/intel-tock-modelgeneral.html.
[2]CHANG F,DEAN J,GHEMAWAT S.et al.Bigtable:A distributed storage system for structured data[J].ACM Transactions on Computer Systems,2006,26(2):205-218.
[3]BORTHAKUR D.The Hadoop distributed fi le system:Achitecture and design[EB/OL].[2017-06-02]. http://hadoop.apache.org/common/docs/r0.180/hdfs design.pdf.
[4]申德榮,于戈,王習(xí)特,等.支持大數(shù)據(jù)管理的NoSQL系統(tǒng)研究綜述[J].軟件學(xué)報,2013(8):1786-1803.
[5]何亞農(nóng),宋瑋,趙躍龍.基于平衡結(jié)構(gòu)的對等網(wǎng)絡(luò)存儲系統(tǒng)研究[J].計算機工程與設(shè)計,2011,32(8):2611-2613.
[6]KALA K A,CHITHARANJAN K.Locality Sensitive Hashing based incremental clustering for creating affi nity groups in Hadoop-HDFS-An infrastructure extension[C]//International Conference on Circuits,Power and Computing Technologies.IEEE,2013:1243-1249.
[7]ROWSTRON A,DRUSCHEL P.Storage management and caching in PAST,a large-scale,persistent peer-topeer storage utility[C]//Proceedings of the 18th ACM Symposium on Operating Systems Principles.ACM, 2001:188-201.
[8]OKCAN A,RIEDEWALD M.Processing theta-joins using MapReduce[C]//Proceedings of SIGMOD International Conference on Management of Data.ACM,2011:949-960.
[9]WEI Q,VEERAVALLI B,GONG B,et al.CDRM:A cost-e ff ective dynamic replication management scheme for cloud storage cluster[C]//IEEE International Conference on CLUSTER Computing.2010:188-196.
[10]XIE C,CAI B.A decentralized storage cluster with high reliability and fl exibility[C]//Proceedings of 14th Euromicro International Conference on Parallel,Distributed,and Network-Based Processing.IEEE,2006:1-8.
(責(zé)任編輯:林磊)
Storage and load balancing for large-scale comment data on heterogeneous Redis cluster
ZHANG Jing-wei1,DING Zhi-jun1,YANG Qing2,ZHANG Hui-bing1, ZHANG Hai-tao1,ZHOU Ya1
(1.Guangxi Key Laboratory of Trusted Software,Guilin University of Electronic Technology,Guilin Guangxi 541004,China; 2.Guangxi Key Laboratory of Automatic Detection Technology and Instrument,Guilin University of Electronic Technology,Guilin Guangxi 541004,China)
The storage and query performance for large-scale comment data have a great inf l uence on those applications built on the above data.In a heterogeneous computing environment,each node has dif f erent performance on storage and computation,it presents a key challenge for optimizing the storage and query performance for large-scale comment data by taking full advantage of the performance of each node.Based on the ability of Redis cluster,we design a storage model for large-scale comment data in a homogeneous Redis cluster,which provides the storage balancing in Redis slots.And then,we discussthe relationship between the number of Redis slots and query effi ciency to design a method for allocating storage on the real load of each computing node for heterogeneous Redis clusters,which can make full use of the performance of each node and can guide to allocate slots to nodes by balancing the query performance and storage loading.Our experimental results show that the proposed model has a good ef f ect on storage loading and improve the query effi ciency of the heterogeneous Redis cluster.
large-scale comment data;storage and load balancing;query optimization
TP315
A
10.3969/j.issn.1000-5641.2017.05.003
1000-5641(2017)05-0020-10
2017-06-30
國家自然科學(xué)基金(61363005,61462017,U1501252);廣西自然科學(xué)基金(2014GXNSFA A118353,2014GXNSFAA118390);廣西自動檢測技術(shù)與儀器重點實驗室基金(YQ15110);廣西高校中青年教師基礎(chǔ)能力提升項目(ky2016YB156)
張敬偉,男,博士,副教授,研究方向為海量數(shù)據(jù)管理.E-mail:gtzjw@hotmail.com.
楊青,女,副教授,研究方向為智能信息處理.E-mail:gtyqing@hotmail.com.