本發(fā)明涉及計算機領(lǐng)域,尤其涉及一種周期型數(shù)據(jù)的分布式緩存運維方法及裝置。
背景技術(shù):
在監(jiān)控平臺等眾多領(lǐng)域中,分布式緩存被廣泛使用,業(yè)界成熟的技術(shù)有memcache、tair等產(chǎn)品。這些產(chǎn)品都根據(jù)自身的場景實現(xiàn)了優(yōu)秀的可擴展性方案。
傳統(tǒng)的分布式緩存在解決key‐value形式的數(shù)據(jù)緩存時,由不同形式的“數(shù)據(jù)分布”算法來決定各個key的value應(yīng)該放置在哪些節(jié)點上,所述節(jié)點為緩存服務(wù)器。相應(yīng)的,該種算法不僅要保證數(shù)據(jù)分布的均衡性,而且節(jié)點發(fā)生變化時不能影響數(shù)據(jù)的可用性并且依然要保持負(fù)載均衡。從本質(zhì)上來說這是需要很多技術(shù)保障才能解決的問題,例如:假設(shè)有N條data,有M個緩存節(jié)點,我們希望每個節(jié)點上負(fù)責(zé)緩存N/M條數(shù)據(jù),進一步的,當(dāng)節(jié)點數(shù)量從M變成M+X時,M為增量,數(shù)據(jù)的分布必然有所調(diào)整,而調(diào)整的過程中client的讀寫請求依然還在持續(xù)發(fā)生,不能暫停。
然而分布式緩存畢竟是有狀態(tài)設(shè)計,現(xiàn)有技術(shù)始終無法避免在機器擴容減容、故障處理時對內(nèi)存中狀態(tài)的沖擊,即難以避免數(shù)據(jù)遷移成本(如停機擴容等)。
例如,現(xiàn)在有海量的數(shù)據(jù)(data[key:value]),有100臺機器,通過策略讓這些數(shù)據(jù)能負(fù)載均衡的發(fā)給各臺機器?,F(xiàn)有的策略是:intindex=Math.abs(key.hashCode)%100,如此,即可得到一個唯一的、確定的[0,99]中序號,按此序號發(fā)給對應(yīng)的機器,最終能達(dá)到負(fù)載均衡的效果。然而,在 現(xiàn)有技術(shù)的方案中,若新增機器,例如由100臺增加到130臺,此時,大部分老數(shù)據(jù)的key執(zhí)行上述策略后得到的index會發(fā)生變化,這也就意味著對它們的檢索都會發(fā)往錯誤的機器,導(dǎo)致命中失敗。
再如,現(xiàn)在有海量的數(shù)據(jù)(data[key:value]),現(xiàn)有的策略是:假想已有一萬臺機器,將一萬臺機器命名為虛擬節(jié)點,簡稱vnode,vnode的序號簡稱為vnodeId,之后將vnode與真實機器建立多對一映射關(guān)系,例如,每個真實機器上100個vnode。在路由時,先按上述例子得到vnodeId,再執(zhí)行一次映射,找到真實機器。該方案的實施前提是:確保在未來的發(fā)展中,機器數(shù)量不會漲到超過一萬臺,如此才能保證一個key永遠(yuǎn)對應(yīng)某個vnodeId不會發(fā)生改變。然而,在擴容時,必然會改變vnode與真實機器的映射關(guān)系,所述此映射關(guān)系一改,即會不可避免的導(dǎo)致數(shù)據(jù)命中失敗。
上述兩個現(xiàn)有技術(shù)的例子,其導(dǎo)致數(shù)據(jù)命中失敗的原因在于,在實施過程中,上述兩個例子均包含下述公式:
int machine_id=assign_function1(data.key,x),其中machine_id指最終路由的機器,assign_function1代表路由策略函數(shù),data.key代表數(shù)據(jù)的key;x在第一個例子中就是機器數(shù)量100,在第二個例子中就是vnode數(shù)量以及vnode與機器的映射關(guān)系。明顯地,該公式中一直存在未知數(shù)x,一旦所述x發(fā)生變化,assign_function1的執(zhí)行結(jié)果就可能改變。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的之一在于提供一種周期型數(shù)據(jù)的分布式緩存運維方法及裝置。
為實現(xiàn)上述發(fā)明目的之一,本發(fā)明一實施方式提供了一種周期型數(shù)據(jù)的分布式緩存運維方法,其包括:
記錄每次運維時的運維完成時間及運維設(shè)備數(shù)量;
將隸屬周期在上次運維完成時間至本次運維完成時間內(nèi)的數(shù)據(jù)的存儲設(shè)備,與上次運維后的存儲設(shè)備總數(shù)量m匹配,以m臺存儲設(shè)備中分布式緩存數(shù) 據(jù);
將隸屬周期在本次運維完成時間至下次運維完成時間內(nèi)的數(shù)據(jù)的存儲設(shè)備,與本次運維后的存儲設(shè)備總數(shù)量n匹配,以n臺存儲設(shè)備中分布式緩存數(shù)據(jù)。
作為本發(fā)明一實施方式的進一步改進,所述方法包括:
將相鄰的運維完成時間形成運維周期,以在讀取緩存時確定讀取數(shù)據(jù)的隸屬周期。
作為本發(fā)明一實施方式的進一步改進,所述方法包括:
記錄運維周期、存儲設(shè)備總數(shù)量的關(guān)聯(lián)關(guān)系,以在讀取緩存時,根據(jù)讀取數(shù)據(jù)的隸屬周期確定存儲設(shè)備總數(shù)量。
作為本發(fā)明一實施方式的進一步改進,所述方法包括:
記錄運維周期、存儲設(shè)備總數(shù)量和存儲設(shè)備的序號區(qū)間的關(guān)聯(lián)關(guān)系,以在讀取緩存時,根據(jù)讀取數(shù)據(jù)的隸屬周期確定存儲設(shè)備總數(shù)量和存儲設(shè)備的序號區(qū)間。
作為本發(fā)明一實施方式的進一步改進,運維完成時間為:運維完成的即刻時間+同步時間差,其中,所述同步時間差為將所述關(guān)聯(lián)關(guān)系同步至客戶端的時間。
作為本發(fā)明一實施方式的進一步改進,所述方法包括:
將隸屬周期早于預(yù)設(shè)最早時間閾值的數(shù)據(jù)從緩存設(shè)備中轉(zhuǎn)出或刪除。
作為本發(fā)明一實施方式的進一步改進,所述方法包括:
將時間周期早于預(yù)設(shè)最早時間閾值的關(guān)聯(lián)關(guān)系刪除。
為實現(xiàn)上述發(fā)明目的之一,本發(fā)明一實施方式提供了一種周期型數(shù)據(jù)的分布式緩存運維裝置,其包括:
存儲模塊,用于記錄每次運維時的運維完成時間及運維設(shè)備數(shù)量;
匹配運算模塊,用于將隸屬周期在上次運維完成時間至本次運維完成時間內(nèi)的數(shù)據(jù)的存儲設(shè)備,與上次運維后的存儲設(shè)備總數(shù)量m匹配,以m臺存儲設(shè)備中分布式緩存數(shù)據(jù);以及,
將隸屬周期在本次運維完成時間至下次運維完成時間內(nèi)的數(shù)據(jù)的存儲設(shè)備,與本次運維后的存儲設(shè)備總數(shù)量n匹配,以n臺存儲設(shè)備中分布式緩存數(shù)據(jù)。
作為本發(fā)明一實施方式的進一步改進,所述匹配運算模塊還用于:
將相鄰的運維完成時間形成運維周期,以在讀取緩存時確定讀取數(shù)據(jù)的隸屬周期。
作為本發(fā)明一實施方式的進一步改進,所述匹配運算模塊還用于:
記錄運維周期、存儲設(shè)備總數(shù)量的關(guān)聯(lián)關(guān)系,以在讀取緩存時,根據(jù)讀取數(shù)據(jù)的隸屬周期確定存儲設(shè)備總數(shù)量。
作為本發(fā)明一實施方式的進一步改進,所述匹配運算模塊還用于:
記錄運維周期、存儲設(shè)備總數(shù)量和存儲設(shè)備的序號區(qū)間的關(guān)聯(lián)關(guān)系,以在讀取緩存時,根據(jù)讀取數(shù)據(jù)的隸屬周期確定存儲設(shè)備總數(shù)量和存儲設(shè)備的序號區(qū)間。
作為本發(fā)明一實施方式的進一步改進,運維完成時間為:運維完成時間為:運維完成的即刻時間+同步時間差,其中,所述同步時間差為將所述關(guān)聯(lián)關(guān)系同步至客戶端的時間。
作為本發(fā)明一實施方式的進一步改進,所述周期型數(shù)據(jù)的分布式緩存運維裝置還包括:
清理模塊,用于將隸屬周期早于預(yù)設(shè)最早時間閾值的數(shù)據(jù)從緩存設(shè)備中轉(zhuǎn)出或刪除。
作為本發(fā)明一實施方式的進一步改進,所述周期型數(shù)據(jù)的分布式緩存運維裝置還包括:
清理模塊,用于將時間周期早于預(yù)設(shè)最早時間閾值的關(guān)聯(lián)關(guān)系刪除。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:充分利用周期型數(shù)據(jù)的本質(zhì)屬性,在保障命中成功的前提下避免數(shù)據(jù)遷移等消耗,以在周期型數(shù)據(jù)緩存場景下用最低的成本解決機器擴容減容、故障處理時的損耗,實現(xiàn)低成本的可擴展性方案,顯著提高了運維的效率。
附圖說明
圖1是本發(fā)明一實施方式的周期型數(shù)據(jù)的分布式緩存運維方法的流程圖。
圖2是本發(fā)明一實施方式的周期型數(shù)據(jù)的分布式緩存運維裝置的模塊圖。
圖3是本發(fā)明一實施方式的實現(xiàn)周期型數(shù)據(jù)的分布式緩存運維方法的算法的模塊示意圖。
具體實施方式
以下將結(jié)合附圖所示的各實施方式對本發(fā)明進行詳細(xì)描述。但這些實施方式并不限制本發(fā)明,本領(lǐng)域的普通技術(shù)人員根據(jù)這些實施方式所輕易做出的結(jié)構(gòu)、方法、或功能上的變換均包含在本發(fā)明的保護范圍內(nèi)。
如圖1所示,在本發(fā)明一實施方式中,所述周期型數(shù)據(jù)的分布式緩存運維方法包括以下步驟:
記錄每次運維時的運維完成時間及運維設(shè)備數(shù)量;在本實施方式中,所述運維包括對設(shè)備數(shù)量的增加和減少。所述運維完成時間,即對設(shè)備數(shù)量進行擴容或減容完成的時間。其中,所述設(shè)備用于存儲周期型數(shù)據(jù),每個周期型數(shù)據(jù)都包括相應(yīng)隸屬的某個周期,所述周期是根據(jù)統(tǒng)計的粒度需要而設(shè)置的,比如是日、小時、分鐘、秒等。例如:數(shù)據(jù):“一個賬戶的余額是1000元”,該為非周期型數(shù)據(jù);數(shù)據(jù):“某賬戶在2014‐11‐11 11:11分發(fā)生了3次存款,存款額為1000元”,該數(shù)據(jù)為周期型數(shù)據(jù),即周期型數(shù)據(jù)一定要包括事件,以及事件發(fā)生的時間。
相應(yīng)的,上一次運維發(fā)生時,記錄上一次運維完成設(shè)備變更的時間T_last,及上一次運維變更結(jié)束時的設(shè)備數(shù)量m;當(dāng)前運維時,記錄當(dāng)前運維完成設(shè)備變更的時間T_now,及當(dāng)前運維變更結(jié)束時的設(shè)備數(shù)量n。
將相鄰的運維完成時間形成運維周期,以在讀取緩存時確定讀取數(shù)據(jù)的隸屬周期。例如,上一次運維完成時間至本次運維完成時間所形成的運維周 期為[T_last,T_now],表示從T_last開始到T_now結(jié)束;本次運維完成時間至下一次運維完成時間所形成的運維周期為[T_now,T_next],所述T_next表示下一個運維完成時所處的時間。
當(dāng)然,在不確定下一次運維完成時間時,可將該運維周期標(biāo)注為:[T_now,null],直至下一次運維完成,再將所述運維周期改寫為[T_now,T_next]。
記錄運維周期、存儲設(shè)備總數(shù)量的關(guān)聯(lián)關(guān)系,以在讀取緩存時,根據(jù)讀取數(shù)據(jù)的隸屬周期確定存儲設(shè)備總數(shù)量和存儲設(shè)備。
相應(yīng)的,記錄存儲設(shè)備總數(shù)量和存儲設(shè)備的序號區(qū)間的關(guān)聯(lián)關(guān)系,一般的,為了方便調(diào)取,所述存儲設(shè)備總數(shù)量和存儲設(shè)備的序號之間可按照相應(yīng)規(guī)則產(chǎn)生,在本實施方式中,所述存儲設(shè)備的序號按照從小到大順序編號,即設(shè)備總數(shù)量為m的設(shè)備編號所在區(qū)間為[a,a+m‐1],設(shè)備總數(shù)量為n的設(shè)備編號所在區(qū)間為[a,a+n‐1]。例如,假設(shè)有100臺設(shè)備用于存儲數(shù)據(jù),那么所述設(shè)備編號所在區(qū)間為[a,a+99]。其中,a為自然數(shù),是數(shù)據(jù)的存儲設(shè)備的起始編號。例如:周期型數(shù)據(jù)“某賬戶在2014‐11‐11 11:11分發(fā)生了3次存款,存款額為1000元”,經(jīng)過分析,得知該周期型數(shù)據(jù)的隸屬周期區(qū)間為[T_last,T_now],之后根據(jù)所述隸屬周期區(qū)間[T_last,T_now],確定該隸屬區(qū)間內(nèi)存儲設(shè)備總量為m,存儲設(shè)備序號所在區(qū)間為[a,a+m‐1]。
將隸屬周期在上次運維完成時間至本次運維完成時間內(nèi)的數(shù)據(jù)的存儲設(shè)備,與上次運維后的存儲設(shè)備總數(shù)量m匹配,以在序號區(qū)間為[a,a+m‐1]的m臺存儲設(shè)備中分布式緩存數(shù)據(jù);
將隸屬周期在本次運維完成時間至下次運維完成時間內(nèi)的數(shù)據(jù)的存儲設(shè)備,與本次運維后的存儲設(shè)備總數(shù)量n匹配,以在序號區(qū)間為[a,a+n‐1]的n臺存儲設(shè)備中分布式緩存數(shù)據(jù)。
在本發(fā)明一實施方式中,所述運維完成時間為:運維完成的即刻時間+同步時間差,其中,所述同步時間差為將所述關(guān)聯(lián)關(guān)系同步至客戶端的時間。具體的,所述關(guān)聯(lián)關(guān)系是緩存在發(fā)起讀寫請求的客戶端中的,因為該關(guān)聯(lián)關(guān) 系數(shù)據(jù)量很小,放在客戶端中的內(nèi)存中壓力不大,且可避免多次RPC。
在實際的分布環(huán)境下,數(shù)據(jù)的發(fā)生和接收并不是同時進行的,而是存在同步時間差,所述同步時間差為將所述關(guān)聯(lián)關(guān)系同步至客戶端的時間,為了保護該時間差,就需要將每次的運維完成時間進行“延后”生效,例如,將本次運維周期變更為[T_now+同步時間差,T_next],將上次運維周期變更為[T_last+同步時間差,T_now]。
進一步的,為了保障結(jié)果的一致性,可將本次運維周期變更為[T_now+同步時間差*p,T_next],即是在同步時間差上再乘以一個系數(shù)p,以確保該關(guān)聯(lián)關(guān)系在所述客戶端中集體生效。
進一步的,為了提高設(shè)備存儲空間的利用率,所述方法還包括:將隸屬周期早于預(yù)設(shè)最早時間閾值的數(shù)據(jù)從緩存設(shè)備中轉(zhuǎn)出或刪除,和/或?qū)r間周期早于預(yù)設(shè)最早時間閾值的關(guān)聯(lián)關(guān)系刪除。
相應(yīng)的,周期型數(shù)據(jù)在使用時,其使用具有“冷熱之分”,即:絕大部分場景都有實時性要求,越是最近發(fā)生的數(shù)據(jù)越有價值,而年代久遠(yuǎn)的數(shù)據(jù)會隨著時間流逝而價值遞減。例如,在國慶節(jié)期間希望快速得知當(dāng)前XX市的各個酒店的入住情況、各條高速公路上車的流量情況,以利于做出旅游線路、公交安排、交通管制等決策;而在3年以前的上述數(shù)據(jù),相比3年內(nèi)的上述數(shù)據(jù)而言,可參考的價值較低,只是在回顧歷史等時候才會調(diào)取。因此,在周期型數(shù)據(jù)的分布式緩存場景中,價值高的需要緩存在內(nèi)存做高速讀寫,價值較低的就可以轉(zhuǎn)入持久化存儲,如轉(zhuǎn)入數(shù)據(jù)庫或NOSQL,甚至轉(zhuǎn)入更廉價的存儲設(shè)備;亦或是永久刪除。
同理,也可將時間周期早于預(yù)設(shè)最早時間閾值的關(guān)聯(lián)關(guān)系從設(shè)備和/或客戶端中刪除,如此可增加查詢數(shù)據(jù)時的命中速度。
結(jié)合圖3所示,在本發(fā)明的一實施方式中,上述方法可通過以下公式實現(xiàn):
Map<termRange,term_function>term_function_map=…;
term_function={
final x=…;//集群中的節(jié)點信息
assign_function1(data.key,x)={…;return machine_id};
assign_function3(data.key){return assign_function1(data.key,x);}
}
calculateTermRange=function(data.term){…;return termRange;}
int machine_id=term_function_map.get(calculateTermRange(data.term)).assign_function3(data.key);
其中,map只是個理論上的結(jié)構(gòu),如偽代碼,并不強制它是個簡單的<key‐value>結(jié)構(gòu),該map真實、明確地存在。termRange為運維周期,也是map中的key;term_function為元數(shù)據(jù);term_function_map為函數(shù)周期地圖;machine_id為節(jié)點序號;assign_function1和前述背景技術(shù)中的assign_function2類似,在此不做詳細(xì)贅述。
相應(yīng)的,在TermRange隨著運維變更不斷產(chǎn)生的時刻,也會將它們的變更記錄存儲到term_function_map中,而value就是該TermRange下的term_function,x表示此次變更后新的節(jié)點信息,例如:節(jié)點服務(wù)器擴容了一臺機器后x中就會增加這臺服務(wù)器的信息;在data.key和x兩個參數(shù)的配合下按一定算法,例如:hash取模,計算出對應(yīng)的machine_id;assign_function3則是term_function向外提供的服務(wù),外界只需要提供data.key,它就能返回對應(yīng)的節(jié)點序號,之后assign_function3獲取到足夠的參數(shù)后在內(nèi)部調(diào)用assing_function1。
在周期型數(shù)據(jù)特征下,data都有term屬性,表示它隸屬于哪個周期。此時我們可以提供一個calculateTermRange函數(shù),它以data.term作為參數(shù),在term_function_map的keySet()中遍歷搜尋data.term所隸屬的TermRange,通過簡單的算法就能判斷隸屬關(guān)系,TermRange是連續(xù)時間的開閉區(qū)間,如[T_last,T_now]。
得到TermRange即能夠在term_function_map中得出該term對應(yīng)的唯一term_function,調(diào)用它向外界提供的服務(wù)assign_function3,傳入data.key參數(shù), 即可返回assign_function1,通過assign_function1和集群節(jié)點信息x,即可得到相應(yīng)的machine_id。如此,即可命中所要查詢的數(shù)據(jù)。
與現(xiàn)有技術(shù)相比,以此公式不會遇到傳統(tǒng)方案里的命中失敗問題;在本發(fā)明的方案中,x是固定值。原因在于,每次導(dǎo)致x發(fā)生變化的的Operation對會產(chǎn)生一個新的term_function,一旦產(chǎn)生,就會以此次Operation之后的節(jié)點信息作為x,并且永遠(yuǎn)不會去修改它。而每個Term則必然可以對應(yīng)到它所隸屬的唯一一個term_function,所以x是固定值,也就不會導(dǎo)致命中失敗。另外,本發(fā)明的term_function_map只有極少的數(shù)據(jù)量,即使是在發(fā)展速度很快的業(yè)務(wù)場景下,也至多一周做一次擴容操作,也就是一周才會在map中新增一條記錄,而每條記錄也就是簡單的節(jié)點信息等元數(shù)據(jù),只占用很少的存儲空間。由于周期型數(shù)據(jù)“冷熱之分”的特點,久遠(yuǎn)的歷史數(shù)據(jù)會逐漸從緩存中踢出,所以term_function_map也可以逐漸刪除久遠(yuǎn)的記錄,不會隨著時間流逝而無窮無盡的增加記錄。故,也可以降低設(shè)備的存儲成本。
進一步的,在上述內(nèi)容中,介紹了對設(shè)備進行擴容的場景,在設(shè)備進行減容操作時,可以執(zhí)行減節(jié)點動作,即在減容變更時刻執(zhí)行減容操作,導(dǎo)致x變化、產(chǎn)生新的termRange和term_function,此時,不要撤掉減容的設(shè)備,保留該設(shè)備繼續(xù)正常運行。在“冷熱之分”的前提下,此機器上的數(shù)據(jù)會慢慢淪為久遠(yuǎn)的歷史數(shù)據(jù),不再需要提供緩存服務(wù),原因在于,該設(shè)備不會存在于減容變更時刻之后的term_function.x中,亦不會被后來的周期數(shù)據(jù)使用。如此,一段時間后,當(dāng)該設(shè)備上的數(shù)據(jù)被完全轉(zhuǎn)移或刪除后,就可以撤掉該設(shè)備。相應(yīng)的,如果設(shè)備節(jié)點發(fā)生故障,那處理過程也于對設(shè)備進行減容相似,例如:減去發(fā)生故障的機器,產(chǎn)生新的x;或者減去故障機器的同時也從資源池中獲取一臺新機器加進去,產(chǎn)生新的x,在此不做詳細(xì)贅述。
當(dāng)然,在擴容后,由于新加入的設(shè)備中只存儲有本次運維完成時間至下次運維完成時間之間的周期型數(shù)據(jù),而未能完全分擔(dān)已有設(shè)備中的數(shù)據(jù),但因新加入的設(shè)備存儲量低,在數(shù)據(jù)寫入時,根據(jù)分布式緩存的規(guī)則,會優(yōu)先寫入新加入的設(shè)備,逐漸達(dá)到平衡。當(dāng)然,也可選擇服務(wù)器訪問次數(shù)較低的 時間對數(shù)據(jù)進行遷移。
如圖2所示,本發(fā)明一實施方式,周期型數(shù)據(jù)的分布式緩存運維裝置包括:存儲模塊100,匹配運算模塊200,清理模塊300。
存儲模塊100用于記錄每次運維時的運維完成時間及運維設(shè)備數(shù)量,以備匹配運算模塊200調(diào)用。
在本實施方式中,所述運維包括對設(shè)備數(shù)量的增加和減少。所述運維完成時間,即對設(shè)備數(shù)量進行擴容或減容完成的時間。其中,所述設(shè)備用于存儲周期型數(shù)據(jù),每個周期型數(shù)據(jù)都包括相應(yīng)隸屬的某個周期,所述周期是根據(jù)統(tǒng)計的粒度需要而設(shè)置的,比如是日、小時、分鐘、秒等。例如:數(shù)據(jù):“一個賬戶的余額是1000元”,該為非周期型數(shù)據(jù);數(shù)據(jù):“某賬戶在2014‐11‐11 11:11分發(fā)生了3次存款,存款額為1000元”,該數(shù)據(jù)為周期型數(shù)據(jù),即周期型數(shù)據(jù)一定要包括事件,以及事件發(fā)生的時間。
相應(yīng)的,上一次運維發(fā)生時,存儲模塊100記錄上一次運維完成設(shè)備變更的時間T_last,及上一次運維變更結(jié)束時的設(shè)備數(shù)量m;當(dāng)前運維時,存儲模塊100記錄當(dāng)前運維完成設(shè)備變更的時間T_now,及當(dāng)前運維變更結(jié)束時的設(shè)備數(shù)量n。
匹配運算模塊200用于將相鄰的運維完成時間形成運維周期,以在讀取緩存時確定讀取數(shù)據(jù)的隸屬周期。
例如,匹配運算模塊200將上一次運維完成時間至本次運維完成時間所形成的運維周期為[T_last,T_now],表示從T_last開始到T_now結(jié)束;匹配運算模塊200將本次運維完成時間至下一次運維完成時間所形成的運維周期為[T_now,T_next],所述T_next表示下一個運維完成時所處的時間。
當(dāng)然,在匹配運算模塊200不確定下一次運維完成時間時,可將該運維周期標(biāo)注為:[T_now,null],直至下一次運維完成,再將所述運維周期改寫為[T_now,T_next]。
匹配運算模塊200用于記錄運維周期、存儲設(shè)備總數(shù)量的關(guān)聯(lián)關(guān)系,以在讀取緩存時,根據(jù)讀取數(shù)據(jù)的隸屬周期確定存儲設(shè)備總數(shù)量和存儲設(shè)備。
相應(yīng)的,匹配運算模塊200記錄存儲設(shè)備總數(shù)量和存儲設(shè)備的序號區(qū)間的關(guān)聯(lián)關(guān)系,一般的,為了方便調(diào)取,所述存儲設(shè)備總數(shù)量和存儲設(shè)備的序號之間可按照相應(yīng)規(guī)則產(chǎn)生,在本實施方式中,所述存儲設(shè)備的序號按照從小到大順序編號,即設(shè)備總數(shù)量為m的設(shè)備編號所在區(qū)間為[a,a+m‐1],設(shè)備總數(shù)量為n的設(shè)備編號所在區(qū)間為[a,a+n‐1]。例如,假設(shè)有100臺設(shè)備用于存儲數(shù)據(jù),那么所述設(shè)備編號所在區(qū)間為[a,a+99]。其中,a為自然數(shù),是數(shù)據(jù)的存儲設(shè)備的起始編號。例如:周期型數(shù)據(jù)“某賬戶在2014‐11‐11 11:11分發(fā)生了3次存款,存款額為1000元”,經(jīng)過分析,得知該周期型數(shù)據(jù)的隸屬周期區(qū)間為[T_last,T_now],之后根據(jù)所述隸屬周期區(qū)間[T_last,T_now],確定該隸屬區(qū)間內(nèi)存儲設(shè)備總量為m,存儲設(shè)備序號所在區(qū)間為[a,a+m‐1]。
匹配運算模塊200用于將隸屬周期在上次運維完成時間至本次運維完成時間內(nèi)的數(shù)據(jù)的存儲設(shè)備,與上次運維后的存儲設(shè)備總數(shù)量m匹配,以在序號區(qū)間為[a,a+m‐1]的m臺存儲設(shè)備中分布式緩存數(shù)據(jù);
將隸屬周期在本次運維完成時間至下次運維完成時間內(nèi)的數(shù)據(jù)的存儲設(shè)備,與本次運維后的存儲設(shè)備總數(shù)量n匹配,以在序號區(qū)間為[a,a+n‐1]的n臺存儲設(shè)備中分布式緩存數(shù)據(jù)。
在本發(fā)明一實施方式中,所述運維完成時間為:運維完成的即刻時間+同步時間差,其中,所述同步時間差為匹配運算模塊200將所述關(guān)聯(lián)關(guān)系同步至客戶端的時間。具體的,所述關(guān)聯(lián)關(guān)系是緩存在發(fā)起讀寫請求的客戶端中的,因為該關(guān)聯(lián)關(guān)系數(shù)據(jù)量很小,放在客戶端中的內(nèi)存中壓力不大,且可避免多次RPC。
在實際的分布環(huán)境下,匹配運算模塊200對數(shù)據(jù)的發(fā)生和接收并不是同時進行的,而是存在同步時間差,所述同步時間差為將所述關(guān)聯(lián)關(guān)系同步至客戶端的時間,為了保護該時間差,就需要將每次的運維完成時間進行“延后”生效,例如,匹配運算模塊200將本次運維周期變更為[T_now+同步時間差,T_next],將上次運維周期變更為[T_last+同步時間差,T_now]。
進一步的,為了保障結(jié)果的一致性,匹配運算模塊200可將本次運維周期變更為[T_now+時間差*p,T_next],即是在同步時間差上再乘以一個系數(shù)p,以確保該關(guān)聯(lián)關(guān)系在所述客戶端中集體生效。
進一步的,為了提高設(shè)備存儲空間的利用率,清理模塊300用于將隸屬周期早于預(yù)設(shè)最早時間閾值的數(shù)據(jù)從緩存設(shè)備中轉(zhuǎn)出或刪除,和/或?qū)r間周期早于預(yù)設(shè)最早時間閾值的關(guān)聯(lián)關(guān)系刪除。
相應(yīng)的,周期型數(shù)據(jù)在使用時,其使用具有“冷熱之分”,即:絕大部分場景都有實時性要求,越是最近發(fā)生的數(shù)據(jù)越有價值,而年代久遠(yuǎn)的數(shù)據(jù)會隨著時間流逝而價值遞減。例如,在國慶節(jié)期間希望快速得知當(dāng)前XX市的各個酒店的入住情況、各條高速公路上車的流量情況,以利于做出旅游線路、公交安排、交通管制等決策;而在3年以前的上述數(shù)據(jù),相比之下價值較低,只是在回顧歷史等時候才會調(diào)取。因此,在周期型數(shù)據(jù)的分布式緩存場景中,清理模塊300將價值高的需要緩存在內(nèi)存做高速讀寫,價值較低的就可以轉(zhuǎn)入持久化存儲,如轉(zhuǎn)入數(shù)據(jù)庫或NOSQL,甚至轉(zhuǎn)入更廉價的存儲設(shè)備;亦或是永久刪除。
同理,清理模塊300也可將時間周期早于預(yù)設(shè)最早時間閾值的關(guān)聯(lián)關(guān)系從設(shè)備和/或客戶端中刪除,如此可增加查詢數(shù)據(jù)時的命中速度。
進一步的,匹配運算模塊200在設(shè)備進行減容操作時,可以執(zhí)行減節(jié)點動作,即在減容變更時刻執(zhí)行減容操作,此時,不要撤掉減容的設(shè)備,保留該設(shè)備繼續(xù)正常運行。在“冷熱之分”的前提下,此機器上的數(shù)據(jù)會慢慢淪為久遠(yuǎn)的歷史數(shù)據(jù),不再需要提供緩存服務(wù)。如此,一段時間后,當(dāng)該設(shè)備上的數(shù)據(jù)被完全轉(zhuǎn)移或刪除后,就可以撤掉該設(shè)備。相應(yīng)的,如果設(shè)備節(jié)點發(fā)生故障,那處理過程也于對設(shè)備進行減容相似,例如:減去發(fā)生故障的機器;或者減去故障機器的同時也從資源池中獲取一臺新機器加進去,在此不做詳細(xì)贅述。
當(dāng)然,在擴容后,由于新加入的設(shè)備中只存儲有本次運維完成時間至下次運維完成時間之間的周期型數(shù)據(jù),而未能完全分擔(dān)已有設(shè)備中的數(shù)據(jù),但 因新加入的設(shè)備存儲量低,在數(shù)據(jù)寫入時,根據(jù)分布式緩存的規(guī)則,會優(yōu)先寫入新加入的設(shè)備,逐漸達(dá)到平衡。當(dāng)然,也可選擇服務(wù)器訪問次數(shù)較低的時間對數(shù)據(jù)進行遷移。
所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡潔,上述描述的裝置的具體工作過程,可以參考前述方法實施方式中的對應(yīng)過程,在此不再贅述。
與現(xiàn)有技術(shù)相比,本發(fā)明的周期型數(shù)據(jù)的分布式緩存運維方法及裝置,充分利用周期型數(shù)據(jù)的本質(zhì)屬性,在保障命中成功的前提下避免數(shù)據(jù)遷移等消耗,以在周期型數(shù)據(jù)緩存場景下用最低的成本解決機器擴容減容、故障處理時的損耗,實現(xiàn)低成本的可擴展性方案,顯著提高了運維的效率。
需要說明的是,本發(fā)明不僅可以用于周期型數(shù)據(jù)緩存,也可以用于流式計算的中間計算節(jié)點上。比如用Storm來統(tǒng)計apache日志計算PV,PV本身就是周期型數(shù)據(jù),例如:計算某一秒的PV、某一分鐘的PV,如果沒有任何保障,那Storm的計算節(jié)點發(fā)生擴容時就會產(chǎn)生數(shù)據(jù)分流,即某一分鐘的PV數(shù)據(jù)有一半在機器A、另一半在機器B,影響計算邏輯復(fù)雜度,在此不做詳細(xì)贅述。
在本發(fā)明所提供的幾個實施方式中,應(yīng)該理解到,所揭露的系統(tǒng),裝置和方法,可以通過其它的方式實現(xiàn)。例如,以上所描述的裝置實施方式僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上。可以根據(jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施方式方案的目的。
另外,在本發(fā)明各個實施方式中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以2個或2個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用硬件加軟件功能單元的形式實現(xiàn)。
上述以軟件功能單元的形式實現(xiàn)的集成的單元,可以存儲在一個計算機可讀取存儲介質(zhì)中。上述軟件功能單元存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機裝置(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)裝置等)或處理器(processor)執(zhí)行本發(fā)明各個實施方式所述方法的部分步驟。而前述的存儲介質(zhì)包括:U盤、移動硬盤、只讀存儲器(Read‐Only Memory,ROM)、隨機存取存儲器(Random Access Memory,RAM)、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
最后應(yīng)說明的是:以上實施方式僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡管參照前述實施方式對本發(fā)明進行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對前述各實施方式所記載的技術(shù)方案進行修改,或者對其中部分技術(shù)特征進行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實施方式技術(shù)方案的精神和范圍。