本發(fā)明涉及IT技術(shù)領(lǐng)域,尤其涉及分布式存儲(chǔ)系統(tǒng)中的數(shù)據(jù)重建的方法、裝置和系統(tǒng)。
背景技術(shù):
存儲(chǔ)系統(tǒng)中,為了保證數(shù)據(jù)的安全,通常使用多副本存儲(chǔ)技術(shù)來(lái)實(shí)現(xiàn)數(shù)據(jù)的冗余備份。多副本冗余技術(shù)就是對(duì)一份數(shù)據(jù)同時(shí)存儲(chǔ)多份相同的副本,當(dāng)一份數(shù)據(jù)丟失時(shí),可以通過(guò)其他副本的數(shù)據(jù)將丟失的數(shù)據(jù)恢復(fù)出來(lái),從而降低數(shù)據(jù)丟失的概率。副本個(gè)數(shù)的增加將會(huì)大大增加系統(tǒng)存儲(chǔ)空間和網(wǎng)絡(luò)帶寬的消耗,從而增加數(shù)據(jù)存儲(chǔ)的成本。如兩副本情況下,用戶真正可用空間是整個(gè)系統(tǒng)總存儲(chǔ)空間的50%,而在三副本的情況下,用戶真正可用空間則只有33%。
由于多副本存儲(chǔ)技術(shù)存在存儲(chǔ)空間浪費(fèi)的缺點(diǎn),現(xiàn)階段的分布式存儲(chǔ)系統(tǒng)越來(lái)越多的采用糾刪碼(EC,Erasure Code)技術(shù)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)。目前在存儲(chǔ)領(lǐng)域廣泛應(yīng)用的是Reed-Solomen類糾刪碼,具體原理是,將數(shù)據(jù)分割成m個(gè)數(shù)據(jù)塊,采用冗余算法對(duì)m個(gè)數(shù)據(jù)塊進(jìn)行校驗(yàn)編碼,用編碼矩陣和m個(gè)數(shù)據(jù)塊做乘法運(yùn)算,從而生成k個(gè)校驗(yàn)塊,該m個(gè)數(shù)據(jù)塊與k個(gè)校驗(yàn)塊組成一個(gè)EC條帶。由于矩陣運(yùn)算是可逆,當(dāng)EC條帶中的m+k個(gè)塊中小于或等于k個(gè)塊丟失時(shí),均可以還原丟失的塊中的數(shù)據(jù)。
相對(duì)副本而言,糾刪碼的編碼技術(shù)無(wú)疑對(duì)存儲(chǔ)空間利用率帶來(lái)很大提升,但由于引入額外的編碼、解碼運(yùn)算,對(duì)分布式存儲(chǔ)系統(tǒng)的計(jì)算能力帶來(lái)額外的要求。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)描述了一種分布式存儲(chǔ)系統(tǒng)中的數(shù)據(jù)重建的方法、裝置和系統(tǒng),解決了故障節(jié)點(diǎn)恢復(fù)后重建故障節(jié)點(diǎn)上的數(shù)據(jù)的問(wèn)題,無(wú)需使用EC反編碼的方式來(lái)恢復(fù)數(shù)據(jù),降低了計(jì)算資源以及網(wǎng)絡(luò)資源的消耗。
一方面,本發(fā)明實(shí)施例提供了一種分布式存儲(chǔ)系統(tǒng)中數(shù)據(jù)重建的方法,第一存儲(chǔ)節(jié)點(diǎn)獲取待寫(xiě)入數(shù)據(jù),確定所述待寫(xiě)入數(shù)據(jù)的key值,刷新所述key值對(duì)應(yīng)的版本號(hào),對(duì)所述待寫(xiě)入數(shù)據(jù)進(jìn)行EC編碼,生成EC條帶,所述EC條帶包括m+k個(gè)EC塊,其中m個(gè)EC塊為數(shù)據(jù)塊,k個(gè)EC塊為校驗(yàn)塊,m為大于等于2的正整數(shù),k為自然數(shù);第一存儲(chǔ)節(jié)點(diǎn)查詢分區(qū)視圖,確定所述待寫(xiě)入數(shù)據(jù)所在的分區(qū)對(duì)應(yīng)的第二存儲(chǔ)節(jié)點(diǎn),所述第一存儲(chǔ)節(jié)點(diǎn)為所述分區(qū)對(duì)應(yīng)的主存儲(chǔ)節(jié)點(diǎn),所述第二存儲(chǔ)節(jié)點(diǎn)為所述分區(qū)對(duì)應(yīng)的備存儲(chǔ)節(jié)點(diǎn);所述第一存儲(chǔ)節(jié)點(diǎn)向所述第二存儲(chǔ)節(jié)點(diǎn)發(fā)送寫(xiě)入請(qǐng)求,所述寫(xiě)入請(qǐng)求攜帶所述待寫(xiě)入數(shù)據(jù)所在的分區(qū)標(biāo)識(shí)(ID)、所述待寫(xiě)入數(shù)據(jù)的key值和版本號(hào),以及分配給所述第二存儲(chǔ)節(jié)點(diǎn)的EC塊的數(shù)據(jù)、塊內(nèi)數(shù)據(jù)偏移和塊內(nèi)數(shù)據(jù)長(zhǎng)度;第一存儲(chǔ)節(jié)點(diǎn)確定所述第二存儲(chǔ)節(jié)點(diǎn)寫(xiě)入失敗,存儲(chǔ)所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)的EC塊的數(shù)據(jù),生成與所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)的EC塊對(duì)應(yīng)的元數(shù)據(jù)信息,所述元數(shù)據(jù)信息包括所述待寫(xiě)入數(shù)據(jù)所在的分區(qū)的分區(qū)ID、所述待寫(xiě)入數(shù)據(jù)的key值和版本號(hào),以及分配給所述第二存儲(chǔ)節(jié)點(diǎn)的EC塊的塊內(nèi)數(shù)據(jù)偏移和塊內(nèi)數(shù)據(jù)長(zhǎng)度;當(dāng)所述第二存儲(chǔ)節(jié)點(diǎn)故障恢復(fù)后,所述第一存儲(chǔ)節(jié)點(diǎn)將存儲(chǔ)的所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)的EC塊的數(shù)據(jù)以及所述元數(shù)據(jù)信息發(fā)送給所述第二存儲(chǔ)節(jié)點(diǎn),以使得所述第二存儲(chǔ)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)重建。
分布式存儲(chǔ)系統(tǒng)中的主存儲(chǔ)節(jié)點(diǎn)對(duì)待寫(xiě)入數(shù)據(jù)進(jìn)行EC編碼,生成EC條帶,將EC條帶中的各個(gè)EC塊分別存儲(chǔ)在各個(gè)存儲(chǔ)節(jié)點(diǎn)上,當(dāng)部分存儲(chǔ)節(jié)點(diǎn)由于故障導(dǎo)致寫(xiě)入EC塊失敗時(shí),主存儲(chǔ)節(jié)點(diǎn)將分配給寫(xiě)入失敗的存儲(chǔ)節(jié)點(diǎn)的EC塊存儲(chǔ)在本地,并生成數(shù)據(jù)重建所需的元數(shù)據(jù)信息,當(dāng)存儲(chǔ)節(jié)點(diǎn)故障恢復(fù)后,主存儲(chǔ)節(jié)點(diǎn)將存儲(chǔ)的分配給寫(xiě)入失敗的存儲(chǔ)節(jié)點(diǎn)的EC塊以及該EC塊對(duì)應(yīng)的元數(shù)據(jù)信息重新發(fā)送給該存儲(chǔ)節(jié)點(diǎn),以使得故障恢復(fù)后的該存儲(chǔ)節(jié)點(diǎn)完成數(shù)據(jù)重建。本申請(qǐng)?zhí)峁┑姆植际酱鎯?chǔ)系統(tǒng)中的數(shù)據(jù)重建的方案,當(dāng)部分存儲(chǔ)節(jié)點(diǎn)故障時(shí),無(wú)需執(zhí)行EC反編碼以恢復(fù)故障節(jié)點(diǎn)上的數(shù)據(jù),而是由主存儲(chǔ)節(jié)點(diǎn)緩存分配給故障節(jié)點(diǎn)的EC塊,再故障節(jié)點(diǎn)恢復(fù)后再將緩存的EC塊重新發(fā)送給故障節(jié)點(diǎn)進(jìn)行數(shù)據(jù)重建。通過(guò)上述方案,避免了存儲(chǔ)節(jié)點(diǎn)故障恢復(fù)進(jìn)行數(shù)據(jù)重建時(shí)執(zhí)行EC反編碼帶來(lái)的計(jì)算資源消耗,同時(shí)也避免了執(zhí)行EC反編碼時(shí)傳遞大量數(shù)據(jù)帶來(lái)的網(wǎng)絡(luò)資源消耗。示例性的,當(dāng)EC編碼為4+2時(shí),恢復(fù)1份數(shù)據(jù)需要4份數(shù)據(jù),而本申請(qǐng)中,只是在故障節(jié)點(diǎn)恢復(fù)后,由主存儲(chǔ)節(jié)點(diǎn)向故障節(jié)點(diǎn)重新發(fā)送1份數(shù)據(jù),明顯降低了網(wǎng)絡(luò)資源消耗;進(jìn)一步的,分布式存儲(chǔ)系統(tǒng)中,丟失1份數(shù)據(jù)的概率遠(yuǎn)遠(yuǎn)大于丟失兩份數(shù)據(jù),而丟失1份數(shù)據(jù)時(shí),仍然可以還原出原始數(shù)據(jù),因此,無(wú)需立刻執(zhí)行EC反編碼將丟失的數(shù)據(jù)還原,當(dāng)故障節(jié)點(diǎn)恢復(fù)后,采用本申請(qǐng)?zhí)岢龅臄?shù)據(jù)重建的方案即可將故障節(jié)點(diǎn)上的數(shù)據(jù)與其他存儲(chǔ)節(jié)點(diǎn)進(jìn)行同步。
在一種可能的實(shí)施方式中,所述待寫(xiě)入數(shù)據(jù)的key值用于表示存儲(chǔ)所述待寫(xiě)入數(shù)據(jù)的邏輯卷的地址范圍。
在一種可能的實(shí)施方式中,所述待寫(xiě)入數(shù)據(jù)的key值由存儲(chǔ)所述待寫(xiě)入數(shù)據(jù)的邏輯卷的卷標(biāo)識(shí)和數(shù)據(jù)偏移標(biāo)識(shí)組成,所述數(shù)據(jù)偏移標(biāo)識(shí)表示所述待寫(xiě)入數(shù)據(jù)在所述邏輯卷中的地址范圍。
在一種可能的實(shí)施方式中,存儲(chǔ)客戶端根據(jù)存儲(chǔ)所述待寫(xiě)入數(shù)據(jù)的邏輯卷的卷標(biāo)識(shí)和數(shù)據(jù)偏移標(biāo)識(shí),確定所述待寫(xiě)入數(shù)據(jù)的key值,所述數(shù)據(jù)偏移標(biāo)識(shí)表示所述待寫(xiě)入數(shù)據(jù)在所述邏輯卷中的地址范圍??梢詫⑦壿嬀淼木順?biāo)識(shí)和數(shù)據(jù)偏移標(biāo)識(shí)合并后得到的字符串作為所述待寫(xiě)入數(shù)據(jù)的key值。所述待寫(xiě)入數(shù)據(jù)的key值可以用來(lái)唯一區(qū)分該待寫(xiě)入數(shù)據(jù)存儲(chǔ)的地址范圍。
在一種可能的實(shí)施方式中,存儲(chǔ)客戶端使用一致性哈希算法計(jì)算所述待寫(xiě)入數(shù)據(jù)的key值對(duì)應(yīng)的哈希值,確定所述哈希值所屬的分區(qū)的分區(qū)ID。存儲(chǔ)客戶端確定該分區(qū)對(duì)應(yīng)的主存儲(chǔ)節(jié)點(diǎn)為第一存儲(chǔ)節(jié)點(diǎn)時(shí),向第一存儲(chǔ)節(jié)點(diǎn)發(fā)送寫(xiě)入請(qǐng)求,所述寫(xiě)入請(qǐng)求攜帶所述待寫(xiě)入數(shù)據(jù)、所述key值、分區(qū)ID,以及待寫(xiě)入數(shù)據(jù)的數(shù)據(jù)偏移和數(shù)據(jù)長(zhǎng)度。
在一種可能的實(shí)施方式中,所述分區(qū)視圖包括分區(qū)ID、主存儲(chǔ)節(jié)點(diǎn)標(biāo)識(shí)以及備存儲(chǔ)節(jié)點(diǎn)標(biāo)識(shí)。分區(qū)視圖由分區(qū)視圖管理模塊維護(hù)并分發(fā)給各存儲(chǔ)節(jié)點(diǎn)。通過(guò)統(tǒng)一的分區(qū)視圖管理,可以實(shí)現(xiàn)待寫(xiě)入數(shù)據(jù)盡量均衡的寫(xiě)入到各個(gè)分區(qū),且各個(gè)分區(qū)盡量均衡的分布在分布式存儲(chǔ)系統(tǒng)的各個(gè)存儲(chǔ)節(jié)點(diǎn)上,實(shí)現(xiàn)數(shù)據(jù)的冗余備份。
在一種可能的實(shí)施方式中,第一存儲(chǔ)節(jié)點(diǎn)接收分區(qū)視圖管理模塊發(fā)送的故障節(jié)點(diǎn)通知消息,所述故障節(jié)點(diǎn)通知消息中攜帶所述第二存儲(chǔ)節(jié)點(diǎn)的標(biāo)識(shí),確定所述第二存儲(chǔ)節(jié)點(diǎn)寫(xiě)入失敗。需要說(shuō)明的是,當(dāng)?shù)谝淮鎯?chǔ)節(jié)點(diǎn)接收到備存儲(chǔ)節(jié)點(diǎn)返回的寫(xiě)入失敗響應(yīng)確定備存儲(chǔ)節(jié)點(diǎn)寫(xiě)入失敗,不一定認(rèn)為備存儲(chǔ)節(jié)點(diǎn)必然會(huì)寫(xiě)入失敗,由于發(fā)送備存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)可能丟失,此時(shí),第一存儲(chǔ)節(jié)點(diǎn)會(huì)向備存儲(chǔ)節(jié)點(diǎn)再次發(fā)送寫(xiě)入請(qǐng)求,備存儲(chǔ)節(jié)點(diǎn)重試寫(xiě)入EC塊。因此,優(yōu)選地,以分區(qū)視圖管理模塊發(fā)送的故障節(jié)點(diǎn)通知消息為準(zhǔn)確定存儲(chǔ)節(jié)點(diǎn)寫(xiě)入失敗。
當(dāng)?shù)诙鎯?chǔ)節(jié)點(diǎn)故障恢復(fù)后,第二存儲(chǔ)節(jié)點(diǎn)向分區(qū)視圖管理模塊請(qǐng)求最新的分區(qū)視圖,確定自身存儲(chǔ)的分區(qū)對(duì)應(yīng)的主存儲(chǔ)節(jié)點(diǎn),向分區(qū)對(duì)應(yīng)的主存儲(chǔ)節(jié)點(diǎn)請(qǐng)求數(shù)據(jù)同步。故障節(jié)點(diǎn)上可能存在多個(gè)分區(qū),每個(gè)分區(qū)的主存儲(chǔ)節(jié)點(diǎn)可能不同,因此,針對(duì)不同的分區(qū),故障節(jié)點(diǎn)需要向不同的主存儲(chǔ)節(jié)點(diǎn)請(qǐng)求數(shù)據(jù)同步。
具體的,所述第一存儲(chǔ)節(jié)點(diǎn)接收所述第二存儲(chǔ)節(jié)點(diǎn)發(fā)送的數(shù)據(jù)同步請(qǐng)求,所述數(shù)據(jù)同步請(qǐng)求中攜帶所述分區(qū)ID;所述第一存儲(chǔ)節(jié)點(diǎn)從所述第二存儲(chǔ)節(jié)點(diǎn)獲取所述第二存儲(chǔ)節(jié)點(diǎn)中記錄的所述分區(qū)ID對(duì)應(yīng)的一個(gè)或多個(gè)key值,以及與所述key值的版本號(hào);所述第一存儲(chǔ)節(jié)點(diǎn)將自身記錄的所述分區(qū)ID對(duì)應(yīng)的key值以及各key值的版本號(hào),與從所述第二存儲(chǔ)節(jié)點(diǎn)獲取的所述分區(qū)ID對(duì)應(yīng)的一個(gè)或多個(gè)key值,以及與所述key值的版本號(hào),進(jìn)行比對(duì),根據(jù)比對(duì)結(jié)果確定需要進(jìn)行數(shù)據(jù)重建;所述第一存儲(chǔ)節(jié)點(diǎn)根據(jù)所述元數(shù)據(jù)信息,將存儲(chǔ)的需要進(jìn)行數(shù)據(jù)重建的key值對(duì)應(yīng)的EC塊的數(shù)據(jù)以及所述EC塊的元數(shù)據(jù)信息發(fā)送給所述第二存儲(chǔ)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)重建。
當(dāng)?shù)谝淮鎯?chǔ)節(jié)點(diǎn)接收到第二存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)同步請(qǐng)求時(shí),執(zhí)行比對(duì)操作,判斷需要針對(duì)那些key值對(duì)應(yīng)的數(shù)據(jù)進(jìn)行同步,所述比對(duì)包括以下至少一種:
當(dāng)所述第一存儲(chǔ)節(jié)點(diǎn)記錄的key值對(duì)應(yīng)的版本號(hào)與從所述第二存儲(chǔ)節(jié)點(diǎn)獲取的所述key值對(duì)應(yīng)的版本號(hào)一致時(shí),無(wú)需進(jìn)行數(shù)據(jù)重建;
當(dāng)所述第一存儲(chǔ)節(jié)點(diǎn)記錄的key值中不包含從所述第二存儲(chǔ)節(jié)點(diǎn)獲取的key值時(shí),則通知所述第二存儲(chǔ)節(jié)點(diǎn)刪除所述第一存儲(chǔ)節(jié)點(diǎn)不包含的所述key值對(duì)應(yīng)的數(shù)據(jù);
當(dāng)所述第一存儲(chǔ)節(jié)點(diǎn)記錄的key值對(duì)應(yīng)的版本號(hào)大于從所述第二存儲(chǔ)節(jié)點(diǎn)獲取的所述key值對(duì)應(yīng)的版本號(hào)時(shí),執(zhí)行數(shù)據(jù)重建操作;或,
當(dāng)所述第一存儲(chǔ)節(jié)點(diǎn)記錄的key值中不包含在從所述第二存儲(chǔ)節(jié)點(diǎn)獲取的key值中時(shí),則通知所述第二存儲(chǔ)節(jié)點(diǎn)重建所述第二存儲(chǔ)節(jié)點(diǎn)不包含的所述key值對(duì)應(yīng)的數(shù)據(jù)。
在一種可能的實(shí)施方式中,當(dāng)?shù)诙鎯?chǔ)節(jié)點(diǎn)在故障恢復(fù)后接收到第一存儲(chǔ)節(jié)點(diǎn)緩存的EC塊以及對(duì)應(yīng)的元數(shù)據(jù)信息時(shí),所述第二存儲(chǔ)節(jié)點(diǎn)根據(jù)所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)的EC塊的塊內(nèi)數(shù)據(jù)偏移和塊內(nèi)數(shù)據(jù)長(zhǎng)度,將所述EC塊的數(shù)據(jù)寫(xiě)入到磁盤中,更新所述待寫(xiě)入數(shù)據(jù)的key值對(duì)應(yīng)的版本號(hào),從而完成該EC塊的數(shù)據(jù)重建。
在一種可能的實(shí)現(xiàn)方式中,本申請(qǐng)以m個(gè)EC塊的大小為粒度將所述邏輯卷的存儲(chǔ)地址進(jìn)行等分,得到多個(gè)存儲(chǔ)單元,為所述多個(gè)存儲(chǔ)單元分配數(shù)據(jù)偏移標(biāo)識(shí)。進(jìn)一步的,所述存儲(chǔ)客戶端接收上層應(yīng)用發(fā)送的存儲(chǔ)指令,所述存儲(chǔ)指令中攜帶待存儲(chǔ)的數(shù)據(jù),以及存儲(chǔ)所述待存儲(chǔ)的數(shù)據(jù)的所述邏輯卷的卷標(biāo)識(shí)、數(shù)據(jù)偏移和數(shù)據(jù)長(zhǎng)度;所述存儲(chǔ)客戶端確定存儲(chǔ)所述待存儲(chǔ)的數(shù)據(jù)的地址范圍對(duì)應(yīng)的至少一個(gè)存儲(chǔ)單元,將每個(gè)存儲(chǔ)單元對(duì)應(yīng)的部分待存儲(chǔ)的數(shù)據(jù)作為一次寫(xiě)入操作中需要寫(xiě)入到分布式存儲(chǔ)系統(tǒng)的所述待寫(xiě)入數(shù)據(jù)。
當(dāng)一次存儲(chǔ)的數(shù)據(jù)較大時(shí),待存儲(chǔ)的數(shù)據(jù)可能需要分成多段分幾次寫(xiě)入到分布式存儲(chǔ)系統(tǒng)中。本申請(qǐng)?zhí)峁┝艘环N對(duì)待存儲(chǔ)數(shù)據(jù)進(jìn)行分段寫(xiě)入的方法,一次寫(xiě)入的數(shù)據(jù)被稱為待寫(xiě)入數(shù)據(jù)。
更進(jìn)一步的,第一存儲(chǔ)節(jié)點(diǎn)使用一致性哈希算法計(jì)算所述待寫(xiě)入數(shù)據(jù)的key值對(duì)應(yīng)的哈希值,確定所述哈希值所屬的分區(qū)的分區(qū)ID。通過(guò)采用一致性哈希的方式,將數(shù)據(jù)均勻的分布到各個(gè)分區(qū)上。
在一種可能的實(shí)施方式中,第一存儲(chǔ)節(jié)點(diǎn)可以在接收到寫(xiě)入失敗響應(yīng)后,確定發(fā)送寫(xiě)入失敗響應(yīng)的存儲(chǔ)節(jié)點(diǎn)故障;或者,第一存儲(chǔ)節(jié)點(diǎn)可以根據(jù)分區(qū)視圖中記錄的存儲(chǔ)節(jié)點(diǎn)的狀態(tài)信息確定故障節(jié)點(diǎn)。
在一種可能的實(shí)施方式中,本申請(qǐng)還提供了第一存儲(chǔ)節(jié)點(diǎn)緩存分配給寫(xiě)入失敗的故障節(jié)點(diǎn)的EC塊的方法,具體的,所述第一存儲(chǔ)節(jié)點(diǎn)分配空閑的存儲(chǔ)空間作為日志卷,用于存儲(chǔ)分配給寫(xiě)入失敗的存儲(chǔ)節(jié)點(diǎn)的EC塊,所述日志卷由至少一個(gè)日志塊組成,所述日志塊的大小與所述EC塊的大小相同。
通過(guò)設(shè)定日志塊的大小與EC塊的大小相同,即實(shí)現(xiàn)了EC塊粒度的數(shù)據(jù)重建,重建方法復(fù)雜度低。
另一方面,本發(fā)明實(shí)施例提供了一種存儲(chǔ)節(jié)點(diǎn),該存儲(chǔ)節(jié)點(diǎn)具體實(shí)現(xiàn)上述方法中第一存儲(chǔ)節(jié)點(diǎn)的功能。所述功能可以通過(guò)硬件實(shí)現(xiàn),也可以通過(guò)硬件執(zhí)行相應(yīng)的軟件實(shí)現(xiàn)。所述硬件或軟件包括一個(gè)或多個(gè)與上述功能相對(duì)應(yīng)的模塊。
在一個(gè)可能的設(shè)計(jì)中,存儲(chǔ)節(jié)點(diǎn)的結(jié)構(gòu)中包括處理器和存儲(chǔ)器,所述處理器被配置為支持存儲(chǔ)節(jié)點(diǎn)執(zhí)行上述系統(tǒng)中相應(yīng)的功能。所述存儲(chǔ)節(jié)點(diǎn)還可以包括存儲(chǔ)器,所述存儲(chǔ)器用于與處理器耦合,其保存存儲(chǔ)節(jié)點(diǎn)執(zhí)行上述功能所必要的程序指令和數(shù)據(jù)。
又一方面,本發(fā)明實(shí)施例提供了一種分布式存儲(chǔ)系統(tǒng),該分布式存儲(chǔ)系統(tǒng)具體實(shí)現(xiàn)上述方法中第一存儲(chǔ)節(jié)點(diǎn)、第二存儲(chǔ)節(jié)點(diǎn)、存儲(chǔ)客戶端以及分區(qū)視圖管理模塊的功能。所述功能可以通過(guò)硬件實(shí)現(xiàn),也可以通過(guò)硬件執(zhí)行相應(yīng)的軟件實(shí)現(xiàn)。所述硬件或軟件包括一個(gè)或多個(gè)與上述功能相對(duì)應(yīng)的模塊。
再一方面,本發(fā)明實(shí)施例提供了一種計(jì)算機(jī)存儲(chǔ)介質(zhì),用于儲(chǔ)存為第一存儲(chǔ)節(jié)點(diǎn)所用的計(jì)算機(jī)軟件指令,其包含用于執(zhí)行上述方面所設(shè)計(jì)的程序。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹。顯而易見(jiàn)地,下面附圖中反映的僅僅是本發(fā)明的一部分實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得本發(fā)明的其他實(shí)施方式。而所有這些實(shí)施例或?qū)嵤┓绞蕉荚诒景l(fā)明的保護(hù)范圍之內(nèi)。
圖1為實(shí)現(xiàn)本發(fā)明的一種可能的分布式存儲(chǔ)系統(tǒng)的結(jié)構(gòu)示意圖;
圖2為所示為本發(fā)明實(shí)施例提供的主存儲(chǔ)節(jié)點(diǎn)上存儲(chǔ)EC塊的結(jié)構(gòu)示意圖;
圖3為本發(fā)明實(shí)施例提供的一種日志塊的管理邏輯示意圖;
圖4為所示為本發(fā)明實(shí)施例提供的計(jì)算機(jī)設(shè)備示意圖;
圖5為本發(fā)明實(shí)施例提供的一種寫(xiě)數(shù)據(jù)的流程示意圖;
圖6為本發(fā)明實(shí)施例提供的一種邏輯卷存儲(chǔ)空間的等分示意圖;
圖7為本發(fā)明實(shí)施例提供的DHT哈希環(huán)的示意圖;
圖8為本發(fā)明實(shí)施例提供的一種故障節(jié)點(diǎn)恢復(fù)后的數(shù)據(jù)重建方法流程示意圖;
圖9為本發(fā)明實(shí)施例提供的一種存儲(chǔ)節(jié)點(diǎn)的結(jié)構(gòu)示意圖;
圖10為本發(fā)明實(shí)施例提供的一種分布式存儲(chǔ)系統(tǒng)的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將結(jié)合附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述。顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有付出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
本發(fā)明實(shí)施例描述的網(wǎng)絡(luò)架構(gòu)以及業(yè)務(wù)場(chǎng)景是為了更加清楚的說(shuō)明本發(fā)明實(shí)施例的技術(shù)方案,并不構(gòu)成對(duì)于本發(fā)明實(shí)施例提供的技術(shù)方案的限定,本領(lǐng)域普通技術(shù)人員可知,隨著網(wǎng)絡(luò)架構(gòu)的演變和新業(yè)務(wù)場(chǎng)景的出現(xiàn),本發(fā)明實(shí)施例提供的技術(shù)方案對(duì)于類似的技術(shù)問(wèn)題,同樣適用。
分布式存儲(chǔ)系統(tǒng)使用EC技術(shù)進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí),會(huì)根據(jù)待存儲(chǔ)的數(shù)據(jù)的大小生成一條或多條EC條帶,并將每個(gè)EC條帶的m個(gè)數(shù)據(jù)塊及k個(gè)校驗(yàn)塊分發(fā)給分布式存儲(chǔ)系統(tǒng)的m+k個(gè)存儲(chǔ)節(jié)點(diǎn)進(jìn)行存儲(chǔ),EC條帶中的每個(gè)數(shù)據(jù)塊或校驗(yàn)塊也可以稱為一個(gè)糾刪碼塊EC block。當(dāng)分布式存儲(chǔ)系統(tǒng)中有節(jié)點(diǎn)故障時(shí),只要故障節(jié)點(diǎn)的數(shù)量小于k,就可以根據(jù)非故障節(jié)點(diǎn)上的同一個(gè)EC條帶的EC塊將故障節(jié)點(diǎn)上存儲(chǔ)的EC塊恢復(fù)出來(lái)。恢復(fù)的方法為,首先獲取至少m個(gè)存儲(chǔ)節(jié)點(diǎn)上存儲(chǔ)的屬于同一個(gè)EC條帶的m個(gè)EC塊,針對(duì)m個(gè)EC塊中的數(shù)據(jù)執(zhí)行EC反編碼,即可將故障節(jié)點(diǎn)上的同一個(gè)EC條帶的EC塊恢復(fù)出來(lái)。因此,采用EC技術(shù)存儲(chǔ)數(shù)據(jù)的分布式存儲(chǔ)系統(tǒng)具有很高的可靠性。
但是,EC反編碼技術(shù)對(duì)分布式存儲(chǔ)系統(tǒng)的計(jì)算能力要求較高,且恢復(fù)故障節(jié)點(diǎn)上的1個(gè)EC塊的數(shù)據(jù)需要傳遞m個(gè)EC塊數(shù)據(jù),對(duì)網(wǎng)絡(luò)傳輸也造成了較大的負(fù)擔(dān)。為克服上述問(wèn)題,本發(fā)明實(shí)施例提供了一種分布式存儲(chǔ)系統(tǒng)中的數(shù)據(jù)重建的方法,當(dāng)出現(xiàn)存儲(chǔ)節(jié)點(diǎn)故障的時(shí)候,將本來(lái)要寫(xiě)入故障節(jié)點(diǎn)的EC塊臨時(shí)存儲(chǔ)到另一節(jié)點(diǎn)存儲(chǔ)(優(yōu)選的,存儲(chǔ)到主存儲(chǔ)節(jié)點(diǎn)上)。當(dāng)故障節(jié)點(diǎn)恢復(fù)后,將轉(zhuǎn)存到另一存儲(chǔ)節(jié)點(diǎn)的EC塊再重新寫(xiě)回到已恢復(fù)的故障節(jié)點(diǎn)上,從而實(shí)現(xiàn)該EC塊中的數(shù)據(jù)在故障節(jié)點(diǎn)上的數(shù)據(jù)重建。采用本申請(qǐng)?zhí)岢龅姆桨?,由于未進(jìn)行EC反編碼達(dá)到了節(jié)省計(jì)算資源的目的,同時(shí)數(shù)據(jù)重建僅需要將待重建的數(shù)據(jù)寫(xiě)回已恢復(fù)的故障節(jié)點(diǎn),降低了網(wǎng)絡(luò)傳輸?shù)膸捪摹T谝环N可能的實(shí)施方式中,由主存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)分配給故障節(jié)點(diǎn)的數(shù)據(jù),具體的,在主存儲(chǔ)節(jié)點(diǎn)上分配一塊空閑的存儲(chǔ)空間,當(dāng)某個(gè)存儲(chǔ)節(jié)點(diǎn)出現(xiàn)故障時(shí),將本來(lái)要寫(xiě)入故障節(jié)點(diǎn)的數(shù)據(jù)暫時(shí)存儲(chǔ)在主存儲(chǔ)節(jié)點(diǎn)上的上述空閑的存儲(chǔ)空間中。等故障的節(jié)點(diǎn)恢復(fù)時(shí),直接將主節(jié)點(diǎn)上保存的數(shù)據(jù)發(fā)送給故障節(jié)點(diǎn)。
如圖1所示,為本發(fā)明實(shí)施例提供的一種分布式存儲(chǔ)系統(tǒng)的結(jié)構(gòu)示意圖。分布式存儲(chǔ)系統(tǒng)中包括多個(gè)存儲(chǔ)節(jié)點(diǎn),多個(gè)存儲(chǔ)客戶端以及分區(qū)視圖(Partition View,PT View)管理模塊。存儲(chǔ)客戶端接收上層應(yīng)用發(fā)送的數(shù)據(jù)存儲(chǔ)請(qǐng)求,采用糾刪碼技術(shù),將待寫(xiě)入的數(shù)據(jù)存儲(chǔ)到多個(gè)存儲(chǔ)節(jié)點(diǎn)進(jìn)行冗余備份存儲(chǔ),圖1中的各組件的功能如下所述:
PT view管理模塊:可以部署在一臺(tái)服務(wù)器上,也部署在一臺(tái)存儲(chǔ)節(jié)點(diǎn)上。其主要功能包括:
1.監(jiān)控各存儲(chǔ)節(jié)點(diǎn)的狀態(tài)。具體的,PT view管理模塊與各存儲(chǔ)節(jié)點(diǎn)之間存在心跳連接,通過(guò)心跳連接監(jiān)控各存儲(chǔ)節(jié)點(diǎn)的狀態(tài):
存儲(chǔ)節(jié)點(diǎn)的狀態(tài)為正常,則表示存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)狀態(tài)正常,存儲(chǔ)節(jié)點(diǎn)未出現(xiàn)異常掉電或者在異常掉電后存儲(chǔ)節(jié)點(diǎn)已完成數(shù)據(jù)重建;存儲(chǔ)節(jié)點(diǎn)的狀態(tài)為故障,表示存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)狀態(tài)異常,存儲(chǔ)節(jié)點(diǎn)出現(xiàn)異常掉電,或者未完成數(shù)據(jù)重建,與其他存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)不同步。
2.生成及更新分區(qū)視圖:基于存儲(chǔ)節(jié)點(diǎn)狀態(tài)及個(gè)數(shù),根據(jù)Partition分區(qū)分配算法生成或更新分區(qū)視圖,每個(gè)分區(qū)對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn)包括一個(gè)主存儲(chǔ)節(jié)點(diǎn)以及若干備份存儲(chǔ)節(jié)點(diǎn),每個(gè)分區(qū)對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn)的總個(gè)數(shù)為EC條帶包含的EC塊的個(gè)數(shù),即為m+k。如下所示,為本發(fā)明實(shí)施例給出的PT view的示意圖,為每個(gè)分區(qū)分配m+k個(gè)存儲(chǔ)節(jié)點(diǎn),指定其中一個(gè)存儲(chǔ)節(jié)點(diǎn)為主存儲(chǔ)節(jié)點(diǎn),其他存儲(chǔ)節(jié)點(diǎn)為備份存儲(chǔ)節(jié)點(diǎn),分區(qū)視圖中包括各存儲(chǔ)節(jié)點(diǎn)當(dāng)前的狀態(tài)信息。
分區(qū)視圖可以由管理員進(jìn)行手動(dòng)設(shè)置,也可以由管理服務(wù)器進(jìn)行分配,只要盡可能離散地將各分區(qū)分配給各存儲(chǔ)節(jié)點(diǎn)即可,本發(fā)明實(shí)施例并不限定分區(qū)視圖的建立方式。
3.將分區(qū)視圖發(fā)布給各存儲(chǔ)客戶端及存儲(chǔ)節(jié)點(diǎn).
存儲(chǔ)客戶端:部署在服務(wù)器上的邏輯功能模塊。負(fù)責(zé)接收外部主機(jī)發(fā)送的數(shù)據(jù)存儲(chǔ)請(qǐng)求,并將數(shù)據(jù)存儲(chǔ)請(qǐng)求轉(zhuǎn)換成對(duì)存儲(chǔ)節(jié)點(diǎn)的鍵值對(duì)(key-Value)形式的IO請(qǐng)求;
存儲(chǔ)節(jié)點(diǎn):可以是物理存儲(chǔ)節(jié)點(diǎn),也可以是由物理存儲(chǔ)節(jié)點(diǎn)劃分的多個(gè)邏輯存儲(chǔ)節(jié)點(diǎn)。主要功能有:數(shù)據(jù)相關(guān)處理(例如,EC編碼),完成分布式事務(wù)(兩階段事務(wù))處理,并將IO最終轉(zhuǎn)換為對(duì)盤的讀寫(xiě)請(qǐng)求處理;
優(yōu)選的,在各分區(qū)的主存儲(chǔ)節(jié)點(diǎn)上需要分配一塊空閑的存儲(chǔ)空間,用于存放分配給寫(xiě)入失敗的故障存儲(chǔ)節(jié)點(diǎn)的EC塊的數(shù)據(jù),該空閑的存儲(chǔ)空間可以稱為日志卷。將日志卷的存儲(chǔ)空間劃分為若干個(gè)日志塊,每個(gè)日志塊的大小與EC塊的大小相同,每個(gè)日志塊對(duì)應(yīng)一個(gè)日志塊標(biāo)識(shí)(identity,ID)。日志塊在被分配使用的時(shí)候,會(huì)生成一個(gè)元數(shù)據(jù)信息,元數(shù)據(jù)信息中記錄了分區(qū)ID、寫(xiě)入該日志塊的數(shù)據(jù)的Key值、該數(shù)據(jù)的版本號(hào),以及該EC塊的塊內(nèi)數(shù)據(jù)偏移和塊內(nèi)數(shù)據(jù)長(zhǎng)度,進(jìn)一步的,元數(shù)據(jù)信息還可以包括該日志塊的ID。
在一種可能的實(shí)現(xiàn)方式中,可以采用空間隊(duì)列來(lái)管理空閑的日志塊,使用HashMap方式來(lái)管理已被使用的日志塊,Hash的鍵值為分區(qū)ID,這樣相同分區(qū)的日志塊放在一個(gè)隊(duì)列中。當(dāng)需要向日志卷寫(xiě)入新數(shù)據(jù)時(shí),首先在空閑塊列表中申請(qǐng)一個(gè)空閑的塊,根據(jù)待寫(xiě)入數(shù)據(jù)的分區(qū)ID插入到對(duì)應(yīng)的HashMap中。當(dāng)該日志塊使用完后,將該日志塊重新放回空閑塊列表中。
如圖1所示的存儲(chǔ)客戶端、存儲(chǔ)節(jié)點(diǎn)及分區(qū)視圖管理模塊可以采用硬件/軟件實(shí)現(xiàn),示例性的,如圖4所示,為本發(fā)明實(shí)施例提供的計(jì)算機(jī)設(shè)備示意圖。計(jì)算機(jī)設(shè)備200包括至少一個(gè)處理器201,通信總線202,存儲(chǔ)器203以及至少一個(gè)通信接口204。
處理器201可以是一個(gè)通用中央處理器(CPU),微處理器,特定應(yīng)用集成電路(application-specific integrated circuit,ASIC),或一個(gè)或多個(gè)用于控制本發(fā)明方案程序執(zhí)行的集成電路。
通信總線202可包括一通路,在上述組件之間傳送信息。所述通信接口304,使用任何收發(fā)器一類的裝置,用于與其他設(shè)備或通信網(wǎng)絡(luò)通信,如以太網(wǎng),無(wú)線接入網(wǎng)(RAN),無(wú)線局域網(wǎng)(Wireless Local Area Networks,WLAN)等。
存儲(chǔ)器203可以是只讀存儲(chǔ)器(read-only memory,ROM)或可存儲(chǔ)靜態(tài)信息和指令的其他類型的靜態(tài)存儲(chǔ)設(shè)備,隨機(jī)存取存儲(chǔ)器(random access memory,RAM)或者可存儲(chǔ)信息和指令的其他類型的動(dòng)態(tài)存儲(chǔ)設(shè)備,也可以是電可擦可編程只讀存儲(chǔ)器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、只讀光盤(Compact Disc Read-Only Memory,CD-ROM)或其他光盤存儲(chǔ)、光碟存儲(chǔ)(包括壓縮光碟、激光碟、光碟、數(shù)字通用光碟、藍(lán)光光碟等)、磁盤存儲(chǔ)介質(zhì)或者其他磁存儲(chǔ)設(shè)備、或者能夠用于攜帶或存儲(chǔ)具有指令或數(shù)據(jù)結(jié)構(gòu)形式的期望的程序代碼并能夠由計(jì)算機(jī)存取的任何其他介質(zhì),但不限于此。存儲(chǔ)器可以是獨(dú)立存在,通過(guò)總線與處理器相連接。存儲(chǔ)器也可以和處理器集成在一起。
其中,所述存儲(chǔ)器203用于存儲(chǔ)執(zhí)行本發(fā)明方案的應(yīng)用程序代碼,并由處理器201來(lái)控制執(zhí)行。所述處理器201用于執(zhí)行所述存儲(chǔ)器203中存儲(chǔ)的應(yīng)用程序代碼。
在具體實(shí)現(xiàn)中,作為一種實(shí)施例,處理器201可以包括一個(gè)或多個(gè)CPU,例如圖2中的CPU0和CPU1。
在具體實(shí)現(xiàn)中,作為一種實(shí)施例,計(jì)算機(jī)設(shè)備200可以包括多個(gè)處理器,例如圖2中的處理器201和處理器208。這些處理器中的每一個(gè)可以是一個(gè)單核(single-CPU)處理器,也可以是一個(gè)多核(multi-CPU)處理器。這里的處理器可以指一個(gè)或多個(gè)設(shè)備、電路、和/或用于處理數(shù)據(jù)(例如計(jì)算機(jī)程序指令)的處理核。
在具體實(shí)現(xiàn)中,作為一種實(shí)施例,計(jì)算機(jī)設(shè)備200還可以包括輸出設(shè)備205和輸入設(shè)備206。輸出設(shè)備205和處理器201通信,可以以多種方式來(lái)顯示信息。例如,輸出設(shè)備205可以是液晶顯示器(liquid crystal display,LCD),發(fā)光二級(jí)管(light emitting diode,LED)顯示設(shè)備,陰極射線管(cathode ray tube,CRT)顯示設(shè)備,或投影儀(projector)等。輸入設(shè)備206和處理器201通信,可以以多種方式接受用戶的輸入。例如,輸入設(shè)備206可以是鼠標(biāo)、鍵盤、觸摸屏設(shè)備或傳感設(shè)備等。
上述的計(jì)算機(jī)設(shè)備200可以是一個(gè)通用計(jì)算機(jī)設(shè)備或者是一個(gè)專用計(jì)算機(jī)設(shè)備。在具體實(shí)現(xiàn)中,計(jì)算機(jī)設(shè)備200可以是臺(tái)式機(jī)、便攜式電腦、網(wǎng)絡(luò)服務(wù)器、掌上電腦(Personal Digital Assistant,PDA)、移動(dòng)手機(jī)、平板電腦、無(wú)線終端設(shè)備、通信設(shè)備、嵌入式設(shè)備或有圖4中類似結(jié)構(gòu)的設(shè)備。本發(fā)明實(shí)施例不限定計(jì)算機(jī)設(shè)備200的類型。
圖1中的存儲(chǔ)客戶端、存儲(chǔ)節(jié)點(diǎn)及分區(qū)視圖管理模塊可以為圖4所示的設(shè)備,存儲(chǔ)器中存儲(chǔ)了一個(gè)或多個(gè)軟件模塊,用于實(shí)現(xiàn)存儲(chǔ)客戶端、存儲(chǔ)節(jié)點(diǎn)及分區(qū)視圖管理模塊的功能(例如:存儲(chǔ)節(jié)點(diǎn)的日志塊的存儲(chǔ)功能等)。存儲(chǔ)客戶端、存儲(chǔ)節(jié)點(diǎn)及分區(qū)視圖管理模塊可以通過(guò)處理器以及存儲(chǔ)器中的程序代碼來(lái)實(shí)現(xiàn)虛擬機(jī)間的應(yīng)用拓?fù)浒l(fā)現(xiàn)的方法。
需要說(shuō)明的是,圖4所示的計(jì)算機(jī)設(shè)備僅僅是給出了分布式存儲(chǔ)系統(tǒng)中各部分的可能的硬件實(shí)現(xiàn)方式,根據(jù)系統(tǒng)各部分功能的不同或者變化,可以對(duì)計(jì)算機(jī)設(shè)備的硬件組件進(jìn)行增刪,以使得與系統(tǒng)各部分的功能進(jìn)行匹配。
如圖5所示,為本發(fā)明實(shí)施例給出的一種存在故障節(jié)點(diǎn)時(shí)的寫(xiě)數(shù)據(jù)的流程示意圖,本發(fā)明實(shí)施例以m=2,k=1為例進(jìn)行說(shuō)明,此時(shí),針對(duì)每個(gè)EC條帶,存在3個(gè)EC塊,需要將3個(gè)EC塊分別存儲(chǔ)到3個(gè)存儲(chǔ)節(jié)點(diǎn)中,EC塊塊的大小假定為1M,示例性的,本發(fā)明實(shí)施例以存儲(chǔ)節(jié)點(diǎn)2的狀態(tài)為故障為例進(jìn)行說(shuō)明。
在本發(fā)明實(shí)施例中,針對(duì)邏輯卷的存儲(chǔ)空間,以m個(gè)EC塊的大小為粒度(下圖以m=2,EC塊塊大小為1M為例),將邏輯卷進(jìn)行等分,如下所示,為邏輯卷存儲(chǔ)空間的等分示意圖。從地址0開(kāi)始,等分后的邏輯卷的各個(gè)部分的數(shù)據(jù)偏移ID分別為0,1,2……n。
步驟501:存儲(chǔ)客戶端接收外部主機(jī)發(fā)送的存儲(chǔ)指令,所述存儲(chǔ)指令攜帶待存儲(chǔ)的數(shù)據(jù)的邏輯卷的卷標(biāo)識(shí)、數(shù)據(jù)偏移、數(shù)據(jù)長(zhǎng)度,以及待存儲(chǔ)的數(shù)據(jù),所述存儲(chǔ)客戶端根據(jù)待存儲(chǔ)的數(shù)據(jù)的數(shù)據(jù)偏移及數(shù)據(jù)長(zhǎng)度生成每次寫(xiě)入操作時(shí)需要寫(xiě)入的待寫(xiě)入數(shù)據(jù)的數(shù)據(jù)偏移ID。每次寫(xiě)入操作對(duì)應(yīng)的待寫(xiě)入數(shù)據(jù)對(duì)應(yīng)一個(gè)數(shù)據(jù)偏移ID。
進(jìn)一步的,所述存儲(chǔ)客戶端將所述邏輯卷的卷標(biāo)識(shí)與所述待寫(xiě)入數(shù)據(jù)的數(shù)據(jù)偏移ID合并,生成待寫(xiě)入的數(shù)據(jù)的key值。當(dāng)需要將待寫(xiě)入數(shù)據(jù)分成多次寫(xiě)入過(guò)程進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí),生成與每次寫(xiě)入過(guò)程的待寫(xiě)入數(shù)據(jù)對(duì)應(yīng)的key值。
具體的,存儲(chǔ)客戶端對(duì)接收到的帶存儲(chǔ)的數(shù)據(jù)進(jìn)行處理,劃分成多次寫(xiě)入對(duì)應(yīng)的待寫(xiě)入數(shù)據(jù)的過(guò)程如下:
示例性的,假如所述待存儲(chǔ)的數(shù)據(jù)的數(shù)據(jù)長(zhǎng)度為3M,數(shù)據(jù)偏移為2.5M,則待存儲(chǔ)的數(shù)據(jù)存儲(chǔ)的邏輯卷的地址范圍為2.5M至5.5M,該待存儲(chǔ)的數(shù)據(jù)將會(huì)落到等分后的邏輯卷的第2,3個(gè)部分,兩個(gè)部分分別對(duì)應(yīng)的數(shù)據(jù)偏移ID為1和2,數(shù)據(jù)偏移ID為1的存儲(chǔ)空間存儲(chǔ)的是地址范圍為2.5M至4M的第一段待寫(xiě)入數(shù)據(jù)、數(shù)據(jù)偏移為2的存儲(chǔ)空間存儲(chǔ)的是地址范圍為4M至5.5M的第二段待寫(xiě)入數(shù)據(jù)。此時(shí),存儲(chǔ)客戶端會(huì)將上述待存儲(chǔ)的數(shù)據(jù)分成上述兩段待寫(xiě)入的數(shù)據(jù),執(zhí)行兩次寫(xiě)入操作,將兩端待寫(xiě)入數(shù)據(jù)分兩次寫(xiě)入到存儲(chǔ)節(jié)點(diǎn)中。第一段待寫(xiě)入數(shù)據(jù)的key值為所述邏輯卷的卷標(biāo)識(shí)和數(shù)據(jù)偏移ID1合并生成的字符串;第二段待寫(xiě)入數(shù)據(jù)的key值為所述邏輯卷的卷標(biāo)識(shí)和數(shù)據(jù)偏移ID2合并生成的字符串,由此可以看出,待寫(xiě)入數(shù)據(jù)的key值是由待寫(xiě)入數(shù)據(jù)的地址范圍決定的,與待寫(xiě)入數(shù)據(jù)的具體內(nèi)容無(wú)關(guān)。
需要說(shuō)明的是,本發(fā)明實(shí)施例以寫(xiě)入第一段待寫(xiě)入數(shù)據(jù)為例進(jìn)行說(shuō)明,此時(shí),待寫(xiě)入數(shù)據(jù)的地址范圍為2.5M至4M。本領(lǐng)域技術(shù)人員可以理解的是,當(dāng)待存儲(chǔ)的數(shù)據(jù)分成多段數(shù)據(jù),需要分別執(zhí)行多次寫(xiě)入操作時(shí),多次寫(xiě)入的過(guò)程類似。鑒于不同寫(xiě)入過(guò)程中的待寫(xiě)入數(shù)據(jù)的數(shù)據(jù)偏移ID不同,所以不同寫(xiě)入過(guò)程中的待寫(xiě)入數(shù)據(jù)的key值不同,每次寫(xiě)入操作的待寫(xiě)入數(shù)據(jù)的數(shù)據(jù)偏移、數(shù)據(jù)長(zhǎng)度發(fā)生變化而已。
在本發(fā)明實(shí)施例中,待存儲(chǔ)數(shù)據(jù)為存儲(chǔ)客戶端從上層應(yīng)用或者外部主機(jī)接收到的存儲(chǔ)指令中所包含的待存儲(chǔ)的數(shù)據(jù);待寫(xiě)入數(shù)據(jù)為存儲(chǔ)客戶端在一次寫(xiě)入操作中寫(xiě)入到各存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù),一次寫(xiě)入過(guò)程中的待寫(xiě)入數(shù)據(jù)以一個(gè)EC條帶的形式寫(xiě)入到各存儲(chǔ)節(jié)點(diǎn)中。
步驟502:存儲(chǔ)客戶端計(jì)算所述待寫(xiě)入數(shù)據(jù)的key值的哈希值,確定計(jì)算得到的哈希值對(duì)應(yīng)的分區(qū)ID。
在一種可能的實(shí)施方式中,可以采用一致性哈希的方式計(jì)算待寫(xiě)入數(shù)據(jù)的key值對(duì)應(yīng)的分區(qū)ID。如圖5所示,為DHT哈希環(huán)的示例,在系統(tǒng)初始化的時(shí)候,會(huì)對(duì)[0,2^32-1]這個(gè)大范圍的整數(shù)區(qū)間進(jìn)行分段,分成多個(gè)區(qū)間大小相等的分區(qū)(partition),每個(gè)分區(qū)內(nèi)的Hash整數(shù)個(gè)數(shù)一樣,代表了相同長(zhǎng)度的Hash空間。根據(jù)待寫(xiě)入數(shù)據(jù)的key值的哈希值,確定該哈希值落到的分區(qū)的分區(qū)ID。
步驟503:存儲(chǔ)客戶端根據(jù)所述分區(qū)ID查詢分區(qū)視圖,確定處理所述待寫(xiě)入數(shù)據(jù)的主存儲(chǔ)節(jié)點(diǎn)。
分布式存儲(chǔ)系統(tǒng)中的分區(qū)視圖管理模塊會(huì)維護(hù)分區(qū)與存儲(chǔ)節(jié)點(diǎn)(存儲(chǔ)節(jié)點(diǎn)可以是物理節(jié)點(diǎn),也可以是由物理節(jié)點(diǎn)邏輯劃分的多個(gè)邏輯節(jié)點(diǎn))的對(duì)應(yīng)關(guān)系,該對(duì)應(yīng)關(guān)系即為分區(qū)視圖。
進(jìn)一步的,當(dāng)待存儲(chǔ)的數(shù)據(jù)較大,需要分成多個(gè)待寫(xiě)入的數(shù)據(jù)經(jīng)過(guò)多次寫(xiě)入過(guò)程寫(xiě)入到存儲(chǔ)節(jié)點(diǎn)時(shí),第一段待寫(xiě)入數(shù)據(jù)的數(shù)據(jù)偏移與待存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)偏移相同,后續(xù)各段待寫(xiě)入數(shù)據(jù)的數(shù)據(jù)偏移為0。當(dāng)待存儲(chǔ)數(shù)據(jù)可以在一次寫(xiě)入過(guò)程中寫(xiě)入時(shí),待寫(xiě)入數(shù)據(jù)的數(shù)據(jù)偏移即為待存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)偏移。
步驟504:存儲(chǔ)客戶端向主存儲(chǔ)節(jié)點(diǎn)發(fā)送寫(xiě)入請(qǐng)求,所述寫(xiě)入請(qǐng)求攜帶所述待寫(xiě)入數(shù)據(jù),以及所述待寫(xiě)入數(shù)據(jù)對(duì)應(yīng)的key值、數(shù)據(jù)偏移、數(shù)據(jù)長(zhǎng)度以及分區(qū)ID等等。
本發(fā)明實(shí)施例以存儲(chǔ)節(jié)點(diǎn)1為主存儲(chǔ)節(jié)點(diǎn),存儲(chǔ)節(jié)點(diǎn)2,3為備存儲(chǔ)節(jié)點(diǎn)為例進(jìn)行說(shuō)明。
步驟505:主存儲(chǔ)節(jié)點(diǎn)對(duì)待寫(xiě)入數(shù)據(jù)執(zhí)行EC編碼,生成m個(gè)數(shù)據(jù)塊以及k個(gè)校驗(yàn)塊,m+k個(gè)EC塊構(gòu)成一個(gè)EC條帶,由m+k個(gè)存儲(chǔ)節(jié)點(diǎn)分別進(jìn)行處理(包括主存儲(chǔ)節(jié)點(diǎn))。主存儲(chǔ)節(jié)點(diǎn)生成或刷新所述待寫(xiě)入數(shù)據(jù)的版本號(hào),并存儲(chǔ)key值與版本號(hào)的對(duì)應(yīng)關(guān)系。
具體的,主存儲(chǔ)節(jié)點(diǎn)將待寫(xiě)入數(shù)據(jù)以EC塊的粒度進(jìn)行切分,形成m個(gè)數(shù)據(jù)塊,執(zhí)行EC編碼,生成與m個(gè)數(shù)據(jù)塊對(duì)應(yīng)的k個(gè)校驗(yàn)塊。主存儲(chǔ)節(jié)點(diǎn)對(duì)所述待寫(xiě)入數(shù)據(jù)進(jìn)行上述處理,生成了m+k個(gè)EC塊。主存儲(chǔ)節(jié)點(diǎn)生成針對(duì)每個(gè)EC塊的數(shù)據(jù)偏移以及數(shù)據(jù)長(zhǎng)度。示例性的,待寫(xiě)入數(shù)據(jù)的地址范圍為2.5M至4M,EC塊的大小為1M,因此,待寫(xiě)入數(shù)據(jù)被劃分為2M-3M以及3M-4M這兩個(gè)EC塊。其中,第一個(gè)EC塊的塊內(nèi)數(shù)據(jù)偏移為0.5M,塊內(nèi)數(shù)據(jù)長(zhǎng)度為0.5M;第二個(gè)EC塊的塊內(nèi)數(shù)據(jù)偏移為0M,塊內(nèi)數(shù)據(jù)長(zhǎng)度為1M;校驗(yàn)塊的數(shù)據(jù)偏移為各個(gè)EC塊數(shù)據(jù)偏移的最小值,校驗(yàn)塊的數(shù)據(jù)長(zhǎng)度為各EC塊數(shù)據(jù)長(zhǎng)度的地址范圍的疊加,具體的,在本例中,k=1,即生成1個(gè)校驗(yàn)塊,此時(shí),校驗(yàn)塊的塊內(nèi)數(shù)據(jù)偏移為0,校驗(yàn)塊的數(shù)據(jù)長(zhǎng)度為1M。在一種可能的實(shí)施方式中,在主存儲(chǔ)節(jié)點(diǎn)記錄校驗(yàn)塊的塊內(nèi)數(shù)據(jù)偏移和塊內(nèi)數(shù)據(jù)長(zhǎng)度,在各備存儲(chǔ)節(jié)點(diǎn)以整個(gè)塊為粒度進(jìn)行校驗(yàn)塊的寫(xiě)入。
需要說(shuō)明的是,計(jì)算EC塊的塊內(nèi)數(shù)據(jù)偏移以及塊內(nèi)數(shù)據(jù)長(zhǎng)度可以采用現(xiàn)有技術(shù)中EC編碼的常用方式,本發(fā)明實(shí)施例對(duì)此并不進(jìn)行限定。
在一種可能的實(shí)施方式中,當(dāng)邏輯卷的存儲(chǔ)空間被第一次寫(xiě)入數(shù)據(jù)時(shí),此時(shí),在寫(xiě)入操作過(guò)程中,主存儲(chǔ)節(jié)點(diǎn)生成該存儲(chǔ)空間存儲(chǔ)的待寫(xiě)入數(shù)據(jù)的版本號(hào),當(dāng)該存儲(chǔ)空間中存儲(chǔ)的數(shù)據(jù)被刷新的過(guò)程中,主存儲(chǔ)節(jié)點(diǎn)刷新上述版本號(hào),可以采用每次刷新將版本號(hào)加1的方式。
步驟506:主存儲(chǔ)節(jié)點(diǎn)根據(jù)分區(qū)視圖確定該分區(qū)ID對(duì)應(yīng)的備存儲(chǔ)節(jié)點(diǎn),向備存儲(chǔ)節(jié)點(diǎn)發(fā)送寫(xiě)入請(qǐng)求,寫(xiě)入請(qǐng)求中攜帶待寫(xiě)入數(shù)據(jù)的key值和版本號(hào),以及分配給該備存儲(chǔ)節(jié)點(diǎn)的EC塊的數(shù)據(jù)內(nèi)容、塊內(nèi)數(shù)據(jù)偏移以及塊內(nèi)數(shù)據(jù)長(zhǎng)度。
在一種可能的實(shí)施方式中,所述寫(xiě)入請(qǐng)求可以使prepare請(qǐng)求。主存儲(chǔ)節(jié)點(diǎn)處理1個(gè)EC塊,將剩余的m+k-1個(gè)EC塊分別發(fā)送給分區(qū)視圖中與分區(qū)ID對(duì)應(yīng)的m+k-1個(gè)備存儲(chǔ)節(jié)點(diǎn)。主存儲(chǔ)節(jié)點(diǎn)分配EC塊可以采用隨機(jī)分配的方式或者按照存儲(chǔ)節(jié)點(diǎn)的標(biāo)識(shí)順序分配的方式,本發(fā)明實(shí)施例對(duì)此并不進(jìn)行限定。
步驟507:備存儲(chǔ)節(jié)點(diǎn)接收所述寫(xiě)入請(qǐng)求,根據(jù)所述寫(xiě)入請(qǐng)求將EC塊中的數(shù)據(jù)內(nèi)容按照寫(xiě)入到塊內(nèi)數(shù)據(jù)偏移以及塊內(nèi)數(shù)據(jù)長(zhǎng)度對(duì)應(yīng)的磁盤地址空間中,備存儲(chǔ)節(jié)點(diǎn)記錄待寫(xiě)入數(shù)據(jù)的key以及版本號(hào)。寫(xiě)入操作完成后,備存儲(chǔ)節(jié)點(diǎn)向主存儲(chǔ)節(jié)點(diǎn)返回寫(xiě)入成功響應(yīng)。如果備存儲(chǔ)節(jié)點(diǎn)發(fā)生故障導(dǎo)致寫(xiě)入失敗時(shí),備存儲(chǔ)節(jié)點(diǎn)向所述主存儲(chǔ)節(jié)點(diǎn)返回寫(xiě)入失敗響應(yīng)。
在一種可能的實(shí)施方式中,所述寫(xiě)入響應(yīng)為prepare log消息,其中攜帶成功或失敗的指示標(biāo)識(shí)。
在一種可能的實(shí)施方式中,主存儲(chǔ)節(jié)點(diǎn)可以根據(jù)分區(qū)視圖中存儲(chǔ)節(jié)點(diǎn)的狀態(tài)信息確定備存儲(chǔ)節(jié)點(diǎn)是否故障,如果備存儲(chǔ)節(jié)點(diǎn)故障,主存儲(chǔ)節(jié)點(diǎn)可以直接將分配給故障的備存儲(chǔ)節(jié)點(diǎn)的EC塊存儲(chǔ)在本地,不執(zhí)行步驟506和507。
步驟508:主存儲(chǔ)節(jié)點(diǎn)接收各備存儲(chǔ)節(jié)點(diǎn)返回的寫(xiě)入響應(yīng),當(dāng)確定寫(xiě)入成功的備存儲(chǔ)節(jié)點(diǎn)數(shù)量大于或等于m個(gè)時(shí),主存儲(chǔ)節(jié)點(diǎn)確定本次寫(xiě)入操作成功,存儲(chǔ)分配給寫(xiě)入失敗的備存儲(chǔ)節(jié)點(diǎn)的EC塊,生成元數(shù)據(jù)信息,所述元數(shù)據(jù)信息包括待寫(xiě)入數(shù)據(jù)的分區(qū)ID、key值和版本號(hào),以及寫(xiě)入失敗的EC blcok的塊內(nèi)數(shù)據(jù)偏移和塊內(nèi)數(shù)據(jù)長(zhǎng)度。
在一種可能的方式中,主存儲(chǔ)節(jié)點(diǎn)可以在接收到備存儲(chǔ)節(jié)點(diǎn)返回的寫(xiě)入成功響應(yīng)時(shí),確定發(fā)送該寫(xiě)入成功響應(yīng)的備存儲(chǔ)節(jié)點(diǎn)已經(jīng)成功的將待寫(xiě)入數(shù)據(jù)寫(xiě)入磁盤。另外,主存儲(chǔ)節(jié)點(diǎn)可以從分區(qū)視圖管理模塊接收節(jié)點(diǎn)狀態(tài)通知消息,確定故障節(jié)點(diǎn)寫(xiě)入失敗,或者,主存儲(chǔ)節(jié)點(diǎn)接收到寫(xiě)入失敗響應(yīng),確定發(fā)送寫(xiě)入失敗響應(yīng)的備存儲(chǔ)節(jié)點(diǎn)寫(xiě)入失敗。
元數(shù)據(jù)信息中:所述key值為步驟504中主存儲(chǔ)節(jié)點(diǎn)接收到的待寫(xiě)入數(shù)據(jù)的key值,版本號(hào)為步驟505中生成的與所述key值對(duì)應(yīng)的版本號(hào),塊內(nèi)數(shù)據(jù)偏移和塊內(nèi)數(shù)據(jù)長(zhǎng)度為步驟506中所述主存儲(chǔ)節(jié)點(diǎn)向?qū)懭胧〉膫浯鎯?chǔ)節(jié)點(diǎn)發(fā)送的寫(xiě)入請(qǐng)求中包含的,分區(qū)ID為步驟504中存儲(chǔ)客戶端向主存儲(chǔ)節(jié)點(diǎn)發(fā)送的所述待寫(xiě)入數(shù)據(jù)所屬的分區(qū)ID。
主存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)分配給寫(xiě)入失敗的備存儲(chǔ)節(jié)點(diǎn)的待寫(xiě)入數(shù)據(jù)的具體方式可以如圖3所示的方式。
在一種可能的實(shí)施方式中,當(dāng)寫(xiě)入失敗的備存儲(chǔ)節(jié)點(diǎn)的個(gè)數(shù)大于k個(gè)時(shí),主存儲(chǔ)節(jié)點(diǎn)確定寫(xiě)入失敗,向存儲(chǔ)客戶端返回寫(xiě)入失敗響應(yīng)。
步驟509:主存儲(chǔ)節(jié)點(diǎn)向?qū)懭氤晒Φ膫浯鎯?chǔ)節(jié)點(diǎn)返回確認(rèn)消息,向存儲(chǔ)客戶端返回寫(xiě)入成功響應(yīng)。
在一種可能的實(shí)施方式中,所述確認(rèn)消息具體為commit消息。
如圖8所示,本發(fā)明實(shí)施例還提供了一種故障節(jié)點(diǎn)恢復(fù)后的數(shù)據(jù)重建方法流程示意圖,包括:
步驟801:存儲(chǔ)節(jié)點(diǎn)2在故障恢復(fù)以后,從分區(qū)視圖管理模塊獲取分區(qū)視圖,所述分區(qū)視圖包括分區(qū)ID,以及與所述分區(qū)ID對(duì)應(yīng)的主存儲(chǔ)節(jié)點(diǎn)和備存儲(chǔ)節(jié)點(diǎn)。
分區(qū)視圖管理模塊在收到存儲(chǔ)節(jié)點(diǎn)2發(fā)送的分區(qū)視圖獲取請(qǐng)求時(shí),將與所述存儲(chǔ)節(jié)點(diǎn)2相關(guān)分區(qū)的分區(qū)視圖返回給所述存儲(chǔ)節(jié)點(diǎn)2。與所述存儲(chǔ)節(jié)點(diǎn)2相關(guān)的分區(qū)為:主存儲(chǔ)節(jié)點(diǎn)或備存儲(chǔ)節(jié)點(diǎn)為存儲(chǔ)節(jié)點(diǎn)2的分區(qū)。
在一種可能的實(shí)施方式中,當(dāng)存儲(chǔ)節(jié)點(diǎn)故障時(shí),該故障節(jié)點(diǎn)可能是某些分區(qū)ID對(duì)應(yīng)的主存儲(chǔ)節(jié)點(diǎn),此時(shí),分布式存儲(chǔ)系統(tǒng)的管理模塊會(huì)將該故障節(jié)點(diǎn)降格為備存儲(chǔ)節(jié)點(diǎn),并刷新分區(qū)視圖。
在一種可能的實(shí)施方式中,故障節(jié)點(diǎn)可能對(duì)應(yīng)于多個(gè)分區(qū)ID,為多個(gè)分區(qū)ID的備存儲(chǔ)節(jié)點(diǎn),故障節(jié)點(diǎn)以分區(qū)為粒度進(jìn)行數(shù)據(jù)重建,本發(fā)明實(shí)施例以重建故障節(jié)點(diǎn)上一個(gè)分區(qū)的數(shù)據(jù)為例進(jìn)行說(shuō)明。存儲(chǔ)節(jié)點(diǎn)2向分區(qū)ID對(duì)應(yīng)的主存儲(chǔ)節(jié)點(diǎn)請(qǐng)求同步數(shù)據(jù),本領(lǐng)域技術(shù)人員可以理解的是,當(dāng)存儲(chǔ)節(jié)點(diǎn)上有多個(gè)分區(qū)的數(shù)據(jù)需要同步時(shí),可以分別向各個(gè)分區(qū)ID對(duì)應(yīng)的主存儲(chǔ)節(jié)點(diǎn)請(qǐng)求同步數(shù)據(jù)。
步驟802:存儲(chǔ)節(jié)點(diǎn)2向主存儲(chǔ)節(jié)點(diǎn)發(fā)送數(shù)據(jù)同步請(qǐng)求,所述數(shù)據(jù)同步請(qǐng)求攜帶分區(qū)ID、key值以及與所述key值對(duì)應(yīng)的版本號(hào);
需要說(shuō)明的是,在一種可能的實(shí)施方式中,存儲(chǔ)節(jié)點(diǎn)2可以先向主存儲(chǔ)節(jié)點(diǎn)發(fā)送分區(qū)ID,主存儲(chǔ)節(jié)點(diǎn)接收到分區(qū)ID后,再?gòu)拇鎯?chǔ)節(jié)點(diǎn)2獲取該分區(qū)ID下的所有key值以及各key值對(duì)應(yīng)的版本號(hào)。本領(lǐng)域技術(shù)人員可以理解的是,也可以分多次重建一個(gè)分區(qū)下的數(shù)據(jù),本發(fā)明實(shí)施例對(duì)此并不進(jìn)行限定。
步驟803:主存儲(chǔ)節(jié)點(diǎn)將本節(jié)點(diǎn)記錄的所述分區(qū)ID對(duì)應(yīng)的各key值以及各key值對(duì)應(yīng)的版本號(hào),與所述存儲(chǔ)節(jié)點(diǎn)2上報(bào)的所述分區(qū)ID對(duì)應(yīng)的所有key值以及與所述所有key值對(duì)應(yīng)的版本號(hào)進(jìn)行比對(duì):
情況一、當(dāng)主存儲(chǔ)節(jié)點(diǎn)上記錄的所述分區(qū)ID對(duì)應(yīng)的key值不包含在所述存儲(chǔ)節(jié)點(diǎn)2上報(bào)的所述分區(qū)ID對(duì)應(yīng)的key值中時(shí),說(shuō)明在存儲(chǔ)節(jié)點(diǎn)2故障期間,有新的數(shù)據(jù)(與未包含的key值對(duì)應(yīng))寫(xiě)入,主存儲(chǔ)節(jié)點(diǎn)已成功寫(xiě)入該新的數(shù)據(jù)對(duì)應(yīng)的EC塊,但由于存儲(chǔ)節(jié)點(diǎn)2故障,分配給存儲(chǔ)節(jié)點(diǎn)2的EC塊暫時(shí)存儲(chǔ)在主存儲(chǔ)節(jié)點(diǎn)上,因此,該key值對(duì)應(yīng)的數(shù)據(jù)(具體是分配給存儲(chǔ)節(jié)點(diǎn)2的EC塊)未寫(xiě)入到存儲(chǔ)節(jié)點(diǎn)2中,所述主存儲(chǔ)節(jié)點(diǎn)將所述分配給存儲(chǔ)節(jié)點(diǎn)2的EC塊以及元數(shù)據(jù)信息發(fā)送給所述存儲(chǔ)節(jié)點(diǎn)2,存儲(chǔ)節(jié)點(diǎn)2重建所述key值對(duì)應(yīng)的數(shù)據(jù);
情況二、所述key值對(duì)應(yīng)的版本號(hào)與存儲(chǔ)節(jié)點(diǎn)2上報(bào)的所述key值對(duì)應(yīng)的版本號(hào),當(dāng)版本號(hào)一致時(shí),則說(shuō)明存儲(chǔ)節(jié)點(diǎn)2上所述key值對(duì)應(yīng)的數(shù)據(jù)無(wú)需更新,即在存儲(chǔ)節(jié)點(diǎn)2故障期間,所述key值對(duì)應(yīng)的數(shù)據(jù)沒(méi)有發(fā)生更新,版本號(hào)沒(méi)有發(fā)生變化;
情況三、當(dāng)主存儲(chǔ)節(jié)點(diǎn)未查詢到所述key值時(shí),說(shuō)明主存儲(chǔ)節(jié)點(diǎn)上的所述key值對(duì)應(yīng)的數(shù)據(jù)已經(jīng)被刪除,所述主存儲(chǔ)節(jié)點(diǎn)通知所述存儲(chǔ)節(jié)點(diǎn)2刪除所述key值對(duì)應(yīng)的數(shù)據(jù);
情況四、當(dāng)主存儲(chǔ)節(jié)點(diǎn)上的所述key值對(duì)應(yīng)的版本號(hào)大于所述存儲(chǔ)節(jié)點(diǎn)2上報(bào)的key值對(duì)應(yīng)的版本號(hào)時(shí),說(shuō)明存儲(chǔ)節(jié)點(diǎn)2在故障期間,所述key值對(duì)應(yīng)的數(shù)據(jù)發(fā)生了更新,所述主存儲(chǔ)節(jié)點(diǎn)將所述key值對(duì)應(yīng)的數(shù)據(jù)(具體是分配給存儲(chǔ)節(jié)點(diǎn)2的EC塊)以及元數(shù)據(jù)信息發(fā)送給所述存儲(chǔ)節(jié)點(diǎn)2,存儲(chǔ)節(jié)點(diǎn)2重建所述key值對(duì)應(yīng)的數(shù)據(jù);
在情況一和情況四,需要進(jìn)行數(shù)據(jù)重建,數(shù)據(jù)重建的具體過(guò)程包括:
步驟804:主存儲(chǔ)節(jié)點(diǎn)根據(jù)所述分區(qū)ID和待重建的數(shù)據(jù)對(duì)應(yīng)的key值,查找元數(shù)據(jù)信息,確定待重建的EC塊對(duì)應(yīng)的日志卷以及元數(shù)據(jù)信息,所述主存儲(chǔ)節(jié)點(diǎn)將日志卷中記錄的待重建的EC塊以及元數(shù)據(jù)信息中包含的塊內(nèi)數(shù)據(jù)偏移、塊內(nèi)數(shù)據(jù)長(zhǎng)度以及版本號(hào)發(fā)送給存儲(chǔ)節(jié)點(diǎn)2。
步驟805:存儲(chǔ)節(jié)點(diǎn)2進(jìn)行數(shù)據(jù)重建,根據(jù)所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)的EC塊的塊內(nèi)數(shù)據(jù)偏移和塊內(nèi)數(shù)據(jù)長(zhǎng)度,將所述EC塊的數(shù)據(jù)寫(xiě)入到磁盤中,更新所述待寫(xiě)入數(shù)據(jù)的key值對(duì)應(yīng)的版本號(hào)。。數(shù)據(jù)重建完成后,向所述主存儲(chǔ)節(jié)點(diǎn)返回?cái)?shù)據(jù)重建成功消息。
步驟806:主存儲(chǔ)節(jié)點(diǎn)刪除已完成重建的數(shù)據(jù)的日志卷和元數(shù)據(jù)信息,所述主存儲(chǔ)節(jié)點(diǎn)回收所述日志卷,放入空閑隊(duì)列。
在一種可能的實(shí)施方式中,當(dāng)存儲(chǔ)節(jié)點(diǎn)2正在進(jìn)行數(shù)據(jù)重建時(shí),如果數(shù)據(jù)恢復(fù)過(guò)程中,有新的寫(xiě)請(qǐng)求要寫(xiě)入到正在恢復(fù)的故障節(jié)點(diǎn),當(dāng)寫(xiě)的位置時(shí)已經(jīng)恢復(fù)完成的,則可以直接寫(xiě);如果還沒(méi)恢復(fù)或正在恢復(fù)的位置,則等待,等數(shù)據(jù)恢復(fù)完以后再寫(xiě)。
本申請(qǐng)?zhí)峁┝艘环N分布式存儲(chǔ)系統(tǒng)中的數(shù)據(jù)重建的方法、裝置和系統(tǒng),分布式存儲(chǔ)系統(tǒng)中的主存儲(chǔ)節(jié)點(diǎn)對(duì)待寫(xiě)入數(shù)據(jù)進(jìn)行EC編碼,生成EC條帶,將EC條帶中的各個(gè)EC塊分別存儲(chǔ)在各個(gè)存儲(chǔ)節(jié)點(diǎn)上,當(dāng)部分存儲(chǔ)節(jié)點(diǎn)由于故障導(dǎo)致寫(xiě)入EC塊失敗時(shí),主存儲(chǔ)節(jié)點(diǎn)將分配給寫(xiě)入失敗的存儲(chǔ)節(jié)點(diǎn)的EC塊存儲(chǔ)在本地,并生成數(shù)據(jù)重建所需的元數(shù)據(jù)信息,當(dāng)存儲(chǔ)節(jié)點(diǎn)故障恢復(fù)后,主存儲(chǔ)節(jié)點(diǎn)將存儲(chǔ)的分配給寫(xiě)入失敗的存儲(chǔ)節(jié)點(diǎn)的EC塊以及該EC塊對(duì)應(yīng)的元數(shù)據(jù)信息重新發(fā)送給該存儲(chǔ)節(jié)點(diǎn),以使得故障恢復(fù)后的該存儲(chǔ)節(jié)點(diǎn)完成數(shù)據(jù)重建。本申請(qǐng)?zhí)峁┑姆植际酱鎯?chǔ)系統(tǒng)中的數(shù)據(jù)重建的方案,當(dāng)部分存儲(chǔ)節(jié)點(diǎn)故障時(shí),無(wú)需執(zhí)行EC反編碼以恢復(fù)故障節(jié)點(diǎn)上的數(shù)據(jù),而是由主存儲(chǔ)節(jié)點(diǎn)緩存分配給故障節(jié)點(diǎn)的EC塊,再故障節(jié)點(diǎn)恢復(fù)后再將緩存的EC塊重新發(fā)送給故障節(jié)點(diǎn)進(jìn)行數(shù)據(jù)重建。通過(guò)上述方案,避免了存儲(chǔ)節(jié)點(diǎn)故障時(shí)執(zhí)行EC反編碼帶來(lái)的計(jì)算資源消耗,同時(shí)也避免了執(zhí)行EC反編碼時(shí)傳遞大量數(shù)據(jù)帶來(lái)的網(wǎng)絡(luò)資源消耗。示例性的,當(dāng)EC編碼為4+2時(shí),恢復(fù)1份數(shù)據(jù)需要4份數(shù)據(jù),而本申請(qǐng)中,只是在故障節(jié)點(diǎn)恢復(fù)后,由主存儲(chǔ)節(jié)點(diǎn)向故障節(jié)點(diǎn)重新發(fā)送1份數(shù)據(jù),明顯降低了網(wǎng)絡(luò)資源消耗;進(jìn)一步的,分布式存儲(chǔ)系統(tǒng)中,丟失1份數(shù)據(jù)的概率遠(yuǎn)遠(yuǎn)大于丟失兩份數(shù)據(jù),而丟失1份數(shù)據(jù)時(shí),仍然可以還原出原始數(shù)據(jù),因此,無(wú)需立刻執(zhí)行EC反編碼將丟失的數(shù)據(jù)還原,當(dāng)故障節(jié)點(diǎn)恢復(fù)后,采用本申請(qǐng)?zhí)岢龅臄?shù)據(jù)重建的方案即可將故障節(jié)點(diǎn)上的數(shù)據(jù)與其他存儲(chǔ)節(jié)點(diǎn)進(jìn)行同步。
如前述分布式存儲(chǔ)系統(tǒng)中數(shù)據(jù)重建的方法實(shí)施例相對(duì)應(yīng),如圖9所示,本發(fā)明實(shí)施例還提供了一種存儲(chǔ)節(jié)點(diǎn),所述存儲(chǔ)節(jié)點(diǎn)包括:
獲取單元901,用于獲取待寫(xiě)入數(shù)據(jù)以及所述待寫(xiě)入數(shù)據(jù)的key值,刷新所述key值對(duì)應(yīng)的版本號(hào),對(duì)所述待寫(xiě)入數(shù)據(jù)進(jìn)行EC編碼,生成EC條帶,所述EC條帶包括m+k個(gè)EC塊,其中m個(gè)EC塊為數(shù)據(jù)塊,k個(gè)EC塊為校驗(yàn)塊,m為大于等于2的正整數(shù),k為自然數(shù);
處理單元902,用于查詢分區(qū)視圖,確定所述待寫(xiě)入數(shù)據(jù)所在的分區(qū)對(duì)應(yīng)的備存儲(chǔ)節(jié)點(diǎn),其中,所述第一存儲(chǔ)節(jié)點(diǎn)為所述分區(qū)對(duì)應(yīng)的主存儲(chǔ)節(jié)點(diǎn),第二存儲(chǔ)節(jié)點(diǎn)為所述分區(qū)對(duì)應(yīng)的其中一個(gè)備存儲(chǔ)節(jié)點(diǎn);
發(fā)送單元903,用于向各備存儲(chǔ)節(jié)點(diǎn)分別發(fā)送寫(xiě)入請(qǐng)求,所述寫(xiě)入請(qǐng)求攜帶所述待寫(xiě)入數(shù)據(jù)所在的分區(qū)的分區(qū)ID、所述待寫(xiě)入數(shù)據(jù)的key值和版本號(hào),以及分配給各備存儲(chǔ)節(jié)點(diǎn)的EC塊的數(shù)據(jù);
所述處理單元902,用于確定所述第二存儲(chǔ)節(jié)點(diǎn)寫(xiě)入失敗時(shí),存儲(chǔ)所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)的EC塊的數(shù)據(jù),生成與所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)的EC塊對(duì)應(yīng)的元數(shù)據(jù)信息,所述元數(shù)據(jù)信息包括所述待寫(xiě)入數(shù)據(jù)所在的分區(qū)的分區(qū)ID、所述待寫(xiě)入數(shù)據(jù)的key值和版本號(hào);
當(dāng)所述第二存儲(chǔ)節(jié)點(diǎn)故障恢復(fù)后,所述發(fā)送單元903,還用于將存儲(chǔ)的所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)的EC塊的數(shù)據(jù)以及所述元數(shù)據(jù)信息發(fā)送給所述第二存儲(chǔ)節(jié)點(diǎn),以使得所述第二存儲(chǔ)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)重建。
進(jìn)一步的,所述處理單元902,還用于確定寫(xiě)入成功的存儲(chǔ)節(jié)點(diǎn)的數(shù)量大于等于m。
所述獲取單元901,還用于接收所述第二存儲(chǔ)節(jié)點(diǎn)發(fā)送的數(shù)據(jù)同步請(qǐng)求,所述數(shù)據(jù)同步請(qǐng)求中攜帶所述分區(qū)ID,從所述第二存儲(chǔ)節(jié)點(diǎn)獲取所述第二存儲(chǔ)節(jié)點(diǎn)中記錄的所述分區(qū)ID對(duì)應(yīng)的一個(gè)或多個(gè)key值,以及與所述key值的版本號(hào);
所述處理單元902,還用于將自身記錄的所述分區(qū)ID對(duì)應(yīng)的key值以及各key值的版本號(hào),與從所述第二存儲(chǔ)節(jié)點(diǎn)獲取的所述分區(qū)ID對(duì)應(yīng)的一個(gè)或多個(gè)key值,以及與所述key值的版本號(hào),進(jìn)行比對(duì),根據(jù)比對(duì)結(jié)果確定需要進(jìn)行數(shù)據(jù)重建;
所述發(fā)送單元903,具體用于根據(jù)所述元數(shù)據(jù)信息,將存儲(chǔ)的需要進(jìn)行數(shù)據(jù)重建的key值對(duì)應(yīng)的EC塊的數(shù)據(jù)以及所述EC塊的元數(shù)據(jù)信息發(fā)送給所述第二存儲(chǔ)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)重建。
所述處理單元902,具體用于執(zhí)行以下至少一種比對(duì)處理:
當(dāng)本存儲(chǔ)節(jié)點(diǎn)記錄的key值對(duì)應(yīng)的版本號(hào)與從所述第二存儲(chǔ)節(jié)點(diǎn)獲取的所述key值對(duì)應(yīng)的版本號(hào)一致時(shí),無(wú)需進(jìn)行數(shù)據(jù)重建;
當(dāng)本存儲(chǔ)節(jié)點(diǎn)記錄的key值中不包含從所述第二存儲(chǔ)節(jié)點(diǎn)獲取的key值時(shí),則通知所述第二存儲(chǔ)節(jié)點(diǎn)刪除所述本存儲(chǔ)節(jié)點(diǎn)不包含的所述key值對(duì)應(yīng)的數(shù)據(jù);
當(dāng)所述本存儲(chǔ)節(jié)點(diǎn)記錄的key值對(duì)應(yīng)的版本號(hào)大于從所述第二存儲(chǔ)節(jié)點(diǎn)獲取的所述key值對(duì)應(yīng)的版本號(hào)時(shí),執(zhí)行數(shù)據(jù)重建操作;或,
當(dāng)所述本存儲(chǔ)節(jié)點(diǎn)記錄的key值中不包含在從所述第二存儲(chǔ)節(jié)點(diǎn)獲取的key值中時(shí),則通知所述第二存儲(chǔ)節(jié)點(diǎn)重建所述第二存儲(chǔ)節(jié)點(diǎn)不包含的所述key值對(duì)應(yīng)的數(shù)據(jù)。
所述處理單元902,還用于以m個(gè)EC塊的大小為粒度將所述邏輯卷的存儲(chǔ)地址進(jìn)行等分,得到多個(gè)存儲(chǔ)單元,為所述多個(gè)存儲(chǔ)單元分配數(shù)據(jù)偏移標(biāo)識(shí)。
所述獲取單元901,具體用于使用一致性哈希算法計(jì)算所述待寫(xiě)入數(shù)據(jù)的key值對(duì)應(yīng)的哈希值,確定所述哈希值所屬的分區(qū)的分區(qū)ID;或者,
所述獲取單元901,具體用于從存儲(chǔ)客戶端發(fā)送的寫(xiě)入請(qǐng)求中獲取所述待寫(xiě)入數(shù)據(jù)對(duì)應(yīng)的分區(qū)的分區(qū)ID。
所述獲取單元901,還用于接收所述第二存儲(chǔ)節(jié)點(diǎn)返回的寫(xiě)入失敗響應(yīng),確定所述第二存儲(chǔ)節(jié)點(diǎn)寫(xiě)入失?。换蛘?,
所述獲取單元901,還用于根據(jù)所述分區(qū)視圖,確定所述第二存儲(chǔ)節(jié)點(diǎn)的狀態(tài)為故障,其中,所述分區(qū)視圖中包含存儲(chǔ)節(jié)點(diǎn)的狀態(tài)信息。
所述處理單元902,具體用于分配空閑的存儲(chǔ)空間作為日志卷,用于存儲(chǔ)分配給寫(xiě)入失敗的存儲(chǔ)節(jié)點(diǎn)的EC塊,所述日志卷由至少一個(gè)日志塊組成,所述日志塊的大小與所述EC塊的大小相同。
如圖10所示,本發(fā)明實(shí)施例還提供了一種分布式存儲(chǔ)系統(tǒng),包括第一存儲(chǔ)節(jié)點(diǎn)1001和第二存儲(chǔ)節(jié)點(diǎn)1002,
所述第一存儲(chǔ)節(jié)點(diǎn)1001,用于獲取待寫(xiě)入數(shù)據(jù)以及所述待寫(xiě)入數(shù)據(jù)的鍵key值,刷新所述key值對(duì)應(yīng)的版本號(hào),對(duì)所述待寫(xiě)入數(shù)據(jù)進(jìn)行糾刪碼EC編碼,生成EC條帶,所述EC條帶包括m+k個(gè)EC塊,其中m個(gè)EC塊為數(shù)據(jù)塊,k個(gè)EC塊為校驗(yàn)塊,m為大于等于2的正整數(shù),k為自然數(shù);
所述第一存儲(chǔ)節(jié)點(diǎn)1001,還用于查詢分區(qū)視圖,確定所述待寫(xiě)入數(shù)據(jù)所在的分區(qū)對(duì)應(yīng)的備存儲(chǔ)節(jié)點(diǎn),其中,所述第一存儲(chǔ)節(jié)點(diǎn)1001為所述分區(qū)對(duì)應(yīng)的主存儲(chǔ)節(jié)點(diǎn),第二存儲(chǔ)節(jié)點(diǎn)1002為所述分區(qū)對(duì)應(yīng)的其中一個(gè)備存儲(chǔ)節(jié)點(diǎn);
所述第一存儲(chǔ)節(jié)點(diǎn)1001,還用于向各備存儲(chǔ)節(jié)點(diǎn)發(fā)送寫(xiě)入請(qǐng)求,所述寫(xiě)入請(qǐng)求攜帶所述待寫(xiě)入數(shù)據(jù)所在的分區(qū)的分區(qū)ID、所述待寫(xiě)入數(shù)據(jù)的key值和版本號(hào),以及分配給各備存儲(chǔ)節(jié)點(diǎn)的EC塊的數(shù)據(jù);
當(dāng)所述第二存儲(chǔ)節(jié)點(diǎn)1002寫(xiě)入失敗時(shí),所述第一存儲(chǔ)節(jié)點(diǎn)1001,還用于存儲(chǔ)所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)1002的EC塊的數(shù)據(jù),生成與所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)1002的EC塊對(duì)應(yīng)的元數(shù)據(jù)信息,所述元數(shù)據(jù)信息包括所述待寫(xiě)入數(shù)據(jù)所在的分區(qū)的分區(qū)ID、所述待寫(xiě)入數(shù)據(jù)的key值和版本號(hào);
當(dāng)所述第二存儲(chǔ)節(jié)點(diǎn)1002故障恢復(fù)后,所述第一存儲(chǔ)節(jié)點(diǎn)1001,還用于將存儲(chǔ)的所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)1002的EC塊的數(shù)據(jù)以及所述元數(shù)據(jù)信息發(fā)送給所述第二存儲(chǔ)節(jié)點(diǎn)1002;
所述第二存儲(chǔ)節(jié)點(diǎn)1002,用于根據(jù)所述元數(shù)據(jù)信息寫(xiě)入所述分配給所述第二存儲(chǔ)節(jié)點(diǎn)1002的EC塊的數(shù)據(jù)。
分布式存儲(chǔ)系統(tǒng)中的主存儲(chǔ)節(jié)點(diǎn)對(duì)待寫(xiě)入數(shù)據(jù)進(jìn)行EC編碼,生成EC條帶,將EC條帶中的各個(gè)EC塊分別存儲(chǔ)在各個(gè)存儲(chǔ)節(jié)點(diǎn)上,當(dāng)部分存儲(chǔ)節(jié)點(diǎn)由于故障導(dǎo)致寫(xiě)入EC塊失敗時(shí),主存儲(chǔ)節(jié)點(diǎn)將分配給寫(xiě)入失敗的存儲(chǔ)節(jié)點(diǎn)的EC塊存儲(chǔ)在本地,并生成數(shù)據(jù)重建所需的元數(shù)據(jù)信息,當(dāng)存儲(chǔ)節(jié)點(diǎn)故障恢復(fù)后,主存儲(chǔ)節(jié)點(diǎn)將存儲(chǔ)的分配給寫(xiě)入失敗的存儲(chǔ)節(jié)點(diǎn)的EC塊以及該EC塊對(duì)應(yīng)的元數(shù)據(jù)信息重新發(fā)送給該存儲(chǔ)節(jié)點(diǎn),以使得故障恢復(fù)后的該存儲(chǔ)節(jié)點(diǎn)完成數(shù)據(jù)重建。本申請(qǐng)?zhí)峁┑姆植际酱鎯?chǔ)系統(tǒng)中的數(shù)據(jù)重建的方案,當(dāng)部分存儲(chǔ)節(jié)點(diǎn)故障時(shí),無(wú)需執(zhí)行EC反編碼以恢復(fù)故障節(jié)點(diǎn)上的數(shù)據(jù),而是由主存儲(chǔ)節(jié)點(diǎn)緩存分配給故障節(jié)點(diǎn)的EC塊,再故障節(jié)點(diǎn)恢復(fù)后再將緩存的EC塊重新發(fā)送給故障節(jié)點(diǎn)進(jìn)行數(shù)據(jù)重建。通過(guò)上述方案,避免了存儲(chǔ)節(jié)點(diǎn)故障恢復(fù)進(jìn)行數(shù)據(jù)重建時(shí)執(zhí)行EC反編碼帶來(lái)的計(jì)算資源消耗,同時(shí)也避免了執(zhí)行EC反編碼時(shí)傳遞大量數(shù)據(jù)帶來(lái)的網(wǎng)絡(luò)資源消耗。示例性的,當(dāng)EC編碼為4+2時(shí),恢復(fù)1份數(shù)據(jù)需要4份數(shù)據(jù),而本申請(qǐng)中,只是在故障節(jié)點(diǎn)恢復(fù)后,由主存儲(chǔ)節(jié)點(diǎn)向故障節(jié)點(diǎn)重新發(fā)送1份數(shù)據(jù),明顯降低了網(wǎng)絡(luò)資源消耗;進(jìn)一步的,分布式存儲(chǔ)系統(tǒng)中,丟失1份數(shù)據(jù)的概率遠(yuǎn)遠(yuǎn)大于丟失兩份數(shù)據(jù),而丟失1份數(shù)據(jù)時(shí),仍然可以還原出原始數(shù)據(jù),因此,無(wú)需立刻執(zhí)行EC反編碼將丟失的數(shù)據(jù)還原,當(dāng)故障節(jié)點(diǎn)恢復(fù)后,采用本申請(qǐng)?zhí)岢龅臄?shù)據(jù)重建的方案即可將故障節(jié)點(diǎn)上的數(shù)據(jù)與其他存儲(chǔ)節(jié)點(diǎn)進(jìn)行同步。
在圖9和10對(duì)應(yīng)的實(shí)施例中,存儲(chǔ)節(jié)點(diǎn)是以功能單元/功能模塊的形式來(lái)呈現(xiàn)。這里的“單元/模塊”可以指特定應(yīng)用集成電路(application-specific integrated circuit,ASIC),電路,執(zhí)行一個(gè)或多個(gè)軟件或固件程序的處理器和存儲(chǔ)器,集成邏輯電路,和/或其他可以提供上述功能的器件。在一個(gè)簡(jiǎn)單的實(shí)施例中,本領(lǐng)域的技術(shù)人員可以想到存儲(chǔ)節(jié)點(diǎn)可以采用圖2所示的形式。例如,獲取單元901、處理單元902或發(fā)送單元903可以通過(guò)圖2的處理器和存儲(chǔ)器來(lái)實(shí)現(xiàn)。
本發(fā)明實(shí)施例還提供了一種計(jì)算機(jī)存儲(chǔ)介質(zhì),用于儲(chǔ)存為上述圖9和10所示的設(shè)備所用的計(jì)算機(jī)軟件指令,其包含用于執(zhí)行上述方法實(shí)施例所設(shè)計(jì)的程序。通過(guò)執(zhí)行存儲(chǔ)的程序,可以實(shí)現(xiàn)應(yīng)用分布式存儲(chǔ)系統(tǒng)中數(shù)據(jù)重建的方法。
盡管在此結(jié)合各實(shí)施例對(duì)本發(fā)明進(jìn)行了描述,然而,在實(shí)施所要求保護(hù)的本發(fā)明過(guò)程中,本領(lǐng)域技術(shù)人員通過(guò)查看所述附圖、公開(kāi)內(nèi)容、以及所附權(quán)利要求書(shū),可理解并實(shí)現(xiàn)所述公開(kāi)實(shí)施例的其他變化。在權(quán)利要求中,“包括”(comprising)一詞不排除其他組成部分或步驟,“一”或“一個(gè)”不排除多個(gè)的情況。單個(gè)處理器或其他單元可以實(shí)現(xiàn)權(quán)利要求中列舉的若干項(xiàng)功能。相互不同的從屬權(quán)利要求中記載了某些措施,但這并不表示這些措施不能組合起來(lái)產(chǎn)生良好的效果。
本領(lǐng)域技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、裝置(設(shè)備)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。計(jì)算機(jī)程序存儲(chǔ)/分布在合適的介質(zhì)中,與其它硬件一起提供或作為硬件的一部分,也可以采用其他分布形式,如通過(guò)Internet或其它有線或無(wú)線電信系統(tǒng)。
本發(fā)明是參照本發(fā)明實(shí)施例的方法、裝置(設(shè)備)和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來(lái)描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過(guò)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
盡管結(jié)合具體特征及其實(shí)施例對(duì)本發(fā)明進(jìn)行了描述,顯而易見(jiàn)的,在不脫離本發(fā)明的精神和范圍的情況下,可對(duì)其進(jìn)行各種修改和組合。相應(yīng)地,本說(shuō)明書(shū)和附圖僅僅是所附權(quán)利要求所界定的本發(fā)明的示例性說(shuō)明,且視為已覆蓋本發(fā)明范圍內(nèi)的任意和所有修改、變化、組合或等同物。顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。