專利名稱:數(shù)據(jù)存儲方法、設(shè)備和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明實施例涉及通信技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)存儲方法、設(shè)備和系統(tǒng)。
背景技術(shù):
網(wǎng)絡(luò)塊設(shè)備(Network Block Device ;以下簡稱NBD),是通過傳輸控制協(xié)議 (Transmission Control Protocol ;以下簡稱TCP)/ 因特網(wǎng)協(xié)議(InternetProtocol ;以 下簡稱IP)網(wǎng)絡(luò)把服務(wù)器上的文件或塊設(shè)備抽象出來供客戶端使用的技術(shù)。與之對應(yīng)的 軟件是一種基于Linux的網(wǎng)絡(luò)存儲軟件,利用這一軟件可以構(gòu)建基于Linux的網(wǎng)絡(luò)存儲系 統(tǒng)。作為一套存儲系統(tǒng),尤其是用于商業(yè)解決方案,存儲系統(tǒng)非常復(fù)雜,對性能和可靠性的 要求都很高。但是,現(xiàn)有的NBD只是完成普通的網(wǎng)絡(luò)傳輸,缺少對網(wǎng)絡(luò)異常和存儲節(jié)點異常 的考慮。舉例來說,在本地服務(wù)器A上布署NBD客戶端(NBD Client),并虛擬一個NBD設(shè) 備nbdl,在遠程服務(wù)器B上布署NBD服務(wù)器(NBD Server)。創(chuàng)建于nbdl上的虛擬機處于 運行狀態(tài),但是由于網(wǎng)絡(luò)異?;蛘叽鎯?jié)點發(fā)生異常,無法從NBD服務(wù)器讀取數(shù)據(jù),造成虛 擬機停機。為解決上述可靠性問題,現(xiàn)有技術(shù)提出獨立磁盤冗余陣列KRedimdantArray of Independent Disks 1 ;以下簡稱RAID1)方案,即由底層的單個存儲節(jié)點上的多個硬盤組 成RAIDl,供NBD服務(wù)器使用。但是,發(fā)明人發(fā)現(xiàn)上述RAIDl方案至少存在以下缺點(I)RAIDl方案不能跨節(jié)點存儲,只能降低單節(jié)點發(fā)生故障的概率,如果RAID卡出 現(xiàn)故障,則上層業(yè)務(wù)程序不可用;(2)無法解決網(wǎng)絡(luò)異常引起的業(yè)務(wù)不可用問題;(3)對于存儲節(jié)點來說,經(jīng)過RAID卡之后數(shù)據(jù)量增倍,大大增加了存儲節(jié)點的負 荷。為解決上述可靠性問題,現(xiàn)有技術(shù)還提供另外一種方案,即主卷和備份卷方案,具 體地,上層業(yè)務(wù)程序?qū)戄斎?Input ;以下簡稱1)/輸出(Output ;以下簡稱0)時,先向主 卷寫數(shù)據(jù),然后由主卷將數(shù)據(jù)傳到備份卷,備份卷寫完后再向主卷報告寫1/0結(jié)果,最后由 主卷向上層業(yè)務(wù)程序報告寫1/0結(jié)果。主卷和備份卷方案在物理上將主備分開了,與RAIDl方案相比,單節(jié)點故障時數(shù) 據(jù)不會損壞,進一步提高了可靠性。但發(fā)明人發(fā)現(xiàn)主卷和備份卷方案仍然存在以下缺點(1)備份卷只是用來備份數(shù)據(jù),在系統(tǒng)運行過程中,所有的負荷都在主卷,也就是 說主卷所在的節(jié)點會成為1/0瓶頸;(2) 一次1/0要交互4條消息,消息流量較大。
發(fā)明內(nèi)容
本發(fā)明實施例提供一種數(shù)據(jù)存儲方法、設(shè)備和系統(tǒng),以提高存儲可靠性,降低消息流量。本發(fā)明實施例提供一種數(shù)據(jù)存儲方法,包括通過主卷與虛擬塊存儲客戶端之間的套接字連接接收待寫入數(shù)據(jù);將所述待寫入數(shù)據(jù)寫入所述主卷的卷文件,并將所述待寫入數(shù)據(jù)通過所述主卷與 備份卷之間的套接字連接發(fā)送給所述備份卷,以便所述備份卷在將所述待寫入數(shù)據(jù)寫入所 述備份卷的卷文件之后,向所述虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。本發(fā)明實施例還提供一種主卷節(jié)點設(shè)備,包括接收模塊,用于通過所述主卷節(jié)點設(shè)備與虛擬塊存儲客戶端之間的套接字連接接 收待寫入數(shù)據(jù);寫入模塊,用于將所述接收模塊接收的待寫入數(shù)據(jù)寫入所述主卷節(jié)點設(shè)備的卷文 件,并將所述待寫入數(shù)據(jù)通過所述主卷節(jié)點設(shè)備與備份卷節(jié)點設(shè)備之間的套接字連接發(fā)送 給所述備份卷節(jié)點設(shè)備,以便所述備份卷節(jié)點設(shè)備在將所述待寫入數(shù)據(jù)寫入所述備份卷節(jié) 點設(shè)備的卷文件之后,向所述虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。本發(fā)明實施例還提供一種虛擬塊存儲客戶端設(shè)備,包括連接建立模塊,用于根據(jù)預(yù)先指定的備份卷的監(jiān)聽端口與所述預(yù)先指定的備份卷 建立套接字連接,以及根據(jù)預(yù)先指定的主卷的監(jiān)聽端口與所述預(yù)先指定的主卷建立套接字 連接;獲得模塊,用于獲得所述預(yù)先指定的備份卷的卷大小、檢測點和單節(jié)點位圖,以及 獲得所述預(yù)先指定的主卷的卷大小、檢測點和單節(jié)點位圖;比較模塊,用于比較所述預(yù)先指定的主卷和所述預(yù)先指定的備份卷的檢測點;確定模塊,用于根據(jù)所述比較模塊的比較結(jié)果確定最新檢測點對應(yīng)的卷為真正的 主卷,次新檢測點對應(yīng)的卷為真正的備份卷;注冊模塊,用于向所述虛擬塊存儲客戶端設(shè)備的內(nèi)核注冊所述真正的主卷和所述 真正的備份卷的角色,以及當所述真正的主卷與所述真正的備份卷之間的鏈路正常時,將 所述連接建立模塊與所述預(yù)先指定的備份卷建立的套接字連接的描述符,以及所述連接建 立模塊與所述預(yù)先指定的主卷建立的套接字連接的描述符注冊到所述虛擬塊存儲客戶端 設(shè)備的內(nèi)核;調(diào)用模塊,用于調(diào)用系統(tǒng)函數(shù)進入內(nèi)核態(tài)線程,在所述內(nèi)核態(tài)線程中處理上層業(yè) 務(wù)程序發(fā)送的寫操作請求。本發(fā)明實施例還提供一種備份卷節(jié)點設(shè)備,包括數(shù)據(jù)接收模塊,用于接收主卷節(jié)點設(shè)備通過所述主卷節(jié)點設(shè)備與備份卷節(jié)點設(shè)備 之間的套接字連接發(fā)送的待寫入數(shù)據(jù);數(shù)據(jù)寫入模塊,用于將所述數(shù)據(jù)接收模塊接收的待寫入數(shù)據(jù)寫入所述備份卷節(jié)點 設(shè)備的卷文件;結(jié)果上報模塊,用于向虛擬塊存儲客戶端設(shè)備的內(nèi)核上報寫入操作的結(jié)果。本發(fā)明實施例還提供一種存儲系統(tǒng),包括上述主卷節(jié)點設(shè)備、上述虛擬塊存儲客 戶端設(shè)備和上述備份卷節(jié)點設(shè)備。通過本發(fā)明實施例,主卷通過該主卷與虛擬塊存儲客戶端之間的套接字連接接收 到待寫入數(shù)據(jù)之后,將上述待寫入數(shù)據(jù)寫入主卷的卷文件,并將上述待寫入數(shù)據(jù)通過主卷與備份卷之間的套接字連接發(fā)送給備份卷,以便備份卷將待寫入數(shù)據(jù)寫入該備份卷的卷文 件,從而可以提高存儲可靠性;在備份卷將待寫入數(shù)據(jù)寫入該備份卷的卷文件之后,由備份 卷向虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果;從而可以降低消息流量,并且可以分 擔(dān)主卷的部分負荷,達到動態(tài)負載均衡的目的。
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn) 有技術(shù)描述中所需要使用的附圖作一簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā) 明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根 據(jù)這些附圖獲得其他的附圖。圖1為本發(fā)明數(shù)據(jù)存儲方法一個實施例的流程圖;圖2為本發(fā)明網(wǎng)絡(luò)架構(gòu)一個實施例的示意圖;圖3為本發(fā)明建立三角模型一個實施例的流程圖;圖4為本發(fā)明數(shù)據(jù)存儲方法另一個實施例的流程圖;圖5為本發(fā)明網(wǎng)絡(luò)架構(gòu)另一個實施例的示意圖;圖6為本發(fā)明數(shù)據(jù)存儲方法又一個實施例的流程圖;圖7為本發(fā)明網(wǎng)絡(luò)架構(gòu)又一個實施例的示意圖;圖8為本發(fā)明數(shù)據(jù)存儲方法再一個實施例的流程圖;圖9為本發(fā)明網(wǎng)絡(luò)架構(gòu)再一個實施例的示意圖;圖10為本發(fā)明主卷節(jié)點設(shè)備一個實施例的結(jié)構(gòu)示意圖;圖11為本發(fā)明主卷節(jié)點設(shè)備另一個實施例的結(jié)構(gòu)示意圖;圖12為本發(fā)明虛擬塊存儲客戶端設(shè)備一個實施例的結(jié)構(gòu)示意圖;圖13為本發(fā)明虛擬塊存儲客戶端設(shè)備另一個實施例的結(jié)構(gòu)示意圖;;圖14為本發(fā)明備份卷節(jié)點設(shè)備一個實施例的結(jié)構(gòu)示意圖;圖15為本發(fā)明備份卷節(jié)點設(shè)備另一個實施例的結(jié)構(gòu)示意圖;圖16為本發(fā)明存儲系統(tǒng)一個實施例的結(jié)構(gòu)示意圖;圖17為本發(fā)明云存儲系統(tǒng)一個實施例的示意圖。
具體實施例方式為使本發(fā)明實施例的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本發(fā)明實施例 中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例是 本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員 在沒有做出創(chuàng)造性勞動的前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。圖1為本發(fā)明數(shù)據(jù)存儲方法一個實施例的流程圖,如圖1所示,該數(shù)據(jù)存儲方法可 以包括步驟101,通過主卷與虛擬塊存儲客戶端之間的套接字連接接收待寫入數(shù)據(jù)。步驟102,將上述待寫入數(shù)據(jù)寫入該主卷的卷文件,并將上述待寫入數(shù)據(jù)通過主卷 與備份卷之間的套接字連接發(fā)送給備份卷,以便備份卷在將待寫入數(shù)據(jù)寫入該備份卷的卷 文件之后,向虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。
本實施例中,在通過主卷與虛擬塊存儲客戶端之間的套接字連接接收待寫入數(shù)據(jù) 之前,主卷還可以接收虛擬塊存儲客戶端的內(nèi)核發(fā)送的寫操作請求,并將該寫操作請求轉(zhuǎn) 發(fā)給備份卷,該寫操作請求用于通知主卷和/或備份卷準備接收待寫入數(shù)據(jù);上述寫操作 請求是虛擬塊存儲客戶端的內(nèi)核從該內(nèi)核注冊的請求隊列中獲取的;該內(nèi)核注冊的請求隊 列中的寫操作請求是虛擬塊存儲客戶端接收到上層業(yè)務(wù)程序發(fā)送的寫操作請求之后,放入 該內(nèi)核注冊的請求隊列中的。本實施例中,在備份卷向虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果之后,主 卷可以向備份卷發(fā)送檢測點記錄請求,以使主卷和備份卷更新各自的檢測點。另外,在備份卷向虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果之后,主卷還可 以檢查臟數(shù)據(jù)塊列表中是否有臟數(shù)據(jù);當該臟數(shù)據(jù)塊列表中有臟數(shù)據(jù),且滿足預(yù)定條件之 后,將上述臟數(shù)據(jù)寫到磁盤中。其中,臟數(shù)據(jù)為暫時存放在內(nèi)存緩沖區(qū)中,還未寫入卷文件 的數(shù)據(jù);臟數(shù)據(jù)塊列表用于記錄哪些數(shù)據(jù)是臟數(shù)據(jù)。進一步地,本實施例中,主卷接收虛擬塊存儲客戶端的內(nèi)核發(fā)送的寫操作請求之 前,虛擬塊存儲客戶端可以根據(jù)預(yù)先指定的備份卷的監(jiān)聽端口與預(yù)先指定的備份卷建立套 接字連接,并獲得預(yù)先指定的備份卷的卷大小、檢測點和單節(jié)點位圖;虛擬塊存儲客戶端可 以根據(jù)預(yù)先指定的主卷的監(jiān)聽端口與預(yù)先指定的主卷建立套接字連接,并獲得預(yù)先指定的 主卷的卷大小、檢測點和單節(jié)點位圖;然后,虛擬塊存儲客戶端可以比較預(yù)先指定的主卷和 預(yù)先指定的備份卷的檢測點,確定最新檢測點對應(yīng)的卷為真正的主卷,次新檢測點對應(yīng)的 卷為真正的備份卷;之后,虛擬塊存儲客戶端可以向該虛擬塊存儲客戶端的內(nèi)核注冊真正 的主卷和真正的備份卷的角色;當上述真正的主卷與真正的備份卷之間的鏈路正常時,虛 擬塊存儲客戶端將與預(yù)先指定的備份卷建立的套接字連接的描述符,以及與預(yù)先指定的主 卷建立的套接字連接的描述符注冊到虛擬塊存儲客戶端的內(nèi)核;接下來,虛擬塊存儲客戶 端可以調(diào)用系統(tǒng)函數(shù),例如ioctrl進入內(nèi)核態(tài)線程,在該內(nèi)核態(tài)線程中處理上層業(yè)務(wù)程 序發(fā)送的寫操作請求。其中,在虛擬塊存儲客戶端將與預(yù)先指定的備份卷建立的套接字連接的描述符, 以及與預(yù)先指定的主卷建立的套接字連接的描述符注冊到虛擬塊存儲客戶端的內(nèi)核之前, 當真正的主卷與真正的備份卷之間的鏈路正常時,如果真正的主卷與真正的備份卷之間的 數(shù)據(jù)不同步,則虛擬塊存儲客戶端可以向真正的主卷發(fā)送數(shù)據(jù)同步請求,以使真正的主卷 與真正的備份卷進行數(shù)據(jù)同步。另外,本實施例的一種實現(xiàn)方式中,當主卷發(fā)生異常時,在虛擬塊存儲客戶端的內(nèi) 核進行主備倒換,將備份卷注冊為新的主卷之后,該新的主卷可以通過新的主卷與虛擬塊 存儲客戶端之間的套接字連接接收待寫入數(shù)據(jù),在將該待寫入數(shù)據(jù)寫入新的主卷的卷文件 之后,更新新的主卷的檢測點和單節(jié)點位圖;然后,該新的主卷向虛擬塊存儲客戶端的內(nèi)核 上報寫入操作的結(jié)果。本實施例的另一種實現(xiàn)方式中,當虛擬塊存儲客戶端與備份卷之間的網(wǎng)絡(luò)發(fā)生異 常時,主卷可以接收虛擬塊存儲客戶端發(fā)送的鏈路異常消息,并將該鏈路異常消息轉(zhuǎn)發(fā)給 備份卷,以使備份卷將寫入操作的結(jié)果發(fā)送給主卷,再由主卷將該寫入操作的結(jié)果發(fā)送給 虛擬塊存儲客戶端的內(nèi)核;其中,上述鏈路異常消息由虛擬塊存儲客戶端的心跳進程發(fā)送 給虛擬塊存儲客戶端。
本實施例的再一種實現(xiàn)方式中,當主卷和備份卷之間的網(wǎng)絡(luò)發(fā)生異常時,主卷可 以在將待寫入數(shù)據(jù)寫入該主卷的卷文件之后,更新主卷的檢測點和單節(jié)點位圖;然后,再由 主卷向虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。本實施例中,接收到寫入操作的結(jié)果之后,虛擬塊存儲客戶端的內(nèi)核可以先確定 寫入操作的結(jié)果是否與已發(fā)送的寫操作請求對應(yīng);如果對應(yīng),則虛擬塊存儲客戶端的內(nèi)核 可以將上述寫入操作的結(jié)果發(fā)送給上層業(yè)務(wù)程序;如果寫入操作的結(jié)果與已發(fā)送的寫操作 請求不對應(yīng),則虛擬塊存儲客戶端的內(nèi)核可以丟棄該寫入操作的結(jié)果,或者緩存但不處理 該寫入操作的結(jié)果,本發(fā)明實施例對此不作限定,但本發(fā)明實施例以寫入操作的結(jié)果與已 發(fā)送的寫操作請求不對應(yīng)時,虛擬塊存儲客戶端的內(nèi)核丟棄該寫入操作的結(jié)果為例進行說 明。上述實施例中,主卷通過該主卷與虛擬塊存儲客戶端之間的套接字連接接收到待 寫入數(shù)據(jù)之后,將上述待寫入數(shù)據(jù)寫入主卷的卷文件,并將上述待寫入數(shù)據(jù)通過主卷與備 份卷之間的套接字連接發(fā)送給備份卷,以便備份卷將待寫入數(shù)據(jù)寫入該備份卷的卷文件, 從而可以提高存儲可靠性;在備份卷將待寫入數(shù)據(jù)寫入該備份卷的卷文件之后,由備份卷 向虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果;從而可以降低消息流量,并且可以分擔(dān) 主卷的部分負荷,達到動態(tài)負載均衡的目的。本發(fā)明實施例提供的數(shù)據(jù)存儲方法可以提高存儲可靠性,并在保證存儲可靠性的 前提下,可以進一步降低消息流量,提高性能。本發(fā)明實施例中,可以將主卷和備份卷部署在不同的存儲節(jié)點上,既可以解決單 存儲節(jié)點故障引起的業(yè)務(wù)不可用問題,也可以解決業(yè)務(wù)與主卷所在存儲節(jié)點或備份卷所在 存儲節(jié)點間的網(wǎng)絡(luò)異常引起的業(yè)務(wù)不可用問題;另外,在保證單節(jié)點故障業(yè)務(wù)不中斷的前 提下,本發(fā)明實施例可以將消息流量減少25%,性能上有很大的提高。另外,備份卷在實現(xiàn) 數(shù)據(jù)備份的同時,參與了業(yè)務(wù)流程(回應(yīng)寫入操作的結(jié)果),可以分擔(dān)主卷的部分負荷,達 到一個動態(tài)負載均衡的目的。本發(fā)明實施例采用圖2所示的網(wǎng)絡(luò)架構(gòu),圖2為本發(fā)明網(wǎng)絡(luò)架構(gòu)一個實施例的示 意圖,如圖2所示,該網(wǎng)絡(luò)架構(gòu)是一個穩(wěn)定的三角模型,在該三角模型中,實線代表套接字 (SOCKET)連接,箭頭指向服務(wù)器側(cè),虛線為控制消息的流向。本發(fā)明實施例中,在處理讀操作請求時,備份卷(Backup Volume ;以下簡稱BV) 不感知,讀數(shù)據(jù)操作和回應(yīng)都由主卷(Primary Volume ;以下簡稱PV)負責(zé);在處理寫操作 請求時,由PV接收待寫入數(shù)據(jù),BV回應(yīng)寫入操作的結(jié)果。這樣,可以將消息量減少25%,從 而達到提高性能的目的。另外,圖2所示的網(wǎng)絡(luò)架構(gòu)可以有效防止存儲節(jié)點異常和網(wǎng)絡(luò)異常,只要不是虛 擬塊存儲客戶端(virtual block storage client ;以下簡稱vbs-client)、PV 和 BV 中的 任意兩個同時發(fā)生異常,或者vbs-client與PV之間的鏈路,以及vbs-client與BV之間的 鏈路同時發(fā)生異常,上層業(yè)務(wù)程序可以不中斷的運行。圖3為本發(fā)明建立三角模型一個實施例的流程圖,如圖3所示,圖2所示三角模型 的建立流程可以包括步驟301,vbs-client根據(jù)預(yù)先指定的BV的監(jiān)聽端口與該預(yù)先指定的BV建立 SOCKET 連接。
本實施例中,預(yù)先指定的BV的監(jiān)聽端口是由預(yù)先指定的BV預(yù)先對外提供的。步驟302,vbs-client與預(yù)先指定的BV進行協(xié)商,協(xié)商的內(nèi)容包括(1)通知預(yù)先指定的BV當前連接的是vbs-client ;(2)通知預(yù)先指定的BV預(yù)先指定的PV的信息,包括預(yù)先指定的PV的名稱和監(jiān)聽 端口 ;其中,預(yù)先指定的PV的監(jiān)聽端口也是由預(yù)先指定的PV預(yù)先提供的;(3)向預(yù)先指定的BV發(fā)送獲取卷大小,檢測(check)點和單節(jié)點位圖(solo bitmap)的請求;其中,check點記錄的是寫入數(shù)據(jù)的時間點。步驟303,預(yù)先指定的BV向vbs-client返回卷大小、check點和solo bitmap。步驟304,vbs-client根據(jù)預(yù)先指定的PV的監(jiān)聽端口與該預(yù)先指定的PV建立 SOCKET 連接。步驟305,vbs-client與預(yù)先指定的PV進行協(xié)商,協(xié)商的內(nèi)容包括(1)通知預(yù)先指定的PV當前連接的是vbs-client ;(2)通知預(yù)先指定的PV當前預(yù)先指定的BV的信息,包括預(yù)先指定的BV的名稱和 監(jiān)聽端口 ;(3)向預(yù)先指定的PV發(fā)送獲取卷大小、check點和solo bitmap的請求。步驟306,預(yù)先指定的PV向vbs-client返回卷大小、check點和solo bitmap。步驟307,vbs-client比較預(yù)先指定的PV和預(yù)先指定的BV的check點,確定最新 檢測點對應(yīng)的卷為真正的PV,次新檢測點對應(yīng)的卷為真正的BV。具體地,如果比較check點之后,vbs-client發(fā)現(xiàn)預(yù)先指定的BV的check點是最 新的,也就是說預(yù)先指定的BV —側(cè)的數(shù)據(jù)是最新的,這說明在這之前預(yù)先指定的PV發(fā)生過 異常,然后由vbs-client的內(nèi)核進行主備倒換,將預(yù)先指定的BV作為真正的PV,之后存儲 系統(tǒng)在預(yù)先指定的BV寫過數(shù)據(jù)。本實施例以預(yù)先指定的PV為真正的PV,預(yù)先指定的BV為真正的BV為例進行說明。步驟308,vbs-client向vbs-client的內(nèi)核注冊真正的BV的角色,并通知預(yù)先指 定的BV,其為真正的BV。步驟309,vbs-client向vbs-client的內(nèi)核注冊真正的PV的角色,并通知預(yù)先指 定的PV,其為真正的PV。步驟310,vbs-client判斷真正的PV與真正的BV之間的鏈路是否正常;如果正 常,則執(zhí)行步驟311 步驟313 ;如果真正的PV與真正的BV之間的鏈路發(fā)生異常,則退出 本流程,進入重建流程。步驟311,如果真正的PV與真正的BV之間的數(shù)據(jù)不同步,則vbs-client向真正的 PV發(fā)送數(shù)據(jù)同步請求,以使該真正的PV與真正的BV進行數(shù)據(jù)同步。步驟312,vbs-client將步驟301與步驟304建立的SOCKET連接的描述符注冊 到vbs-client的內(nèi)核。這樣,vbs-client的內(nèi)核在向真正的PV發(fā)送讀操作請求、寫操作 請求或控制消息時可以使用vbs-client與真正的PV之間的SOCKET連接;而在接收數(shù)據(jù) 或控制消息時,vbs-client的內(nèi)核會選擇一個合適的SOCKET連接。因為,在三角模型下, vbs-client是從vbs-client的內(nèi)核與真正的BV之間的SOCKET連接開始接收數(shù)據(jù)的,而在 L模型或S0L0模型下,vbs-client是從vbs-client的內(nèi)核與真正的PV之間的SOCKET連接開始接收數(shù)據(jù)的。步驟313,vbs-client調(diào)用系統(tǒng)函數(shù),例如ioctrl進入內(nèi)核態(tài)線程,在內(nèi)核態(tài)線 程由注冊到系統(tǒng)的回調(diào)函數(shù)處理上層業(yè)務(wù)程序發(fā)送的I/O請求,例如寫操作請求和讀操 作請求。上述實施例可以實現(xiàn)建立三角模型,通過該三角模型處理寫操作請求,可以實現(xiàn) 提高存儲可靠性,降低消息流量,提高存儲性能。圖4為本發(fā)明數(shù)據(jù)存儲方法另一個實施例的流程圖,由于本發(fā)明實施例中,讀操 作請求的處理過程僅是vbs-client與PV之間的交互,與現(xiàn)有技術(shù)一樣,因此,本實施例僅 對寫操作請求的處理過程進行介紹。如圖4所示,該數(shù)據(jù)存儲方法可以包括步驟401,三角模型建立,存儲系統(tǒng)處于穩(wěn)定狀態(tài)。步驟402,三角模型建立后,vbs-client會啟動一個內(nèi)核態(tài)線程專門用來處理寫 操作請求。步驟403,上層業(yè)務(wù)程序發(fā)送的寫操作請求被vbs-client的操作系統(tǒng)(Operating System;以下簡稱0S)放入內(nèi)核注冊的一個請求隊列中。步驟404,vbs-client的內(nèi)核線程從上述請求隊列中獲取一個寫操作請求。本實施例中,vbs-client的內(nèi)核線程可以按照預(yù)定的規(guī)則從上述請求隊列中獲取 一個寫操作請求,該預(yù)定的規(guī)則可以為先入先出規(guī)則或其他規(guī)則,本實施例對此不作限定, 只要vbs-client的內(nèi)核線程可以按照該預(yù)定的規(guī)則從上述請求隊列中獲取一個寫操作請 求即可;但本實施例以該預(yù)定的規(guī)則為先入先出規(guī)則為例進行說明。步驟405,Vbs-client的內(nèi)核向PV發(fā)送寫操作請求,該寫操作請求用于通知PV準 備接收待寫入數(shù)據(jù)。步驟406,PV子進程收到寫操作請求之后,將接收到的寫操作請求轉(zhuǎn)發(fā)給BV子進 程;該寫操作請求用于通知BV準備接收待寫入數(shù)據(jù)。步驟407,PV通過該PV與vbs-c 1 ient之間的SOCKET連接接收待寫入數(shù)據(jù),將該待 寫入數(shù)據(jù)寫入PV的卷文件(volume file),并將該待寫入數(shù)據(jù)通過PV與BV之間的SOCKET 連接發(fā)送給BV,以便BV在將待寫入數(shù)據(jù)寫入該BV的卷文件。步驟408,BV在將待寫入數(shù)據(jù)寫入該BV的卷文件之后,向vbs-client的內(nèi)核上報 寫入操作的結(jié)果。步驟409,PV向BV發(fā)送check點記錄請求。步驟410,PV和BV更新各自的check點。本實施例中,check點是判斷當前側(cè)數(shù)據(jù)是最新數(shù)據(jù)的唯一標準。步驟411,PV檢查臟數(shù)據(jù)塊列表(Dirty Block List ;以下簡稱DBL)中是否有臟 數(shù)據(jù),如果有,且滿足預(yù)定條件,則PV將DBL中的臟數(shù)據(jù)強行寫到磁盤中。其中,臟數(shù)據(jù)為 暫時存放在內(nèi)存緩沖區(qū)中,還未寫入卷文件的數(shù)據(jù);DBL用于記錄哪些數(shù)據(jù)是臟數(shù)據(jù)。本實施例中,上述預(yù)定條件可以為以下之一或組合(1)如果在輪詢時發(fā)現(xiàn)DBL沒有變化,說明存儲系統(tǒng)不忙,可以直接將DBL中的臟 數(shù)據(jù)寫到磁盤中;(2)如果DBL不為空,且在輪詢時發(fā)現(xiàn)該DBL有變化,則可以在達到預(yù)定的時間間隔后將DBL中的臟數(shù)據(jù)寫到磁盤中。步驟412,vbs-client的內(nèi)核接收到BV發(fā)送的寫入操作的結(jié)果之后,判斷接收到 的寫入操作的結(jié)果是否與已發(fā)送的寫操作請求對應(yīng);如果對應(yīng),則執(zhí)行步驟413 ;如果上述 寫入操作的結(jié)果與已發(fā)送的寫操作請求不對應(yīng),則vbs-client的內(nèi)核可以丟棄該寫入操 作的結(jié)果,或者緩存但不處理該寫入操作的結(jié)果,本實施例對此不作限定,但本實施例以寫 入操作的結(jié)果與已發(fā)送的寫操作請求不對應(yīng)時,vbs-client的內(nèi)核丟棄該寫入操作的結(jié)果 為例進行說明。步驟413,vbs-client的內(nèi)核將寫入操作的結(jié)果發(fā)送給上層業(yè)務(wù)程序。上述實施例中,PV通過該PV與vbs-client之間的SOCKET連接接收到待寫入數(shù) 據(jù)之后,將上述待寫入數(shù)據(jù)寫入PV的卷文件,并將上述待寫入數(shù)據(jù)通過PV與BV之間的 SOCKET連接發(fā)送給BV,以便BV將待寫入數(shù)據(jù)寫入該BV的卷文件,從而可以提高存儲可靠 性;在BV將待寫入數(shù)據(jù)寫入該BV的卷文件之后,由BV向vbs-client的內(nèi)核上報寫入操作 的結(jié)果;從而可以降低消息流量,并且可以分擔(dān)PV的部分負荷,達到動態(tài)負載均衡的目的。以下介紹在各種異常發(fā)生時,存儲系統(tǒng)是如何從穩(wěn)定的三角模型切換到其他模 型,從而保證上層業(yè)務(wù)程序不受影響的。當PV發(fā)生異常時,原來的BV變成真正的PV,既負責(zé)接收請求,也負責(zé)回應(yīng)結(jié)果,這 時網(wǎng)絡(luò)結(jié)構(gòu)可以如圖5所示,圖5為本發(fā)明網(wǎng)絡(luò)架構(gòu)另一個實施例的示意圖。圖5所示的 網(wǎng)絡(luò)架構(gòu)為單節(jié)點(SOLO)模型圖6為本發(fā)明數(shù)據(jù)存儲方法又一個實施例的流程圖,本實施例對圖5所示網(wǎng)絡(luò)架 構(gòu)下的數(shù)據(jù)存儲過程進行介紹。如圖6所示,該數(shù)據(jù)存儲方法可以包括步驟601,vbs-client內(nèi)核態(tài)線程接收PV發(fā)生異常之前的寫操作請求。步驟602,PV發(fā)生異常導(dǎo)致vbs-client與PV之間的SOCKET連接發(fā)生異常, vbs-client的內(nèi)核進行主備倒換,將原來的BV注冊為新的PV。步驟603,vbs-client內(nèi)核態(tài)線程啟動檢測發(fā)生異常的PV是否恢復(fù)的進程。步驟604,vbs-client內(nèi)核態(tài)線程將上述寫操作請求發(fā)送給新的PV(即原來的 BV)。步驟605,新的PV將待寫入數(shù)據(jù)寫入該新的PV的卷文件。步驟606,新的PV更新check點。步驟607,新的 PV 更新 solo bitmap。步驟608,新的PV向vbs-client的內(nèi)核上報寫入操作的結(jié)果。步驟609,vbs-client的內(nèi)核確定該寫入操作的結(jié)果與之前發(fā)送的寫操作請求對 應(yīng)之后,將該寫入操作的結(jié)果發(fā)送給上層業(yè)務(wù)程序。步驟610,檢測發(fā)生異常的PV是否恢復(fù)的進程發(fā)送檢測消息給vbs-client的內(nèi) 核,以便vbs-client的內(nèi)核根據(jù)該檢測消息確定發(fā)生異常的PV是否恢復(fù)正常。本實施例中,新的PV(即原來的BV)在將待寫入數(shù)據(jù)寫入自身的卷文件之后,要更 新solo bitmap和check點,該solo bitmap用于記錄哪一塊數(shù)據(jù)發(fā)生了變化,該check點 用于記錄寫入待寫入數(shù)據(jù)的時間點。記錄solo bitmap和check點的作用是,在下次三角 模型建立時,存儲系統(tǒng)會根據(jù)check點判斷哪一側(cè)的數(shù)據(jù)是最新的,只有具有最新數(shù)據(jù)的卷才可以做PV。另夕卜,如果PV的數(shù)據(jù)比BV的新,則可以根據(jù)solo bitmap中記錄的信息, 將PV上相應(yīng)的數(shù)據(jù)同步到BV,保證PV和BV上數(shù)據(jù)的一致性;反之亦然。當vbs-client與BV之間的鏈路發(fā)生異常時,網(wǎng)絡(luò)架構(gòu)可以如圖7所示,圖7為本 發(fā)明網(wǎng)絡(luò)架構(gòu)又一個實施例的示意圖,圖7所示的網(wǎng)絡(luò)架構(gòu)為L模型。在圖7所示的網(wǎng)絡(luò) 架構(gòu)下,BV無法向上層業(yè)務(wù)程序發(fā)送寫入操作的結(jié)果,這時,BV轉(zhuǎn)向PV上報寫入操作的結(jié) 果,最后由PV向上層業(yè)務(wù)程序上報寫入操作的結(jié)果。圖8為本發(fā)明數(shù)據(jù)存儲方法再一個實施例的流程圖,本實施例對圖7所示網(wǎng)絡(luò)架 構(gòu)下的數(shù)據(jù)存儲過程進行介紹。如圖8所示,該數(shù)據(jù)存儲方法可以包括步驟801,在穩(wěn)定狀態(tài)下,vbs-client與BV之間的鏈路突然發(fā)生異常。步驟802,本來需要BV上報的寫入操作的結(jié)果,因為vbs_c 1 ient與BV之間的鏈路 發(fā)生異常,BV無法將寫入操作的結(jié)果發(fā)送給vbs-client的內(nèi)核,一直阻塞。步驟803,當vbs-client的心跳機制檢測到鏈路異常時,向vbs-client發(fā)送鏈路 異常消息。步驟804,vbs-client將鏈路異常消息發(fā)送給PV。步驟805,PV將鏈路異常消息轉(zhuǎn)發(fā)給BV。步驟806,BV接收到鏈路異常消息之后,將未發(fā)出的寫入操作的結(jié)果發(fā)送給PV。步驟807,PV將寫入操作的結(jié)果發(fā)送給vbs-client的內(nèi)核。步驟808,vbs-client的內(nèi)核將寫入操作的結(jié)果上報給上層業(yè)務(wù)程序。 步驟809,之后有寫操作請求時,BV在將待寫入數(shù)據(jù)寫入BV的卷文件之后,直接將 寫入操作的結(jié)果上報給PV而不再進行嘗試發(fā)送給vbs-client的內(nèi)核。當PV與BV之間的鏈路發(fā)生異常時,網(wǎng)絡(luò)架構(gòu)可以如圖9所示,圖9為本發(fā)明網(wǎng) 絡(luò)架構(gòu)再一個實施例的示意圖,圖9所示的網(wǎng)絡(luò)結(jié)構(gòu)為倒V模型。在倒V模型下,存儲 系統(tǒng)可以忽略BV,以處理寫操作請求為例,PV將待寫入數(shù)據(jù)寫入PV的卷文件之后,更新 PV的check點和solo bitmap ;然后,PV向vbs-client的內(nèi)核上報寫入操作的結(jié)果,即 vbs-client不從BV接收寫入操作的結(jié)果,轉(zhuǎn)而從PV接收,整體的處理流程與SOLO模型類 似,在此不再贅述。本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述方法實施例的全部或部分步驟可以通過 程序指令相關(guān)的硬件來完成,前述的程序可以存儲于一計算機可讀取存儲介質(zhì)中,該程序 在執(zhí)行時,執(zhí)行包括上述方法實施例的步驟;而前述的存儲介質(zhì)包括R0M、RAM、磁碟或者 光盤等各種可以存儲程序代碼的介質(zhì)。圖10為本發(fā)明主卷節(jié)點設(shè)備一個實施例的結(jié)構(gòu)示意圖,該主卷節(jié)點設(shè)備可以實 現(xiàn)本發(fā)明圖1所示實施例的流程,如圖10所示,該主卷節(jié)點設(shè)備可以包括接收模塊1001 和寫入模塊1002 ;其中,接收模塊1001,用于通過該主卷節(jié)點設(shè)備與虛擬塊存儲客戶端之間的套接 字連接接收待寫入數(shù)據(jù);寫入模塊1002,用于將接收模塊1001接收的待寫入數(shù)據(jù)寫入主卷節(jié)點設(shè)備的卷 文件,并將待寫入數(shù)據(jù)通過主卷節(jié)點設(shè)備與備份卷節(jié)點設(shè)備之間的套接字連接發(fā)送給備份 卷節(jié)點設(shè)備,以便備份卷節(jié)點設(shè)備在將該待寫入數(shù)據(jù)寫入備份卷節(jié)點設(shè)備的卷文件之后,向虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。上述實施例中,接收模塊1001通過該主卷節(jié)點設(shè)備與虛擬塊存儲客戶端之間的 套接字連接接收到待寫入數(shù)據(jù)之后,寫入模塊1002將上述待寫入數(shù)據(jù)寫入主卷節(jié)點設(shè)備 的卷文件,并將上述待寫入數(shù)據(jù)通過主卷節(jié)點設(shè)備與備份卷節(jié)點設(shè)備之間的套接字連接發(fā) 送給備份卷節(jié)點設(shè)備,以便備份卷節(jié)點設(shè)備將待寫入數(shù)據(jù)寫入該備份卷節(jié)點設(shè)備的卷文 件,從而可以提高存儲可靠性;在備份卷節(jié)點設(shè)備將待寫入數(shù)據(jù)寫入該備份卷的卷文件之 后,由備份卷節(jié)點設(shè)備向虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果;從而可以降低消 息流量,并且可以分擔(dān)主卷節(jié)點設(shè)備的部分負荷,達到動態(tài)負載均衡的目的。圖11為本發(fā)明主卷節(jié)點設(shè)備另一個實施例的結(jié)構(gòu)示意圖,與圖10所示的主卷節(jié) 點設(shè)備相比,不同之處在于,圖11所示的主卷節(jié)點設(shè)備還可以包括發(fā)送模塊1003 ;本實施例中,接收模塊1001還可以在接收待寫入數(shù)據(jù)之前,接收虛擬塊存儲客戶 端的內(nèi)核發(fā)送的寫操作請求;則發(fā)送模塊1003用于將接收模塊1001接收的寫操作請求轉(zhuǎn) 發(fā)給備份卷節(jié)點設(shè)備,該寫操作請求用于通知主卷節(jié)點設(shè)備和/或備份卷節(jié)點設(shè)備準備接 收待寫入數(shù)據(jù);寫操作請求是虛擬塊存儲客戶端的內(nèi)核從該內(nèi)核注冊的請求隊列中獲取 的;該內(nèi)核注冊的請求隊列中的寫操作請求是虛擬塊存儲客戶端接收到上層業(yè)務(wù)程序發(fā)送 的寫操作請求之后,放入該內(nèi)核注冊的請求隊列中的。進一步地,本實施例中,發(fā)送模塊1003還可以向備份卷節(jié)點設(shè)備發(fā)送檢測點記錄 請求,以使主卷節(jié)點設(shè)備和備份卷節(jié)點設(shè)備更新各自的檢測點。進一步地,本實施例中的主卷節(jié)點設(shè)備還可以包括檢查模塊1004,用于檢查臟數(shù)據(jù)塊列表中是否有臟數(shù)據(jù);則寫入模塊1002還可以當臟數(shù)據(jù)塊列表中有臟數(shù)據(jù),且滿足預(yù)定條件之后,將上 述臟數(shù)據(jù)寫到磁盤中。進一步地,本實施例中,接收模塊1001還可以當虛擬塊存儲客戶端與備份卷節(jié)點 設(shè)備之間的鏈路發(fā)生異常時,接收虛擬塊存儲客戶端發(fā)送的鏈路異常消息;發(fā)送模塊1003 還可以將接收模塊1001接收的鏈路異常消息轉(zhuǎn)發(fā)給備份卷節(jié)點設(shè)備,以使備份卷節(jié)點設(shè) 備將寫入操作的結(jié)果發(fā)送給主卷節(jié)點設(shè)備,再由發(fā)送模塊1003將上述寫入操作的結(jié)果發(fā) 送給虛擬塊存儲客戶端的內(nèi)核;該鏈路異常消息由虛擬塊存儲客戶端的心跳進程發(fā)送給虛 擬塊存儲客戶端。進一步地,本實施例中的主卷節(jié)點設(shè)備還可以包括更新模塊1005,用于當主卷節(jié)點設(shè)備和備份卷節(jié)點設(shè)備之間的鏈路發(fā)生異常時, 在寫入模塊1002將待寫入數(shù)據(jù)寫入主卷節(jié)點設(shè)備的卷文件之后,更新主卷節(jié)點設(shè)備的檢 測點和單節(jié)點位圖;這時,發(fā)送模塊1003可以向虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。采用上述主卷節(jié)點設(shè)備構(gòu)建存儲系統(tǒng),可以提高存儲可靠性,降低消息流量,提高 存儲性能。圖12為本發(fā)明虛擬塊存儲客戶端設(shè)備一個實施例的結(jié)構(gòu)示意圖,如圖12所示,該 虛擬塊存儲客戶端設(shè)備可以包括連接建立模塊1201、獲得模塊1202、比較模塊1203、確定 模塊1204、注冊模塊1205和調(diào)用模塊1206 ;其中,連接建立模塊1201,用于根據(jù)預(yù)先指定的備份卷的監(jiān)聽端口與預(yù)先指定的備份卷建立套接字連接,以及根據(jù)預(yù)先指定的主卷的監(jiān)聽端口與預(yù)先指定的主卷建立套接 字連接;獲得模塊1202,用于獲得預(yù)先指定的備份卷的卷大小、檢測點和單節(jié)點位圖,以及 獲得預(yù)先指定的主卷的卷大小、檢測點和單節(jié)點位圖;比較模塊1203,用于比較預(yù)先指定的主卷和預(yù)先指定的備份卷的檢測點;確定模塊1204,用于根據(jù)比較模塊1203的比較結(jié)果確定最新檢測點對應(yīng)的卷為 真正的主卷,次新檢測點對應(yīng)的卷為真正的備份卷;注冊模塊1205,用于向虛擬塊存儲客戶端設(shè)備的內(nèi)核注冊真正的主卷和真正的備 份卷的角色,以及當真正的主卷與真正的備份卷之間的鏈路正常時,將連接建立模塊1201 與預(yù)先指定的備份卷建立的套接字連接的描述符,以及連接建立模塊1201與預(yù)先指定的 主卷建立的套接字連接的描述符注冊到虛擬塊存儲客戶端設(shè)備的內(nèi)核;調(diào)用模塊1206,用于調(diào)用系統(tǒng)函數(shù)進入內(nèi)核態(tài)線程,在內(nèi)核態(tài)線程中處理上層業(yè) 務(wù)程序發(fā)送的寫操作請求。采用上述虛擬塊存儲客戶端設(shè)備構(gòu)建存儲系統(tǒng),可以提高存儲可靠性,降低消息 流量,提高存儲性能。圖13為本發(fā)明虛擬塊存儲客戶端設(shè)備另一個實施例的結(jié)構(gòu)示意圖,與圖12所示 的虛擬塊存儲客戶端設(shè)備相比,不同之處在于,圖13所示的虛擬塊存儲客戶端設(shè)備12還可 以包括請求發(fā)送模塊1207,用于當真正的主卷與真正的備份卷之間的鏈路正常時,如果 真正的主卷與真正的備份卷之間的數(shù)據(jù)不同步,則向真正的主卷發(fā)送數(shù)據(jù)同步請求,以使 真正的主卷與真正的備份卷進行數(shù)據(jù)同步;主備倒換模塊1208,用于當主卷發(fā)生異常時,在虛擬塊存儲客戶端設(shè)備的內(nèi)核進 行主備倒換,將備份卷注冊為新的主卷,以使新的主卷通過新的主卷與虛擬塊存儲客戶端 之間的套接字連接接收待寫入數(shù)據(jù),并在將待寫入數(shù)據(jù)寫入新的主卷的卷文件之后,更新 新的主卷的檢測點和單節(jié)點位圖,以及向虛擬塊存儲客戶端設(shè)備的內(nèi)核上報寫入操作的結(jié)^ ο進一步地,本實施例中的虛擬塊存儲客戶端設(shè)備12還可以包括結(jié)果接收模塊 1209和結(jié)果發(fā)送模塊1210;其中,結(jié)果接收模塊1209,用于接收寫入操作的結(jié)果;這時確定模塊1204還可以確定結(jié)果接收模塊1209接收的寫入操作的結(jié)果是否與 已發(fā)送的寫操作請求對應(yīng);結(jié)果發(fā)送模塊1210,用于在確定模塊1204確定結(jié)果接收模塊1209接收的寫入操 作的結(jié)果與已發(fā)送的寫操作請求對應(yīng)之后,將上述寫入操作的結(jié)果發(fā)送給上層業(yè)務(wù)程序。采用上述虛擬塊存儲客戶端設(shè)備構(gòu)建存儲系統(tǒng),可以提高存儲可靠性,降低消息 流量,提高存儲性能。圖14為本發(fā)明備份卷節(jié)點設(shè)備一個實施例的結(jié)構(gòu)示意圖,如圖14所示,該備份卷 節(jié)點設(shè)備可以包括數(shù)據(jù)接收模塊1401、數(shù)據(jù)寫入模塊1402和結(jié)果上報模塊1403 ;其中,數(shù)據(jù)接收模塊1401,用于接收主卷節(jié)點設(shè)備通過該主卷節(jié)點設(shè)備與備份卷 節(jié)點設(shè)備之間的套接字連接發(fā)送的待寫入數(shù)據(jù);
數(shù)據(jù)寫入模塊1402,用于將數(shù)據(jù)接收模塊1401接收的待寫入數(shù)據(jù)寫入備份卷節(jié) 點設(shè)備的卷文件;結(jié)果上報模塊1403,用于向虛擬塊存儲客戶端設(shè)備的內(nèi)核上報寫入操作的結(jié)果。采用上述備份卷節(jié)點設(shè)備構(gòu)建存儲系統(tǒng),可以提高存儲可靠性,降低消息流量,提 高存儲性能。圖15為本發(fā)明備份卷節(jié)點設(shè)備另一個實施例的結(jié)構(gòu)示意圖,與圖13所示的備份 卷節(jié)點設(shè)備相比,不同之處在于,圖14所示的備份卷節(jié)點設(shè)備還可以包括請求接收模塊1404,用于在數(shù)據(jù)接收模塊1401接收待寫入數(shù)據(jù)之前,接收主卷節(jié) 點設(shè)備發(fā)送的寫操作請求,該寫操作請求用于通知所述備份卷節(jié)點設(shè)備準備接收所述待寫 入數(shù)據(jù);還可以在結(jié)果上報模塊1403上報寫入操作的結(jié)果之后,接收主卷節(jié)點設(shè)備發(fā)送的 檢測點記錄請求,以更新該備份卷節(jié)點設(shè)備的檢測點。采用上述備份卷節(jié)點設(shè)備構(gòu)建存儲系統(tǒng),可以提高存儲可靠性,降低消息流量,提 高存儲性能。圖16為本發(fā)明存儲系統(tǒng)一個實施例的結(jié)構(gòu)示意圖,如圖16所示,該存儲系統(tǒng)可以 包括vbs 客戶端 1601、PV 1602 和 BV 1603 ;其中,PV 1602用于通過PV 1602與vbs客戶端1601之間的套接字連接接收待寫 入數(shù)據(jù),將該待寫入數(shù)據(jù)寫入PV 1602的卷文件,并將待寫入數(shù)據(jù)通過PV 1602與BV 1603 之間的套接字連接發(fā)送給BV 1603,以便BV 1603在將待寫入數(shù)據(jù)寫入BV 1603的卷文件之 后,向vbs客戶端1601的內(nèi)核上報寫入操作的結(jié)果。具體地,vbs客戶端1601可以通過本發(fā)明圖12或圖13所示的虛擬塊存儲客戶端 設(shè)備實現(xiàn),PV 1602可以通過本發(fā)明圖10或圖11所示的主卷節(jié)點設(shè)備實現(xiàn)。本實施例中,vbs客戶端1601可以包括三角模型建立模塊16011、控制消息處理模 塊16012、I/O請求發(fā)送模塊16013、鏈路選擇模塊16014和I/O結(jié)果接收模塊16015 ;其中,三角模型建立模塊16011,用于初次啟動、節(jié)點異?;蚓W(wǎng)絡(luò)異常時,重新建立 三角模型或進行模型切換;具體地,三角模型建立模塊16011可以參照本發(fā)明圖3所示實 施例提供的方法建立三角模型,實現(xiàn)圖12所示實施例提供的虛擬塊存儲客戶端設(shè)備中連 接建立模塊1201、獲得模塊1202、比較模塊1203、確定模塊1204、注冊模塊1205、調(diào)用模塊 1206和請求發(fā)送模塊1207的功能??刂葡⑻幚砟K16012 為用戶態(tài)與內(nèi)核態(tài)之間的接口 ;I/O請求發(fā)送模塊16013 來自上層業(yè)務(wù)程序的I/O請求,例如寫操作請求或讀 操作請求通過I/O請求發(fā)送模塊16013發(fā)送到PV 1602 ;鏈路選擇模塊16014:當異常發(fā)生時,數(shù)據(jù)的收發(fā)不同于三角模型,所以在SOLO模 型或L模型時,vbs-client的內(nèi)核在發(fā)送I/O請求時要選擇合適的鏈路;本實施例中,鏈路 選擇模塊16014可以實現(xiàn)圖12所示實施例提供的虛擬塊存儲客戶端設(shè)備中主備倒換模塊 1208的功能;I/O結(jié)果接收模塊16015 來自BV的寫入操作的結(jié)果由I/O結(jié)果接收模塊16015 處理;本實施例中,I/O結(jié)果接收模塊16015可以實現(xiàn)圖12所示實施例提供的虛擬塊存儲 客戶端設(shè)備中結(jié)果接收模塊1209和結(jié)果發(fā)送模塊1210的功能。本實施例中,PV 1602可以包括讀操作請求處理模塊16021、寫操作請求處理模塊16022、主備數(shù)據(jù)同步模塊16023、PV狀態(tài)檢測模塊16024、單節(jié)點位圖(solo bitmap) 16025、DBL 16026 和卷文件 16027。其中,讀操作請求處理模塊16021,用于處理來自vbs客戶端1601的讀操作請求, 在三角模型下讀操作請求只到PV 1602,BV 1603不感知;寫操作請求處理模塊16022,用于處理來自vbs客戶端1601的寫操作請求,在三角 模型下寫操作請求會轉(zhuǎn)到BV 1603,最后由BV 1603向vbs客戶端1601報告寫入操作的結(jié) 果;本實施例中,寫操作請求處理模塊16022可以實現(xiàn)本發(fā)明圖10所示實施例提供的主卷 節(jié)點設(shè)備中接收模塊1001、寫入模塊1002和發(fā)送模塊1003的部分功能;主備數(shù)據(jù)同步模塊16023 當PV 1602或BV 1603發(fā)生異常時,該存儲系統(tǒng)進入 SOLO模型,以后有寫操作請求時,solo bitmap 16025會記錄發(fā)生變化的數(shù)據(jù),當重建三角 模型時,主備數(shù)據(jù)同步模塊16023將數(shù)據(jù)同步到另一側(cè),保持數(shù)據(jù)一致;PV狀態(tài)檢測模塊16024 當PV 1602發(fā)生異常時,存儲系統(tǒng)進入SOLO模型,原來的 BV 1603會成為真正的PV,PV狀態(tài)檢測模塊160M輪詢檢測發(fā)生異常的PV 1602是否恢復(fù) 正常,恢復(fù)后重建三角模型;solo bitmap 16025 記錄存儲系統(tǒng)在S0L0模型下運行期間,PV 1602上發(fā)生變化 的數(shù)據(jù)塊;本實施例中,solo bitmap 16025可以實現(xiàn)本發(fā)明圖10所示實施例提供的主卷 節(jié)點設(shè)備中更新模塊1005的部分功能;DBL 16026 寫操作請求發(fā)生時,存儲系統(tǒng)首先將待寫入數(shù)據(jù)寫入緩沖區(qū),這些待 寫入數(shù)據(jù)在真正寫到磁盤之前都被認為是臟數(shù)據(jù),DBL 160 用于記錄這些臟數(shù)據(jù)。當DBL 16026中有臟數(shù)據(jù),且滿足預(yù)定條件時,PV 1602可以將DBL 160 中的臟數(shù)據(jù)強行寫到磁 盤中。本實施例中,上述預(yù)定條件可以為以下之一或組合(1)如果在輪詢時發(fā)現(xiàn)DBL 160 沒有變化,說明存儲系統(tǒng)不忙,PV1602可以直接 將DBL 16026中的臟數(shù)據(jù)寫到磁盤中;(2)如果DBL 160 不為空,且在輪詢時發(fā)現(xiàn)該DBL 160 有變化,則PV 1602可 以在達到預(yù)定的時間間隔后將DBL 160 中的臟數(shù)據(jù)寫到磁盤中;卷文件16027 基于高級日志文件系統(tǒng)(XFS)文件系統(tǒng)的稀疏文件,用于存放所有 的數(shù)據(jù)。寫入待寫入數(shù)據(jù)之前,卷文件16027并不占用磁盤空間,是一種瘦分配,為用戶提 供了很大的靈活性。本實施例中,BV 1603中各模塊的功能與PV 1602中相同模塊的功能相同,在此不
再贅述。上述存儲系統(tǒng)中,PV 1602通過該PV 1602與vbs客戶端1601之間的套接字連接 接收到待寫入數(shù)據(jù)之后,將上述待寫入數(shù)據(jù)寫入PV 1602的卷文件,并將上述待寫入數(shù)據(jù) 通過PV 1602與BV 1603之間的套接字連接發(fā)送給BV 1603,以便BV 1603將待寫入數(shù)據(jù) 寫入該BV 1603的卷文件,從而可以提高存儲可靠性;在BV 1603將待寫入數(shù)據(jù)寫入該BV 1603的卷文件之后,由BV 1603向vbs客戶端1601的內(nèi)核上報寫入操作的結(jié)果;從而可以 降低消息流量,并且可以分擔(dān)PV 1602的部分負荷,達到動態(tài)負載均衡的目的。下面對本發(fā)明實施例在云存儲中的實現(xiàn)進行介紹。云存儲是在云計算概念上延伸和發(fā)展出來的一個新的概念,是指通過集群應(yīng)用、 網(wǎng)格技術(shù)或分布式文件系統(tǒng)等功能,將網(wǎng)絡(luò)中大量各種不同類型的存儲設(shè)備通過應(yīng)用軟件集合起來協(xié)同工作,共同對外提供數(shù)據(jù)存儲和業(yè)務(wù)訪問功能的一個系統(tǒng)。當云計算系統(tǒng)運 算和處理的核心是大量數(shù)據(jù)的存儲和管理時,云計算系統(tǒng)中就需要配置大量的存儲設(shè)備, 那么云計算系統(tǒng)就轉(zhuǎn)變成為一個云存儲系統(tǒng),所以云存儲系統(tǒng)是一個以數(shù)據(jù)存儲和管理為 核心的云計算系統(tǒng)。圖17為本發(fā)明云存儲系統(tǒng)一個實施例的示意圖,如圖17所示,本實施例中的云存 儲系統(tǒng)可以包括以下設(shè)備(1)三臺塊存儲提供者(Block Storage Provider ;以下簡稱BSP),分別記為 BSPU BSP2 和 BSP3, BSPU BSP2 和 BSP3 為上層的塊存儲代理(BlockStorage Agent ;以下 簡稱BSA)提供存儲空間。同時,每個BSP上分別有本發(fā)明實施例提供的三角模型中的PV 和BV。在這種部署下,可以有效地將每個BSP的I/O負荷平均分配。(2) 一臺BSA,作為存儲管理中間件和底層BSP之間的接口,負責(zé)向上層提供虛擬 的NBD設(shè)備。(3)另一臺服務(wù)器,該服務(wù)器上部署監(jiān)控系統(tǒng)、計費系統(tǒng)和存儲資源管理系統(tǒng)等; 其中,存儲資源管理系統(tǒng),主要負責(zé)BSP1、BSP2和BSP3上PV和BV的選擇,從而達到BSPl、 BSP2和BSP3之間負載的均衡;監(jiān)控系統(tǒng)用于實時監(jiān)控各節(jié)點是否異常,另外,也負責(zé)監(jiān)控 BSPU BSP2和BSP3的性能,如有異常及時通知存儲資源管理系統(tǒng)。本發(fā)明實施例提供的數(shù)據(jù)存儲方法、設(shè)備和系統(tǒng),可以方便地構(gòu)建大型可靠的存 儲系統(tǒng)。同時,本發(fā)明實施例在提高存儲可靠性的同時,也有效降低了整個存儲系統(tǒng)的消息 流量。在I/O負荷很高的場合,優(yōu)勢更加明顯。本領(lǐng)域技術(shù)人員可以理解附圖只是一個優(yōu)選實施例的示意圖,附圖中的模塊或流 程并不一定是實施本發(fā)明所必須的。 本領(lǐng)域技術(shù)人員可以理解實施例中的裝置中的模塊可以按照實施例描述進行分 布于實施例的裝置中,也可以進行相應(yīng)變化位于不同于本實施例的一個或多個裝置中。上 述實施例的模塊可以合并為一個模塊,也可以進一步拆分成多個子模塊。
最后應(yīng)說明的是以上實施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡 管參照前述實施例對本發(fā)明進行了詳細的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當理解其依然 可以對前述各實施例所記載的技術(shù)方案進行修改,或者對其中部分技術(shù)特征進行等同替 換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實施例技術(shù)方案的精 神和范圍。
權(quán)利要求
1.一種數(shù)據(jù)存儲方法,其特征在于,包括通過主卷與虛擬塊存儲客戶端之間的套接字連接接收待寫入數(shù)據(jù);將所述待寫入數(shù)據(jù)寫入所述主卷的卷文件,并將所述待寫入數(shù)據(jù)通過所述主卷與備份 卷之間的套接字連接發(fā)送給所述備份卷,以便所述備份卷在將所述待寫入數(shù)據(jù)寫入所述備 份卷的卷文件之后,向所述虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述通過主卷與虛擬塊存儲客戶端之間 的套接字連接接收待寫入數(shù)據(jù)之前,還包括接收虛擬塊存儲客戶端的內(nèi)核發(fā)送的寫操作請求,并將所述寫操作請求轉(zhuǎn)發(fā)給備份 卷,所述寫操作請求用于通知所述主卷和/或所述備份卷準備接收所述待寫入數(shù)據(jù);所述 寫操作請求是所述虛擬塊存儲客戶端的內(nèi)核從所述內(nèi)核注冊的請求隊列中獲取的;所述內(nèi) 核注冊的請求隊列中的寫操作請求是所述虛擬塊存儲客戶端接收到上層業(yè)務(wù)程序發(fā)送的 寫操作請求之后,放入所述內(nèi)核注冊的請求隊列中的。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述向所述虛擬塊存儲客戶端的內(nèi)核上 報寫入操作的結(jié)果之后,還包括向所述備份卷發(fā)送檢測點記錄請求,以使所述主卷和所述備份卷更新各自的檢測點。
4.根據(jù)權(quán)利要求1或3所述的方法,其特征在于,所述向所述虛擬塊存儲客戶端的內(nèi)核 上報寫入操作的結(jié)果之后,還包括檢查臟數(shù)據(jù)塊列表中是否有臟數(shù)據(jù);當所述臟數(shù)據(jù)塊列表中有臟數(shù)據(jù),且滿足預(yù)定條件之后,將所述臟數(shù)據(jù)寫到磁盤中。
5.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述接收虛擬塊存儲客戶端的內(nèi)核發(fā)送 的寫操作請求之前,還包括所述虛擬塊存儲客戶端根據(jù)預(yù)先指定的備份卷的監(jiān)聽端口與所述預(yù)先指定的備份卷 建立套接字連接,并獲得所述預(yù)先指定的備份卷的卷大小、檢測點和單節(jié)點位圖;所述虛擬塊存儲客戶端根據(jù)預(yù)先指定的主卷的監(jiān)聽端口與所述預(yù)先指定的主卷建立 套接字連接,并獲得所述預(yù)先指定的主卷的卷大小、檢測點和單節(jié)點位圖;所述虛擬塊存儲客戶端比較所述預(yù)先指定的主卷和所述預(yù)先指定的備份卷的檢測點, 確定最新檢測點對應(yīng)的卷為真正的主卷,次新檢測點對應(yīng)的卷為真正的備份卷;所述虛擬塊存儲客戶端向所述虛擬塊存儲客戶端的內(nèi)核注冊所述真正的主卷和所述 真正的備份卷的角色;當所述真正的主卷與所述真正的備份卷之間的鏈路正常時,所述虛擬塊存儲客戶端將 與所述預(yù)先指定的備份卷建立的套接字連接的描述符,以及與所述預(yù)先指定的主卷建立的 套接字連接的描述符注冊到所述虛擬塊存儲客戶端的內(nèi)核;所述虛擬塊存儲客戶端調(diào)用系統(tǒng)函數(shù)進入內(nèi)核態(tài)線程,在所述內(nèi)核態(tài)線程中處理上層 業(yè)務(wù)程序發(fā)送的寫操作請求。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述虛擬塊存儲客戶端將與所述預(yù)先指 定的備份卷建立的套接字連接的描述符,以及與所述預(yù)先指定的主卷建立的套接字連接的 描述符注冊到所述虛擬塊存儲客戶端的內(nèi)核之前,還包括當所述真正的主卷與所述真正的備份卷之間的鏈路正常時,如果所述真正的主卷與所 述真正的備份卷之間的數(shù)據(jù)不同步,則所述虛擬塊存儲客戶端向所述真正的主卷發(fā)送數(shù)據(jù)同步請求,以使所述真正的主卷與所述真正的備份卷進行數(shù)據(jù)同步。
7.根據(jù)權(quán)利要求2所述的方法,其特征在于,還包括當所述主卷發(fā)生異常時,在所述虛擬塊存儲客戶端的內(nèi)核進行主備倒換,將所述備份 卷注冊為新的主卷之后,所述新的主卷通過所述新的主卷與所述虛擬塊存儲客戶端之間的 套接字連接接收待寫入數(shù)據(jù);所述新的主卷將所述待寫入數(shù)據(jù)寫入所述新的主卷的卷文件之后,更新所述新的主卷 的檢測點和單節(jié)點位圖;所述新的主卷向所述虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。
8.根據(jù)權(quán)利要求2所述的方法,其特征在于,還包括當所述虛擬塊存儲客戶端與所述備份卷之間的鏈路發(fā)生異常時,所述主卷接收所述虛 擬塊存儲客戶端發(fā)送的鏈路異常消息,并將所述鏈路異常消息轉(zhuǎn)發(fā)給所述備份卷,以使所 述備份卷將所述寫入操作的結(jié)果發(fā)送給所述主卷,由所述主卷將所述寫入操作的結(jié)果發(fā)送 給所述虛擬塊存儲客戶端的內(nèi)核;所述鏈路異常消息由所述虛擬塊存儲客戶端的心跳進程 發(fā)送給所述虛擬塊存儲客戶端。
9.根據(jù)權(quán)利要求2所述的方法,其特征在于,還包括當所述主卷和所述備份卷之間的鏈路發(fā)生異常時,所述主卷將所述待寫入數(shù)據(jù)寫入所 述主卷的卷文件之后,更新所述主卷的檢測點和單節(jié)點位圖;所述主卷向所述虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。
10.根據(jù)權(quán)利要求2、7、8或9所述的方法,其特征在于,還包括接收到所述寫入操作的結(jié)果之后,所述虛擬塊存儲客戶端的內(nèi)核確定所述寫入操作的 結(jié)果是否與已發(fā)送的寫操作請求對應(yīng);如果對應(yīng),則所述虛擬塊存儲客戶端的內(nèi)核將所述寫入操作的結(jié)果發(fā)送給所述上層業(yè) 務(wù)程序。
11.一種主卷節(jié)點設(shè)備,其特征在于,包括接收模塊,用于通過所述主卷節(jié)點設(shè)備與虛擬塊存儲客戶端之間的套接字連接接收待 寫入數(shù)據(jù);寫入模塊,用于將所述接收模塊接收的待寫入數(shù)據(jù)寫入所述主卷節(jié)點設(shè)備的卷文件, 并將所述待寫入數(shù)據(jù)通過所述主卷節(jié)點設(shè)備與備份卷節(jié)點設(shè)備之間的套接字連接發(fā)送給 所述備份卷節(jié)點設(shè)備,以便所述備份卷節(jié)點設(shè)備在將所述待寫入數(shù)據(jù)寫入所述備份卷節(jié)點 設(shè)備的卷文件之后,向所述虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。
12.根據(jù)權(quán)利要求11所述的設(shè)備,其特征在于,還包括發(fā)送模塊;所述接收模塊,還用于在接收所述待寫入數(shù)據(jù)之前,接收虛擬塊存儲客戶端的內(nèi)核發(fā) 送的寫操作請求;所述發(fā)送模塊,用于將所述接收模塊接收的寫操作請求轉(zhuǎn)發(fā)給所述備份卷節(jié)點設(shè)備, 所述寫操作請求用于通知所述主卷節(jié)點設(shè)備和/或所述備份卷節(jié)點設(shè)備準備接收所述待 寫入數(shù)據(jù);所述寫操作請求是所述虛擬塊存儲客戶端的內(nèi)核從所述內(nèi)核注冊的請求隊列中 獲取的;所述內(nèi)核注冊的請求隊列中的寫操作請求是所述虛擬塊存儲客戶端接收到上層業(yè) 務(wù)程序發(fā)送的寫操作請求之后,放入所述內(nèi)核注冊的請求隊列中的。
13.根據(jù)權(quán)利要求12所述的設(shè)備,其特征在于,所述發(fā)送模塊,還用于向所述備份卷節(jié)點設(shè)備發(fā)送檢測點記錄請求,以使所述主卷節(jié) 點設(shè)備和所述備份卷節(jié)點設(shè)備更新各自的檢測點。
14.根據(jù)權(quán)利要求11或13所述的設(shè)備,其特征在于,還包括檢查模塊;所述檢查模塊,用于檢查臟數(shù)據(jù)塊列表中是否有臟數(shù)據(jù);所述寫入模塊,還用于當所述臟數(shù)據(jù)塊列表中有臟數(shù)據(jù),且滿足預(yù)定條件之后,將所述 臟數(shù)據(jù)寫到磁盤中。
15.根據(jù)權(quán)利要求12所述的設(shè)備,其特征在于,所述接收模塊,還用于當所述虛擬塊存儲客戶端與所述備份卷節(jié)點設(shè)備之間的鏈路發(fā) 生異常時,接收所述虛擬塊存儲客戶端發(fā)送的鏈路異常消息;所述發(fā)送模塊,還用于將所述接收模塊接收的鏈路異常消息轉(zhuǎn)發(fā)給所述備份卷節(jié)點設(shè) 備,以使所述備份卷節(jié)點設(shè)備將所述寫入操作的結(jié)果發(fā)送給所述主卷節(jié)點設(shè)備,再由所述 發(fā)送模塊將所述寫入操作的結(jié)果發(fā)送給所述虛擬塊存儲客戶端的內(nèi)核;所述鏈路異常消息 由所述虛擬塊存儲客戶端的心跳進程發(fā)送給所述虛擬塊存儲客戶端。
16.根據(jù)權(quán)利要求12所述的設(shè)備,其特征在于,還包括更新模塊;更新模塊,用于當所述主卷節(jié)點設(shè)備和所述備份卷節(jié)點設(shè)備之間的鏈路發(fā)生異常時, 在所述寫入模塊將所述待寫入數(shù)據(jù)寫入所述主卷節(jié)點設(shè)備的卷文件之后,更新所述主卷節(jié) 點設(shè)備的檢測點和單節(jié)點位圖;所述發(fā)送模塊,還用于向所述虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。
17.—種虛擬塊存儲客戶端設(shè)備,其特征在于,包括連接建立模塊,用于根據(jù)預(yù)先指定的備份卷的監(jiān)聽端口與所述預(yù)先指定的備份卷建 立套接字連接,以及根據(jù)預(yù)先指定的主卷的監(jiān)聽端口與所述預(yù)先指定的主卷建立套接字連 接;獲得模塊,用于獲得所述預(yù)先指定的備份卷的卷大小、檢測點和單節(jié)點位圖,以及獲得 所述預(yù)先指定的主卷的卷大小、檢測點和單節(jié)點位圖;比較模塊,用于比較所述預(yù)先指定的主卷和所述預(yù)先指定的備份卷的檢測點;確定模塊,用于根據(jù)所述比較模塊的比較結(jié)果確定最新檢測點對應(yīng)的卷為真正的主 卷,次新檢測點對應(yīng)的卷為真正的備份卷;注冊模塊,用于向所述虛擬塊存儲客戶端設(shè)備的內(nèi)核注冊所述真正的主卷和所述真正 的備份卷的角色,以及當所述真正的主卷與所述真正的備份卷之間的鏈路正常時,將所述 連接建立模塊與所述預(yù)先指定的備份卷建立的套接字連接的描述符,以及所述連接建立模 塊與所述預(yù)先指定的主卷建立的套接字連接的描述符注冊到所述虛擬塊存儲客戶端設(shè)備 的內(nèi)核;調(diào)用模塊,用于調(diào)用系統(tǒng)函數(shù)進入內(nèi)核態(tài)線程,在所述內(nèi)核態(tài)線程中處理上層業(yè)務(wù)程 序發(fā)送的寫操作請求。
18.根據(jù)權(quán)利要求17所述的設(shè)備,其特征在于,還包括請求發(fā)送模塊,用于當所述真正的主卷與所述真正的備份卷之間的鏈路正常時,如果 所述真正的主卷與所述真正的備份卷之間的數(shù)據(jù)不同步,則向所述真正的主卷發(fā)送數(shù)據(jù)同 步請求,以使所述真正的主卷與所述真正的備份卷進行數(shù)據(jù)同步。
19.根據(jù)權(quán)利要求17所述的設(shè)備,其特征在于,還包括主備倒換模塊,用于當所述主卷發(fā)生異常時,在所述虛擬塊存儲客戶端設(shè)備的內(nèi)核進 行主備倒換,將所述備份卷注冊為新的主卷,以使所述新的主卷通過所述新的主卷與所述 虛擬塊存儲客戶端之間的套接字連接接收待寫入數(shù)據(jù),并在將所述待寫入數(shù)據(jù)寫入所述新 的主卷的卷文件之后,更新所述新的主卷的檢測點和單節(jié)點位圖,以及向所述虛擬塊存儲 客戶端設(shè)備的內(nèi)核上報寫入操作的結(jié)果。
20.根據(jù)權(quán)利要求19所述的設(shè)備,其特征在于,還包括結(jié)果接收模塊和結(jié)果發(fā)送模塊;所述結(jié)果接收模塊,用于接收寫入操作的結(jié)果;所述確定模塊,還用于確定所述結(jié)果接收模塊接收的寫入操作的結(jié)果是否與已發(fā)送的 寫操作請求對應(yīng);所述結(jié)果發(fā)送模塊,用于在所述確定模塊確定所述結(jié)果接收模塊接收的寫入操作的結(jié) 果與已發(fā)送的寫操作請求對應(yīng)之后,將所述寫入操作的結(jié)果發(fā)送給所述上層業(yè)務(wù)程序。
21.一種備份卷節(jié)點設(shè)備,其特征在于,包括數(shù)據(jù)接收模塊,用于接收主卷節(jié)點設(shè)備通過所述主卷節(jié)點設(shè)備與備份卷節(jié)點設(shè)備之間 的套接字連接發(fā)送的待寫入數(shù)據(jù);數(shù)據(jù)寫入模塊,用于將所述數(shù)據(jù)接收模塊接收的待寫入數(shù)據(jù)寫入所述備份卷節(jié)點設(shè)備 的卷文件;結(jié)果上報模塊,用于向虛擬塊存儲客戶端設(shè)備的內(nèi)核上報寫入操作的結(jié)果。
22.根據(jù)權(quán)利要求21所述的設(shè)備,其特征在于,還包括請求接收模塊,用于在所述數(shù)據(jù)接收模塊接收待寫入數(shù)據(jù)之前,接收所述主卷節(jié)點設(shè) 備發(fā)送的寫操作請求,所述寫操作請求用于通知所述備份卷節(jié)點設(shè)備準備接收所述待寫入 數(shù)據(jù)。
23.根據(jù)權(quán)利要求22所述的設(shè)備,其特征在于,所述請求接收模塊,還用于在所述結(jié)果上報模塊上報寫入操作的結(jié)果之后,接收所述 主卷節(jié)點設(shè)備發(fā)送的檢測點記錄請求,以更新所述備份卷節(jié)點設(shè)備的檢測點。
24.一種存儲系統(tǒng),其特征在于,包括如權(quán)利要求11-16任意一項所述的主卷節(jié)點設(shè) 備、如權(quán)利要求17-20任意一項所述的虛擬塊存儲客戶端設(shè)備和如權(quán)利要求21-23任意一 項所述的備份卷節(jié)點設(shè)備。
全文摘要
本發(fā)明實施例提供一種數(shù)據(jù)存儲方法、設(shè)備和系統(tǒng),所述數(shù)據(jù)存儲方法可以包括通過主卷與虛擬塊存儲客戶端之間的套接字連接接收待寫入數(shù)據(jù);將所述待寫入數(shù)據(jù)寫入所述主卷的卷文件,并將所述待寫入數(shù)據(jù)通過所述主卷與備份卷之間的套接字連接發(fā)送給所述備份卷,以便所述備份卷在將所述待寫入數(shù)據(jù)寫入所述備份卷的卷文件之后,向所述虛擬塊存儲客戶端的內(nèi)核上報寫入操作的結(jié)果。本發(fā)明實施例可以提高存儲可靠性,降低消息流量,并且備份卷可以分擔(dān)主卷的部分負荷,達到動態(tài)負載均衡的目的。
文檔編號H04L29/08GK102088490SQ20111002171
公開日2011年6月8日 申請日期2011年1月19日 優(yōu)先權(quán)日2011年1月19日
發(fā)明者吳清, 周文明, 鐘炎培 申請人:華為技術(shù)有限公司