欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種基于性能測試的異構(gòu)Redis集群存儲分配方法與流程

文檔序號:11514659閱讀:376來源:國知局
一種基于性能測試的異構(gòu)Redis集群存儲分配方法與流程

本發(fā)明涉及分布式存儲技術(shù)領(lǐng)域,具體涉及一種基于性能測試的異構(gòu)redis集群存儲分配方法。



背景技術(shù):

redis集群的整體性能受數(shù)據(jù)存儲分配與訪問負(fù)載等因素影響,傳統(tǒng)的負(fù)載均衡通常采用數(shù)據(jù)均勻分布的策略,其在集群節(jié)點(diǎn)同構(gòu)且隨機(jī)數(shù)據(jù)訪問的情形下具有比較好的效果。但由于機(jī)器和集群的不斷更新升級,使得現(xiàn)有的集群多呈現(xiàn)異構(gòu)形態(tài),且數(shù)據(jù)訪問有冷熱之分,不符合隨機(jī)性,需要針對redis集群中各節(jié)點(diǎn)的實(shí)際負(fù)載能力來優(yōu)化并提升集群性能。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明所要解決的是現(xiàn)有異構(gòu)redis集群在處理大規(guī)模數(shù)據(jù)時(shí),針對各節(jié)點(diǎn)性能不一致和訪問負(fù)載的動(dòng)態(tài)變化,如何優(yōu)化各節(jié)點(diǎn)的數(shù)據(jù)存儲分配,進(jìn)而提升集群整體性能的問題,提供了一種基于性能測試的異構(gòu)redis集群存儲分配方法。

為解決上述問題,本發(fā)明是通過以下技術(shù)方案實(shí)現(xiàn)的:

一種基于性能測試的異構(gòu)redis集群存儲分配方法,包括如下步驟:

步驟1、根據(jù)鍵值與redis的卡槽映射關(guān)系,為每個(gè)卡槽生成一個(gè)測試鍵值對,并將全部的測試鍵值對即卡槽測試鍵列表存儲在redis中;

步驟2、讀取redis的卡槽與節(jié)點(diǎn)的對應(yīng)關(guān)系即卡槽-節(jié)點(diǎn)映射列表信息,統(tǒng)計(jì)每個(gè)節(jié)點(diǎn)分配的卡槽數(shù)目,并存儲在節(jié)點(diǎn)-卡槽數(shù)目列表中;

步驟3、根據(jù)卡槽-節(jié)點(diǎn)映射列表與卡槽測試鍵列表生成各個(gè)節(jié)點(diǎn)的卡槽測試鍵值表;并根據(jù)節(jié)點(diǎn)-卡槽數(shù)目列表中各個(gè)節(jié)點(diǎn)卡槽數(shù)目,將對應(yīng)該節(jié)點(diǎn)的卡槽測試鍵值集合均勻地分成m等份,以份數(shù)為單位,對各個(gè)節(jié)點(diǎn)進(jìn)行訪問測試;其中m為設(shè)定值;

步驟4、運(yùn)用最小二乘法擬合出各節(jié)點(diǎn)的卡槽數(shù)目與查詢性能的線性關(guān)系,求得節(jié)點(diǎn)查詢性能與查詢負(fù)載相平衡的卡槽數(shù)目分配比例,從而得到節(jié)點(diǎn)查詢負(fù)載平衡的新卡槽數(shù)目,并將新得到的卡槽數(shù)目存儲到新的節(jié)點(diǎn)-卡槽數(shù)目列表中;

步驟5、根據(jù)步驟4所得新的節(jié)點(diǎn)-卡槽數(shù)目列表與步驟2所得的舊的節(jié)點(diǎn)-卡槽數(shù)目列表進(jìn)行卡槽轉(zhuǎn)移。

上述方案中,步驟1的具體子步驟為:

步驟1.1、隨機(jī)生成4位字符串,將該字符串作為卡槽測試鍵值,同時(shí)采用字符串的crc16碼與數(shù)值16384取余的方式生成該字符串對應(yīng)的卡槽索引號,按照卡槽索引號將字符串存儲在卡槽測試鍵列表中;

步驟1.2、循環(huán)生成卡槽測試鍵值,直至為16384個(gè)卡槽全部生成測試鍵值,并存儲在卡槽測試鍵列表中;

步驟1.3、讀取卡槽測試鍵列表,以<key,index>鍵值對形式存儲到redis中;其中key為生成的字符串,index為卡槽測試鍵列表的索引值即redis卡槽編號;從而使得每個(gè)卡槽都存有一個(gè)卡槽測試鍵。

上述方案中,步驟3的具體子步驟為:

步驟3.1、遍歷卡槽-節(jié)點(diǎn)映射列表,根據(jù)卡槽-節(jié)點(diǎn)映射列表的節(jié)點(diǎn)索引號以及在表中的索引值,獲取卡槽測試鍵列表中對應(yīng)各卡槽的卡槽測試鍵集合,并進(jìn)而建立各節(jié)點(diǎn)的卡槽測試鍵列表;

步驟3.2、將各節(jié)點(diǎn)的卡槽測試鍵列表均勻地分割為m等份,每一等分為一份測試鍵集合;當(dāng)測試鍵值或卡槽數(shù)目無法滿足被m整除時(shí),將剩余的測試鍵值全部放入到最后一份測試鍵集合中;其中m為設(shè)定值;

步驟3.3、以一份測試鍵集合為一個(gè)測試單位,對redis進(jìn)行查詢性能測試,第一次查詢第一份測試鍵集合中的所有測試鍵值,第二次查詢第一份和第二份兩個(gè)測試鍵集合中的所有測試鍵值,以此類推,第k次查詢第1份至第k-1份兩個(gè)測試鍵集合中的所有測試鍵值;其中k為設(shè)定的查詢次數(shù);

步驟3.4、將各節(jié)點(diǎn)的測試結(jié)果根據(jù)節(jié)點(diǎn)索引號排序。

上述方案中,步驟3.3中還進(jìn)一步包括如下過程,將查詢測試的時(shí)間存儲在測試時(shí)間列表resultlist中。

上述方案中,步驟4的具體子步驟為:

步驟4.1、根據(jù)各個(gè)節(jié)點(diǎn)的卡槽數(shù)目與查詢時(shí)間的關(guān)系,使用最小二乘法求得方程中的v,其中各個(gè)節(jié)點(diǎn)的卡槽數(shù)目與查詢時(shí)間的關(guān)系為:

v=(ntn)-1nt·t

其中,t表示查詢卡槽集合所需要的時(shí)間,v表示測試機(jī)器在當(dāng)前狀態(tài)下的查詢性能,n表示卡槽的數(shù)目;

步驟4.2、根據(jù)各節(jié)點(diǎn)卡槽數(shù)目與查詢時(shí)間的線性關(guān)系,保證查詢負(fù)載與查詢性能相平衡,即不同節(jié)點(diǎn)完成不同查詢?nèi)蝿?wù)的時(shí)間應(yīng)相同,得到不同節(jié)點(diǎn)卡槽數(shù)目的關(guān)系為:

其中,v1,v2,v3,...,vn表示各個(gè)節(jié)點(diǎn)的查詢性能;n1,n2,n3,...,nn表示各個(gè)節(jié)點(diǎn)分配的卡槽數(shù)目,且n1+n2+n3+...+nn=16384;

步驟4.3、當(dāng)時(shí),將剩余的應(yīng)分配卡槽分配到查詢性能v值最小的節(jié)點(diǎn)上;當(dāng)時(shí),將多出的冗余卡槽數(shù)目從查詢性能v值最大的節(jié)點(diǎn)中移除,從而得到節(jié)點(diǎn)查詢負(fù)載平衡的新卡槽數(shù)目,將新得到的卡槽數(shù)目存儲到新的節(jié)點(diǎn)-卡槽數(shù)目列表中;其中ni表示節(jié)點(diǎn)i的卡槽數(shù)目,n表示節(jié)點(diǎn)總數(shù)。

上述方案中,步驟5的具體子步驟為:

步驟5.1、以新卡槽數(shù)目為目標(biāo),求出各節(jié)點(diǎn)需要轉(zhuǎn)移卡槽的數(shù)目,節(jié)點(diǎn)卡槽數(shù)目增多為正值,節(jié)點(diǎn)卡槽數(shù)目減少為負(fù)值,生成節(jié)點(diǎn)卡槽轉(zhuǎn)移數(shù)目列表;

步驟5.2、在節(jié)點(diǎn)卡槽轉(zhuǎn)移數(shù)目列表中尋找節(jié)點(diǎn)卡槽增加的最大值p和節(jié)點(diǎn)卡槽減少的最大值q,將這2個(gè)節(jié)點(diǎn)卡槽的數(shù)目進(jìn)行匹配,即將卡槽減少的最大節(jié)點(diǎn)轉(zhuǎn)向卡槽增加的最大節(jié)點(diǎn);掃描卡槽-節(jié)點(diǎn)映射列表提取轉(zhuǎn)移的卡槽,并以<frommachine,tomachine,index1,index2,…,indexi>形式存儲轉(zhuǎn)移卡槽記錄,其中index為需要轉(zhuǎn)移的卡槽編號,更新卡槽-節(jié)點(diǎn)映射列表;同時(shí)將節(jié)點(diǎn)卡槽轉(zhuǎn)移數(shù)目列表中的節(jié)點(diǎn)卡槽增加的最大值p與節(jié)點(diǎn)卡槽減少的最大值q絕對值中較小的值置為0,節(jié)點(diǎn)卡槽增加的最大值p與節(jié)點(diǎn)卡槽減少的最大值q絕對值中較大的值置為p+q;重復(fù)上述操作,直至節(jié)點(diǎn)卡槽轉(zhuǎn)移數(shù)目列表中節(jié)點(diǎn)轉(zhuǎn)移卡槽的值全部為0;

步驟5.3、根據(jù)卡槽-節(jié)點(diǎn)映射列表記錄的卡槽轉(zhuǎn)移記錄執(zhí)行卡槽轉(zhuǎn)移。

與現(xiàn)有技術(shù)相比,本發(fā)明采用“測試鍵融合卡槽”策略,使卡槽作為負(fù)載的分配單元,測試不同卡槽數(shù)目下節(jié)點(diǎn)的查詢效率,進(jìn)而基于測試數(shù)據(jù)、運(yùn)用最小二乘法擬合當(dāng)前節(jié)點(diǎn)查詢性能與卡槽數(shù)目的關(guān)系,最后以“負(fù)載與實(shí)時(shí)訪問性能相平衡”的原則分配卡槽,從而充分開采了異構(gòu)redis集群中不同性能節(jié)點(diǎn)的工作能力,提高了集群的整體查詢效率。

附圖說明

圖1為異構(gòu)redis集群節(jié)點(diǎn)查詢過程示意圖(m=10,k=5)。其中①表示卡槽-節(jié)點(diǎn)映射列表;②表示卡槽測試鍵列表;③表示當(dāng)前卡槽數(shù)目列表;④表示當(dāng)前集群節(jié)點(diǎn)對應(yīng)的卡槽測試鍵列表;⑤表示測試結(jié)果集。

圖2為卡槽轉(zhuǎn)移流程圖。

具體實(shí)施方式

本發(fā)明屬于key-value對等網(wǎng)絡(luò)分布式存儲的負(fù)載均衡技術(shù),本發(fā)明涉及異構(gòu)redis集群存儲負(fù)載計(jì)算、節(jié)點(diǎn)存儲分配和數(shù)據(jù)遷移方法。即一種基于性能測試的異構(gòu)redis集群存儲分配方法,具體包括如下步驟:

步驟1:根據(jù)鍵值與redis的卡槽映射關(guān)系,為每個(gè)卡槽生成一個(gè)測試鍵值對,并將全部的測試鍵值對存儲在redis集群中。

(1)隨機(jī)生成4位字符串(如由a~z或a~z組成的4位字符串),將該字符串作為卡槽測試鍵值,同時(shí)采用字符串的crc16碼與16384取余的方式生成該字符串對應(yīng)的卡槽索引號,按照卡槽索引號將字符串存儲在卡槽測試鍵列表(slotstring)中。

(2)循環(huán)生成卡槽測試鍵值,直至為16384個(gè)卡槽全部生成測試鍵值,并存儲在卡槽測試鍵列表中。

(3)讀取卡槽測試鍵列表,以<key,index>鍵值對形式存儲到redis中,其中key為生成的4位字符串,index為卡槽測試鍵列表的索引值,即redis卡槽編號,從而使得每個(gè)卡槽都存有一個(gè)卡槽測試鍵。

步驟2:讀取redis的卡槽與節(jié)點(diǎn)的對應(yīng)關(guān)系,即卡槽-節(jié)點(diǎn)映射列表信息,統(tǒng)計(jì)每個(gè)節(jié)點(diǎn)分配的卡槽數(shù)目,并存儲在節(jié)點(diǎn)-卡槽數(shù)目列表中。

卡槽-節(jié)點(diǎn)映射列表(slottomachine)具體格式如下:

slottomachine={1,2,1,...,n,...}

其中,n為當(dāng)前節(jié)點(diǎn)的索引號(從1開始),一個(gè)卡槽對應(yīng)一個(gè)節(jié)點(diǎn),列表長度為16384,列表索引值i為對應(yīng)卡槽編號。

節(jié)點(diǎn)-卡槽數(shù)目列表(slotnum)具體格式如下:

slotnum={n1,n2,...,nn}

其中,nn為節(jié)點(diǎn)索引號為n的節(jié)點(diǎn)擁有的卡槽數(shù)目。

步驟3:根據(jù)卡槽-節(jié)點(diǎn)映射列表與卡槽測試鍵列表生成各個(gè)節(jié)點(diǎn)的卡槽測試鍵值表,并根據(jù)各個(gè)節(jié)點(diǎn)卡槽數(shù)目將對應(yīng)該節(jié)點(diǎn)的卡槽測試鍵值集合均勻地分成m等份(m≥2,在本實(shí)施例中,m=10),以份數(shù)為單位,對各個(gè)節(jié)點(diǎn)進(jìn)行訪問測試。

(1)遍歷卡槽-節(jié)點(diǎn)映射列表,根據(jù)卡槽-節(jié)點(diǎn)映射列表的節(jié)點(diǎn)索引號n以及在表中的索引值i,獲取卡槽測試鍵列表中對應(yīng)各卡槽的卡槽測試鍵集合slotstring[i],并進(jìn)而建立各節(jié)點(diǎn)的卡槽測試鍵列表。

(2)將各節(jié)點(diǎn)的卡槽測試鍵列表均勻地分割m等份,當(dāng)測試鍵值(或卡槽數(shù)目)無法滿足被m整除時(shí),將剩余的測試鍵值全部放入到最后一個(gè)等份中。

(3)以一份測試鍵集合為一個(gè)測試單位,對redis集群進(jìn)行查詢性能測試,第一次查詢第一份測試鍵集合中的所有測試鍵值,第二次查詢第一份和第二份兩個(gè)測試鍵集合中的所有測試鍵值,以此類推。為保證測試結(jié)果的準(zhǔn)確度,每一次的測試運(yùn)行k(在本實(shí)施例中,k=5)次,將查詢測試的時(shí)間存儲在測試時(shí)間列表中(resultlist),即

resultlist={t1,1,t1,2,t1,3,t1,4,t1,5,t2,1,t2,2...,tp,q,...,t10,5}

其中,p表示參加測試的份數(shù),q表示當(dāng)前的測試次數(shù)。

(4)將各節(jié)點(diǎn)的測試結(jié)果根據(jù)節(jié)點(diǎn)索引號排序,共產(chǎn)生n*k*m(在本實(shí)施例中,n*5*10)個(gè)測試結(jié)果,n為節(jié)點(diǎn)的數(shù)目。

步驟4:運(yùn)用最小二乘法擬合出各節(jié)點(diǎn)的卡槽數(shù)目與查詢性能的線性關(guān)系,求得節(jié)點(diǎn)查詢性能與查詢負(fù)載相平衡的卡槽數(shù)目分配比例。參見圖1。

(1)設(shè)參與查詢性能測試的卡槽數(shù)目與查詢所需時(shí)間成正比例關(guān)系,

t=vn

其中,t表示查詢卡槽集合所需要的時(shí)間,v表示測試機(jī)器在當(dāng)前狀態(tài)下的查詢性能,n表示卡槽的數(shù)目。

(2)使用最小二乘法求得方程中v,即保證預(yù)測的結(jié)果與實(shí)際值的誤差最小,給出最小誤差平方和公式,

其中,t表示鍵值集合的查詢時(shí)間,v表示節(jié)點(diǎn)的查詢性能,n是當(dāng)前測試鍵集合的鍵值數(shù)目(等于卡槽數(shù)目),p為當(dāng)前參與測試的鍵值集合的份數(shù)。

該公式轉(zhuǎn)換為矩陣表示,即(t-nv)t(t-nv),對v求導(dǎo)得到nt(t-nv),令其等于零,則有各個(gè)節(jié)點(diǎn)的卡槽數(shù)目與查詢時(shí)間的關(guān)系如下,

v=(ntn)-1nt·t

其中,t表示查詢卡槽集合所需要的時(shí)間,v表示測試機(jī)器在當(dāng)前狀態(tài)下的查詢性能,n表示卡槽的數(shù)目;

(3)根據(jù)各節(jié)點(diǎn)卡槽數(shù)目與查詢時(shí)間的線性關(guān)系,保證查詢負(fù)載與查詢性能相平衡,即不同節(jié)點(diǎn)完成不同查詢?nèi)蝿?wù)的時(shí)間應(yīng)相同,有:

t1=t2=t3=...=tn

v1n1=v2n2=v3n3=...=vnnn

因此,得到不同節(jié)點(diǎn)卡槽數(shù)目的關(guān)系為:

且n1+n2+n3+...+nn=16384。在實(shí)際計(jì)算中,n可能不能剛好被16384整除,則當(dāng)時(shí),將剩余的應(yīng)分配卡槽分配到v值最小的節(jié)點(diǎn)上;當(dāng)時(shí),將多出的冗余卡槽數(shù)目從v值最大的節(jié)點(diǎn)中移除,從而得到節(jié)點(diǎn)查詢負(fù)載平衡的新卡槽數(shù)目,將新得到的卡槽數(shù)目存儲到newslotnum中,

newslotnum={cn1,cn2,...,cnn}

其中,cnn為索引值為n的節(jié)點(diǎn)存儲的卡槽數(shù)目。

步驟5:根據(jù)新的卡槽數(shù)目列表newslotnum與舊的卡槽數(shù)目slotnum進(jìn)行卡槽轉(zhuǎn)移。參見圖2。

(1)首先以新卡槽數(shù)目為目標(biāo),求出各節(jié)點(diǎn)需要轉(zhuǎn)移卡槽的數(shù)目,節(jié)點(diǎn)卡槽數(shù)目增多為正值,節(jié)點(diǎn)卡槽數(shù)目減少為負(fù)值,生成節(jié)點(diǎn)卡槽轉(zhuǎn)移數(shù)目列表nodeslotmigratelist={mn1,mn2,mn3,...,mnn}。其中,mn為節(jié)點(diǎn)卡槽轉(zhuǎn)移的數(shù)目,n為集群節(jié)點(diǎn)的數(shù)目。

(2)在nodeslotmigratelist中尋找節(jié)點(diǎn)卡槽增加的最大值p和節(jié)點(diǎn)卡槽減少的最大值q,將兩個(gè)節(jié)點(diǎn)卡槽的數(shù)目進(jìn)行匹配,即將卡槽減少的最大節(jié)點(diǎn)轉(zhuǎn)向卡槽增加的最大節(jié)點(diǎn)。掃描卡槽-節(jié)點(diǎn)列表(slottomachine)提取轉(zhuǎn)移的卡槽,并以<frommachine,tomachine,index1,index2,…,indexi>形式存儲轉(zhuǎn)移卡槽記錄,其中index為需要轉(zhuǎn)移的卡槽編號,更新slottomachine列表,同時(shí)將nodeslotmigratelist中的p與q絕對值較小的值置為0,較大的值置為p+q。重復(fù)上述操作,直至節(jié)點(diǎn)轉(zhuǎn)移卡槽的值全部為0。

(3)根據(jù)卡槽-節(jié)點(diǎn)映射列表slottomachine記錄的卡槽轉(zhuǎn)移記錄執(zhí)行卡槽轉(zhuǎn)移。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
台东市| 怀仁县| 宿州市| 寿宁县| 喜德县| 宜宾市| 鄂尔多斯市| 霍邱县| 将乐县| 攀枝花市| 房产| 凌云县| 苍梧县| 凤凰县| 台东市| 驻马店市| 安宁市| 龙门县| 彰化县| 河池市| 观塘区| 济南市| 台南县| 沅陵县| 新沂市| 谷城县| 临清市| 嘉鱼县| 怀集县| 长宁县| 巴青县| 凤山市| 宽城| 佛教| 海宁市| 建湖县| 怀安县| 平邑县| 贡嘎县| 栖霞市| 门源|