專利名稱:基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及分布式存儲領(lǐng)域,尤其涉及基于InfiniBand網(wǎng)絡(luò)的分布式存儲 方法和系統(tǒng)。
背景技術(shù):
目前,計(jì)算機(jī)集群系統(tǒng)上構(gòu)建分布式的內(nèi)存池,主要采取的方式是分布式 共享存儲器(DSM, distributed shared memory),它是指使用一組互聯(lián)的計(jì) 算機(jī),盡管每臺計(jì)算機(jī)擁有自己的存儲器且在物理上是分布的,但看起來像具 有單一編址空間的單一存儲器。 一旦實(shí)現(xiàn)了分布式共享存儲器,那么在集群系 統(tǒng)中的任何一個(gè)節(jié)點(diǎn)的處理器都可以訪問所有的存儲單元,而不管存儲器是否 在本地。使用DSM的引人之處在它的經(jīng)濟(jì)性和可擴(kuò)展性,使用互聯(lián)網(wǎng)就可以 構(gòu)成存儲空間巨大并且十分低廉的內(nèi)存池。但是,在傳統(tǒng)的DSM系統(tǒng)中,采用 全局統(tǒng)一編址,并且每個(gè)數(shù)據(jù)塊在內(nèi)存池中僅有一份數(shù)據(jù)拷貝,當(dāng)多節(jié)點(diǎn)同時(shí) 訪問同一數(shù)據(jù)塊,就需要通過鎖機(jī)制加以控制,在某一時(shí)刻只能有一個(gè)節(jié)點(diǎn)對 數(shù)據(jù)具有控制權(quán),其余節(jié)點(diǎn)處于等待狀態(tài)。這與內(nèi)存池設(shè)計(jì)初衷相違背,內(nèi)存 池設(shè)計(jì)的目的是用來緩存最熱點(diǎn)的數(shù)據(jù),多節(jié)點(diǎn)對同一數(shù)據(jù)訪問會非常頻繁 地出現(xiàn),這直接導(dǎo)致了DSM實(shí)用價(jià)值不高。
于是,現(xiàn)有技術(shù)中包括提出了主拷貝的概念,在內(nèi)存池中一個(gè)數(shù)據(jù)塊可以 存在多份拷貝以減少對共享數(shù)據(jù)的等待時(shí)間,只有一個(gè)主拷貝,其余為副拷貝, 各個(gè)副拷貝如果對數(shù)據(jù)進(jìn)行了更新,及時(shí)反饋給主拷貝。他們更進(jìn)一步提出了 一套基于Hint的內(nèi)存池優(yōu)化策略,尤其是Best-Guess替換算法,極大地減 少了節(jié)點(diǎn)間通信,參見Hint-Based Cooperative Caching . ACM Transactions on Computer Systems, Vol. 18, No. 4, November 2000, Pages 387-419。但是他們設(shè)計(jì)的內(nèi)存池是基于TCP/IP協(xié)議的以太網(wǎng)網(wǎng)絡(luò)環(huán)境,以 太網(wǎng)的數(shù)據(jù)傳輸效率不高也阻礙了數(shù)據(jù)在存儲節(jié)點(diǎn)間的傳遞速度,尤其對于數(shù) 據(jù)需要在各節(jié)點(diǎn)間頻繁傳遞的應(yīng)用時(shí),內(nèi)存池的數(shù)據(jù)緩存作用并不十分顯著。但是如果現(xiàn)有技術(shù)的內(nèi)存池移植到InfiniBand網(wǎng)絡(luò)環(huán)境中,性能并不突出。 原因有二, 一是InfiniBand網(wǎng)絡(luò)協(xié)議特有的優(yōu)勢發(fā)揮不出來,如RDMA和原子 操作,在操作前就應(yīng)該知道數(shù)據(jù)塊在遠(yuǎn)端節(jié)點(diǎn)上的具體位置,而在TCP/IP的 通信模式則是基于請求一響應(yīng)的方式,需要通信雙方z的協(xié)作配合來完成數(shù)據(jù)的 傳輸;二是,現(xiàn)有技術(shù)的內(nèi)存池中的每個(gè)內(nèi)存塊是大小均等,雖然管理簡單, 但是由于RDMA對大數(shù)據(jù)塊的讀寫操作性能更佳,如果在InfiniBand網(wǎng)絡(luò)環(huán)境 下仍然把內(nèi)存劃分為大小均等的±央,如果塊劃分得過小,就會造成RDMA操作 頻繁,如果劃分得過大,就會造成小數(shù)據(jù)也占有一整塊,內(nèi)存資源被嚴(yán)重浪費(fèi), 在理想情況下, 一個(gè)數(shù)據(jù)塊,不論大小,占用一個(gè)等大小內(nèi)存空間, 一次RDMA 操作即可完成讀寫,也就是說,內(nèi)存塊大小應(yīng)該是不等長的,根據(jù)需要不同而 不同。
發(fā)明內(nèi)容
為解決上述問題,本發(fā)明提供基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法和 系統(tǒng),能夠充分發(fā)揮了 InfiniBand優(yōu)點(diǎn),實(shí)現(xiàn)了各節(jié)點(diǎn)間數(shù)據(jù)的快速轉(zhuǎn)移。 本發(fā)明公開了基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,所述方法包括 步驟1,通過InfiniBand網(wǎng)絡(luò)連接節(jié)點(diǎn),所述節(jié)點(diǎn)包括管理主機(jī)和存儲 節(jié)點(diǎn);
步驟2,每兩個(gè)所述節(jié)點(diǎn)間建立InfiniBand通信;步驟3,存儲節(jié)點(diǎn)分配內(nèi)存空間,對所述內(nèi)存空間進(jìn)行預(yù)注冊,將分配的 內(nèi)存空間的相關(guān)信息發(fā)送給其他節(jié)點(diǎn),所述內(nèi)存空間構(gòu)建成內(nèi)存池;
步驟4,管理主機(jī)通過InfiniBand通信接收所述存儲節(jié)點(diǎn)的請求,提供 并維護(hù)所述節(jié)點(diǎn)從后端存儲系統(tǒng)讀入的主拷貝的全局位置信息;
步驟5,所述存儲節(jié)點(diǎn)接收請求,根據(jù)從所述管理主機(jī)獲得的同所述請求 相關(guān)的主拷貝的全局位置信息進(jìn)行同所述請求對應(yīng)的操作,或根據(jù)本地存儲的 其他存儲節(jié)點(diǎn)分配的內(nèi)存空間相關(guān)信息進(jìn)行所述請求對應(yīng)的操作。
所述步驟1還包括,通過以太網(wǎng)絡(luò)連接節(jié)點(diǎn);
所述步驟2進(jìn)一步為,
步驟21,建立以太網(wǎng)絡(luò)通信;
步驟22,節(jié)點(diǎn)通過以太網(wǎng)絡(luò)獲得其他節(jié)點(diǎn)的InfiniBand通信句柄,并將所述InfiniBand通信句柄存儲到所述節(jié)點(diǎn)的通信域。 所述步驟3進(jìn)一步包括
步驟31,所述存儲節(jié)點(diǎn)分配一塊內(nèi)存空間,將所述內(nèi)存空間拴住,使所 述內(nèi)存空間的數(shù)據(jù)不被交換到交換空間;
步驟32,對所述內(nèi)存空間進(jìn)行預(yù)注冊,將與分配內(nèi)存空間的位置和屬性 相關(guān)信息記錄到InfiniBand通信句柄中對應(yīng)字段,并發(fā)送給其他節(jié)點(diǎn);
步驟33,節(jié)點(diǎn)接收所述InfiniBand通信句柄中對應(yīng)字段,并存儲到所述 節(jié)點(diǎn)的通信域?qū)?yīng)的通信句柄中。
所述步驟4中請求包括獲取主拷貝位置信息請求和注冊新主拷貝請求,
所述步驟4進(jìn)一步為,
步驟51,所述管理主機(jī)將文件的數(shù)據(jù)塊的主拷貝的全局位置信息以文件 名為索引存儲到所述管理主機(jī)的主拷貝位置信息域;
步驟52,所述管理主機(jī)接收到包含文件名的獲取主拷貝位置信息請求時(shí), 通過所述文件名在所述主拷貝位置信息域中査找對應(yīng)文件數(shù)據(jù)塊的全局位置 信息,并返回給請求的存儲節(jié)點(diǎn);
步驟53,所述管理主機(jī)接收到從后端存儲系統(tǒng)讀入數(shù)據(jù)塊的主拷貝的存 儲節(jié)點(diǎn)發(fā)送的注冊新主拷貝請求后,根據(jù)所述注冊新主拷貝請求更新所述主拷 貝位置信息域。
在所述存儲節(jié)點(diǎn)接收到讀寫請求時(shí),所述步驟5進(jìn)一步為,
步驟81,所述存儲節(jié)點(diǎn)從請求中獲得請求讀取的數(shù)據(jù)塊名字,所述數(shù)據(jù) 塊名字包含數(shù)據(jù)塊所在文件的文件名和所述數(shù)據(jù)塊在所述文件中的偏移;
步驟82,根據(jù)所述數(shù)據(jù)塊名字從所述管理主機(jī)中獲得所述數(shù)據(jù)塊的主拷 貝的全局位置信息,在所述內(nèi)存池中査詢所述數(shù)據(jù)塊;
步驟83,如果所述數(shù)據(jù)塊的主拷貝不在所述存儲節(jié)點(diǎn)本地,則復(fù)制所述 主拷貝為一個(gè)副拷貝,存儲到本地。
在所述存儲節(jié)點(diǎn)接收到數(shù)據(jù)塊查詢請求時(shí),所述步驟5進(jìn)一步為, / 步驟91,所述存儲節(jié)點(diǎn)獲得數(shù)據(jù)塊查詢請求中包含的請求查詢的數(shù)據(jù)塊 名字;
步驟92,根據(jù)所述數(shù)據(jù)塊名字從所述管理主機(jī)獲得所述數(shù)據(jù)塊的主拷貝 的全局位置信息,在所述內(nèi)存池中查詢所述數(shù)據(jù)塊。在所述存儲節(jié)點(diǎn)接收到替換請求時(shí),所述步驟5進(jìn)一步為, 步驟lll,所述存儲節(jié)點(diǎn)從內(nèi)存池中選擇待用的內(nèi)存子塊; 步驟112,所述存儲節(jié)點(diǎn)返回所述待用的內(nèi)存子塊位置信息。 所述步驟83還包括,z
步驟181,當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)副拷貝進(jìn)行寫操作完成后,發(fā)送多播 消息使其他存儲節(jié)點(diǎn)上的副拷貝失效,將包含寫操作中更新數(shù)據(jù)信息的Diff 結(jié)果發(fā)送給主拷貝所在存儲節(jié)點(diǎn),以使主拷貝進(jìn)行同步更 新;
步驟182,當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作完成后,發(fā)送多播 消息,使每個(gè)副拷貝無效。 所述步驟83還包括,
步驟191,當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)副拷貝進(jìn)行寫操作前,發(fā)送多播消息, 其他存儲節(jié)點(diǎn)上的副拷貝失效,將副拷貝對應(yīng)的主拷貝加鎖;
步驟192,當(dāng)存儲節(jié)點(diǎn)對所述副拷貝進(jìn)行寫操作完成后,將包含寫操作中 更新數(shù)據(jù)信息的Diff結(jié)果發(fā)送給所述主拷貝所在存儲節(jié)點(diǎn),以使主拷貝解鎖, 并進(jìn)行同步更新;
步驟193,當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作前,對自身加鎖, 并發(fā)送多播消息使每個(gè)副拷貝無效;
步驟194,當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作完成后,對自身解鎖。
本發(fā)明還公開了基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),所述系統(tǒng)包括 通過InfiniBand網(wǎng)絡(luò)連接的節(jié)點(diǎn),所述節(jié)點(diǎn)包括一個(gè)管理主機(jī)和多個(gè)存儲節(jié) 點(diǎn);
每兩個(gè)所述節(jié)點(diǎn)間建立InfiniBand通信; 所述存儲節(jié)點(diǎn)包括內(nèi)存分配模塊和請求處理模塊,
所述內(nèi)存分配模塊,用于分配內(nèi)存空間,對所述內(nèi)存空間進(jìn)行預(yù)注冊,將 分配的內(nèi)存空間的相關(guān)信息發(fā)送給其他節(jié)點(diǎn),所述內(nèi)存空間構(gòu)建成內(nèi)存池;
所述請求處理模塊,用于接收請求,根據(jù)從所述管理主機(jī)獲得的同所述請 求相關(guān)的主拷貝的全局位置信息進(jìn)行同所述請求對應(yīng)的操作,或根據(jù)本地存儲 的其他存儲節(jié)點(diǎn)分配的內(nèi)存空間相關(guān)信息進(jìn)行所述請求對應(yīng)的操作所述管理主機(jī),用于通過InfiniBand通信接收所述存儲節(jié)點(diǎn)的請求,提 供并維護(hù)所述節(jié)點(diǎn)從后端存儲系統(tǒng)讀入的主拷貝的全局位置信息。 所述節(jié)點(diǎn)還通過以太網(wǎng)絡(luò)連接; 所述節(jié)點(diǎn)包括通信域;
所述每兩個(gè)所述節(jié)點(diǎn)間建立InfiniBand通信進(jìn)一步為,建立以太網(wǎng)絡(luò)通 信;節(jié)點(diǎn)通過以太網(wǎng)絡(luò)獲得其他節(jié)點(diǎn)的InfiniBand通信句柄,并將所述 InfiniBand通信句柄存儲到所述節(jié)點(diǎn)的通信域。
所述內(nèi)存分配模塊進(jìn)一步用于分配一塊內(nèi)存空間,將所述內(nèi)存空間拴住, 使所述內(nèi)存空間的數(shù)據(jù)不被交換到交換空間;對所述內(nèi)存空間進(jìn)行預(yù)注冊,將 與分配內(nèi)存空間的位置和屬性相關(guān)信息記錄到InfiniBand通信句柄中對應(yīng)字 段,并發(fā)送給其他節(jié)點(diǎn);在接收其他存儲節(jié)點(diǎn)發(fā)送的InfiniBand通信句柄中 對應(yīng)字段時(shí),將所述InfiniBand通信句柄中對應(yīng)字段存儲到所述存儲節(jié)點(diǎn)的 通信域?qū)?yīng)的通信句柄中;
所述管理主機(jī)還用于接收存儲節(jié)點(diǎn)發(fā)送的InfiniBand通信句柄中對應(yīng)字 段,并存儲到所述管理主機(jī)的通信域?qū)?yīng)的通信句柄中。
所述管理主機(jī)接收的請求包括獲取主拷貝位置信息請求和注冊新主拷貝 請求,
所述管理主機(jī)進(jìn)一步包括信息存儲模塊、信息提供模塊和信息更新模塊,
所述信息存儲模塊,用于將文件的數(shù)據(jù)塊的主拷貝的全局位置信息以文件 名為索引存儲到所述管理主機(jī)的主拷貝位置信息域;
所述信息提供模塊,用于所述管理主機(jī)接收到包含文件名的獲取主拷貝位 置信息請求時(shí),通過所述文件名在所述主拷貝位置信息域中査找對應(yīng)文件數(shù)據(jù) 塊的全局位置信息,并返回給請求的存儲節(jié)點(diǎn);
所述信息更新模塊,用于所述管理主機(jī)接收到從后端存儲系統(tǒng)讀入數(shù)據(jù)塊 的主拷貝的存儲節(jié)點(diǎn)發(fā)送的注冊新主拷貝請求后,根據(jù)所述注冊新主拷貝請求 更新所述主拷貝位置信息域。
所述請求處理模塊進(jìn)一步包括讀寫請求處理模塊和用于根據(jù)所述數(shù)據(jù)塊 名字從所述管理主機(jī)中獲得所述數(shù)據(jù)塊的主拷貝的全局位置信息,在所述內(nèi)存 池中査詢數(shù)據(jù)塊的査詢模塊,
所述讀寫請求處理模塊,用于在所述存儲節(jié)點(diǎn)接收到讀寫請求時(shí),從請求中獲得請求讀取的數(shù)據(jù)塊名字,所述數(shù)據(jù)塊名字包含數(shù)據(jù)塊所在文件的文件名 和所述數(shù)據(jù)塊在所述文件中的偏移,將所述數(shù)據(jù)塊名字發(fā)給所述查詢模塊; 所述査詢模塊在所述內(nèi)存池中査詢所述數(shù)據(jù)塊;
所述讀寫請求處理模塊,還用于根據(jù)查詢結(jié)果,如果所述數(shù)據(jù)塊的主拷^貝 不在所述存儲節(jié)點(diǎn)本地,則復(fù)制所述主拷貝為一個(gè)副拷貝,存儲到本地。 所述請求處理模塊進(jìn)一步包括査詢請求處理模塊,
所述査詢請求處理模塊,進(jìn)一步用于在所述存儲節(jié)點(diǎn)接收到數(shù)據(jù)塊査詢請 求時(shí),獲得數(shù)據(jù)塊査詢請求中包含的請求査詢的數(shù)據(jù)塊名字,將所述數(shù)據(jù)塊名 字發(fā)給所述査詢模塊;
所述查詢模塊在所述內(nèi)存池中査詢所述數(shù)據(jù)塊。
所述請求處理模塊進(jìn)一步包括替換請求處理模塊,
所述替換請求處理模塊,用于在所述存儲節(jié)點(diǎn)接收到替換請求時(shí),啟動所 述替換模塊從內(nèi)存池中選擇待用的內(nèi)存子塊;返回所述待用的內(nèi)存子塊位置信 息。
所述讀寫請求處理模塊還用于當(dāng)對本地的一個(gè)副拷貝進(jìn)行寫操作完成后, 發(fā)送多播消息使其他存儲節(jié)點(diǎn)上的副拷貝失效,將包含寫操作中更新數(shù)據(jù)信息 的Diff結(jié)果發(fā)送給主拷貝所在存儲節(jié)點(diǎn),以使主拷貝進(jìn)行同步更新;當(dāng)存儲 節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作完成后,發(fā)送多播消息,使每個(gè)副拷貝無 效。
所述讀寫請求處理模塊還用于當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)副拷貝進(jìn)行寫操 作前,發(fā)送多播消息,其他存儲節(jié)點(diǎn)上的副拷貝失效,將副拷貝對應(yīng)的主拷貝 加鎖;當(dāng)存儲節(jié)點(diǎn)對所述副拷貝進(jìn)行寫操作完成后,將包含寫操作中更新數(shù)據(jù) 信息的Diff結(jié)果發(fā)送給所述主拷貝所在存儲節(jié)點(diǎn),以使主拷貝解鎖,并進(jìn)行 同步更新;當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作前,對自身加鎖,并發(fā) 送多播消息使每個(gè)副拷貝無效;當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作完 成后,對自身解鎖。
本發(fā)明的有益效果在于,通過利用RDMA(Remote Direct Memory Access) 和原子操作提高數(shù)據(jù)傳輸效率,降低存儲CPU開銷,并減少了節(jié)點(diǎn)間交互;通 過通訊機(jī)制的提前建立和內(nèi)存預(yù)分配機(jī)制,最大程度地降低了通信開銷,提高 數(shù)據(jù)傳輸效率;利用多數(shù)據(jù)拷貝減少節(jié)點(diǎn)間數(shù)據(jù)競爭,利用主副本區(qū)分管理,
19減輕維護(hù)數(shù)據(jù)一致性的復(fù)雜程度;利用基于本地的替換策略,減少了節(jié)點(diǎn)間交 互;以太網(wǎng)和InfiniBand網(wǎng)雙網(wǎng)絡(luò)連接,增強(qiáng)系統(tǒng)的健壯性。
圖1是本發(fā)明基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法的流程圖2是本發(fā)明節(jié)點(diǎn)的連接結(jié)構(gòu)圖3是管理主機(jī)的數(shù)據(jù)結(jié)構(gòu)圖4是存儲節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)圖5是主拷貝和副拷貝關(guān)系示意圖6是弱一致性的流程圖7是強(qiáng)一致性的流程圖8是存儲節(jié)點(diǎn)的結(jié)構(gòu)圖9是管理主機(jī)的結(jié)構(gòu)圖。
具體實(shí)施例方式
下面結(jié)合附圖,對本發(fā)明做進(jìn)一步的詳細(xì)描述。
本發(fā)明基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法的流程如圖1所示。 歩驟S101,通過InfiniBand網(wǎng)絡(luò)連接節(jié)點(diǎn)。 所述節(jié)點(diǎn)包括管理主機(jī)和存儲節(jié)點(diǎn)。
同時(shí),通過以太網(wǎng)絡(luò)連接節(jié)點(diǎn),使得任意兩個(gè)節(jié)點(diǎn)間的連接包括 InfiniBand網(wǎng)絡(luò)和千兆以太網(wǎng)。管理主機(jī)和存儲節(jié)點(diǎn)間的連接關(guān)系如圖2所 示。
管理主機(jī),用于存儲并維護(hù)各存儲節(jié)點(diǎn)內(nèi)存子塊的全局位置信息,并提供 通過文件名來檢索該文件所有內(nèi)存子塊的位置信息,管理主機(jī)有兩個(gè)守護(hù)線程 分別負(fù)責(zé)InfiniBand通信和以太網(wǎng)通信,每當(dāng)有一個(gè)新請求到達(dá)時(shí),創(chuàng)建一 個(gè)新線程來對請求進(jìn)行響應(yīng)。管理主機(jī)支持的請求包括獲取主拷貝位置信息請 求和注冊新主拷貝請求。
存儲節(jié)點(diǎn),每個(gè)存儲節(jié)點(diǎn)在管理主機(jī)中注冊一塊內(nèi)存,作為內(nèi)存池的組成 部分。每個(gè)存儲節(jié)點(diǎn)同樣有兩個(gè)守護(hù)線程分別負(fù)責(zé)InfiniBand通信和以太網(wǎng) 通信;支持的請求有對數(shù)據(jù)塊的查詢、讀寫和替換。存儲節(jié)點(diǎn)同后端存儲系統(tǒng)連接,可以從該后端存儲系統(tǒng)提取數(shù)據(jù)。
其中管理主機(jī)為一臺,存儲節(jié)點(diǎn)為多臺。
步驟S102,每兩個(gè)節(jié)點(diǎn)間建立InfiniBand通信。 該步驟S10具體實(shí)施方式
如下。 z 步驟201,建立以太網(wǎng)絡(luò)通信。
每個(gè)節(jié)點(diǎn)中包括通信域如圖3和圖4所示。管理主機(jī)中包括通信域和主拷 貝位置信息域,如圖3所示。其中,通信域包括InfiniBand通信句柄和以太 網(wǎng)句柄。
以太網(wǎng)間通信使用Socket套接字,把Socket句柄信息存儲到通信域的以 太網(wǎng)句柄中,網(wǎng)絡(luò)中有N節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)與基余N—1個(gè)節(jié)點(diǎn),包括管理主機(jī), 都有一個(gè)有效Socket句柄,并把該節(jié)點(diǎn)與自身通信的句柄設(shè)為NULL,共N個(gè) 有效句柄。
步驟202,節(jié)點(diǎn)通過以太網(wǎng)絡(luò)獲得其他節(jié)點(diǎn)的InfiniBand通信句柄,并 將該InfiniBand通信句柄存儲到該節(jié)點(diǎn)的通信域。
每個(gè)節(jié)點(diǎn)通過獲取網(wǎng)絡(luò)設(shè)備(IB HCA)及端口的屬性,并創(chuàng)建保護(hù)域(PD)、 完成隊(duì)列(CQ);再利用步驟201中的Socket句柄進(jìn)行以太網(wǎng)通信,顯式傳 遞隊(duì)列對兒(QP)相關(guān)信息,包括Port LID和QP Number,給通信對方節(jié)點(diǎn), 然后轉(zhuǎn)變QP隊(duì)列對兒狀態(tài),使其進(jìn)入可通信狀態(tài),把得到的句柄信息存入通 信域的InfiniBand通信句柄空間中。InfiniBand通信句柄信息包括lid,qpn, psn rkey, vaddr,其中,rkey和vaddr的值暫時(shí)為空,在進(jìn)行內(nèi)存的預(yù)注冊 時(shí)加入相關(guān)的值。因?yàn)镮nfiniBand網(wǎng)絡(luò)協(xié)議也是點(diǎn)對點(diǎn)通信,所以,也有N 個(gè)有效的InfiniBand通信句柄。
lid, qpn, psn rkey, vaddr是InfiniBand協(xié)議中通訊所必須的要素,lid 本地節(jié)點(diǎn)的標(biāo)識號,Qpn隊(duì)列對兒號,psn包序列號,rkey遠(yuǎn)端注冊的內(nèi)存的 鍵值,vaddr遠(yuǎn)端注冊內(nèi)存的首地址偏移。
在任意兩節(jié)點(diǎn)間都建立InfiniBand網(wǎng)絡(luò)和以太網(wǎng)的雙網(wǎng)絡(luò)連接的目的包 括第一,InfAniBand網(wǎng)絡(luò)建立初始化連接需要通過以太網(wǎng)來交換信息;第 二,增強(qiáng)系統(tǒng)的健壯性,如果InfiniBand網(wǎng)絡(luò)傳輸失敗,還可以通過以太網(wǎng) 進(jìn)行傳輸。
步驟S103,存儲節(jié)點(diǎn)分配內(nèi)存空間,對該內(nèi)存空間進(jìn)行預(yù)注冊,將分配的內(nèi)存空間的相關(guān)信息發(fā)送給其他節(jié)點(diǎn),該內(nèi)存空間構(gòu)建成內(nèi)存池。
該步驟S10具體實(shí)施方式
如下所述。
步驟301,所述存儲節(jié)點(diǎn)分配一塊內(nèi)存空間,將所述內(nèi)存空間拴住(pin), 使所述內(nèi)存空間的數(shù)據(jù)不被交換到交換空間(Swap)。
步驟302,對該內(nèi)存空間進(jìn)行預(yù)注冊,將與分配內(nèi)存位置和屬性相關(guān)注冊 信息記錄到InfiniBand通信句柄中對應(yīng)字段,并發(fā)送給其他節(jié)點(diǎn),節(jié)點(diǎn)接收 所述InfiniBand通信句柄中對應(yīng)字段,并存儲到所述節(jié)點(diǎn)的通信域?qū)?yīng)于所 述發(fā)送節(jié)點(diǎn)的通信句柄中。
在InfiniBand協(xié)議下,對分配的內(nèi)存空間進(jìn)行提前注冊,把內(nèi)存注冊生 成句柄mr,再通過以太網(wǎng)通信,接收信息節(jié)點(diǎn)將遠(yuǎn)端內(nèi)存鍵值(mr-〉rkey)、 內(nèi)存空間首地址(vaddr )和內(nèi)存空間大小(mem—size)等信息填入通信域相 關(guān)聯(lián)的InfiniBand通信句柄中。
步驟303,存儲節(jié)點(diǎn)采用Slab分配器管理內(nèi)存空間的分配和釋放。
通過步驟S103,只需要一次注冊,在使用該內(nèi)存池中任一內(nèi)存子塊時(shí), 只需計(jì)算出該內(nèi)存子塊相對于所在節(jié)點(diǎn)的內(nèi)存空間的首地址的偏移,便可以 和遠(yuǎn)端節(jié)點(diǎn)進(jìn)行數(shù)據(jù)的相關(guān)操作。
為了更有效地使用內(nèi)存,采用Slab分配器來對內(nèi)存空間的分配釋放等相 關(guān)操作進(jìn)行管理。
InfiniBand通信協(xié)議支持三種通信方式,包括Send/Receive、 RDMA read/write和原子操作。
其中RDMA和原子操作是InfiniBand協(xié)議所特有的,RDMA不使用通信被 動方的CPU資料,原子操作保證執(zhí)行的操作的原子性。該三種通信方式適用于 不同的應(yīng)用情況,當(dāng)需要利用通信被動方的CPU做進(jìn)一步地處理時(shí),只能用 Send/Receive操作;如果通信主動方已經(jīng)知道它所需要資源在何處,不需要 通信被動方CPU做相關(guān)處理時(shí),可以使用Send/Receive,也可以使用RDMA, 但RDMA節(jié)省CPU資源,提高通信效率,在此情況下,本發(fā)明都采用RDMA進(jìn)行 通信;當(dāng)通信主動方已經(jīng)知道資源在何處y并要對資源的某些地方做少量的數(shù) 據(jù)修改,采用原子操作。
本發(fā)明的盡可能多地使用RDMA和原子操作,以發(fā)揮InfiniBand的優(yōu)勢。 在本發(fā)明中,對數(shù)據(jù)塊的讀寫操作都是采用RDMA read/write;對各種結(jié)構(gòu)體
22標(biāo)志的修改,都采用原子操作。
為了支持RDMA和原子操作,通信前必須已經(jīng)知道它所需要資源存儲的具 體位置,并且讀到數(shù)據(jù)后必須能判斷出該數(shù)據(jù)是否已失效等相關(guān)信息,所以, 本發(fā)明的內(nèi)存池與現(xiàn)有技術(shù)以太網(wǎng)的內(nèi)存池有如下不同
第一,本發(fā)明中在內(nèi)存池中任何一個(gè)內(nèi)存子塊都可以通過該節(jié)點(diǎn)的句柄信
息和內(nèi)存子塊相對于內(nèi)存空間首地址偏移聯(lián)合唯一決定,由此可確定內(nèi)存子塊 在內(nèi)存池中的位置。
第二,任何一個(gè)內(nèi)存子塊都包含塊頭和數(shù)據(jù),其中塊頭包括數(shù)據(jù)標(biāo)志位, 分別記錄,數(shù)據(jù)是否有效、是否是文件的數(shù)據(jù)塊的主拷貝、是否加鎖、是否是 向?qū)?biāo)識以及向?qū)У刂?可以為空)相關(guān)信息,該塊頭中和各標(biāo)志位相對于該 子塊的首地址的偏移是固定的,也就是說,如果知道了內(nèi)存子塊的位置,通過 計(jì)算,就可以得到子塊各標(biāo)志位的位置。從而,在通信前便可以計(jì)算出資源存 儲的具體位置,以及該資標(biāo)志位的位置,可以通過RDMA讀寫數(shù)據(jù)或者原子操 作來修改該資源的標(biāo)志位。
步驟S104,管理主機(jī)通過InfiniBand通信接收所述存儲節(jié)點(diǎn)的請求,提
供并維護(hù)所述節(jié)點(diǎn)從后端存儲系統(tǒng)讀入的主拷貝的全局位置信息。
管理主機(jī)中包括兩個(gè)信息域通信域和主拷貝位置信息域,如圖3所示其 中主拷貝為內(nèi)存節(jié)點(diǎn)從后端存儲系統(tǒng)讀入的數(shù)據(jù)塊。
通信域的初始化工作在步驟S102和步驟S103中已經(jīng)完成。 主拷貝位置信息域記錄的是主拷貝的全局位置信息。如圖3所示,主拷貝 的定位是以它所屬文件的文件名為關(guān)鍵字索引,通過對文件名進(jìn)行哈希計(jì)算, 根據(jù)哈希值,找到相對應(yīng)文件信息,再在文件信息中找到文件的數(shù)據(jù)塊的主拷 貝的全局位置信息。初始化時(shí)哈希表為空,在運(yùn)行一段時(shí)間后,它會指向一系 列的文件名,再由文件名關(guān)聯(lián)相應(yīng)的數(shù)據(jù)塊的主拷貝的全局位置信息。
管理主機(jī)啟動兩個(gè)通信線程作守護(hù)線程, 一個(gè)是InfiniBand通信線程, 一個(gè)是基于Socket的通信線程。當(dāng)有新請求到達(dá)時(shí),通信線程就會創(chuàng)建一個(gè) 新線程來處理相應(yīng)的請求,處理結(jié)束,自動銷毀該線程。由于要頻繁^k創(chuàng)建和 刪除線程,所以本發(fā)明使用線程池對線程進(jìn)行管理。
管理主機(jī)支持的請求包括獲取主拷貝位置信息請求和注冊新主拷貝請求。 管理主機(jī)處理請求的過程具體如下所述。步驟401,管理主機(jī)接收到包含文件名的獲取主拷貝位置信息請求時(shí),通 過所述文件名在所述主拷貝位置信息域中査找對應(yīng)文件數(shù)據(jù)塊的全局位置信 息,并返回給請求的存儲節(jié)點(diǎn)。
具體實(shí)施方式
為由文件名通過哈希計(jì)算在哈希表找到該文件所有數(shù)據(jù)i央
的主拷貝的全局位置信息,返回結(jié)果給請求的存儲節(jié)點(diǎn)。
步驟402,管理主機(jī)接收到從后端存儲系統(tǒng)讀入數(shù)據(jù)塊的主拷貝的存儲節(jié) 點(diǎn)發(fā)送的注冊新主拷貝請求后,根據(jù)所述注冊新主拷貝請求更新所述主拷貝位 置信息域。
根據(jù)注冊新主拷貝請求中文件名判斷所述主拷貝位置信息域中是否存儲 對應(yīng)記錄,如果是,則用新主拷貝的全局位置信息更新所述對應(yīng)記錄;否則,
建立基于所述文件名的結(jié)構(gòu)體,在所述主拷貝位置信息域中存儲所述新主拷貝 的全局位置信息。
管理主機(jī)InfiniBand通信采用Send/Receive操作。
因?yàn)?,兩種請求都需要管理主機(jī)做哈希計(jì)算和査詢等相關(guān)工作,所以必須 知道請求是何時(shí)到達(dá)。
步驟S105,存儲節(jié)點(diǎn)接收請求,從所述管理主機(jī)獲得請求相關(guān)的主拷貝 的全局位置信息,根據(jù)所述全局位置信息進(jìn)行同所述請求相應(yīng)的操作或根據(jù)本 地存儲的其他節(jié)點(diǎn)的分配的內(nèi)存空間相關(guān)信息,進(jìn)行所述請求相應(yīng)的操作。
存儲節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)如圖4所示,其中存儲節(jié)點(diǎn)上有三個(gè)信息域通信域、 最老塊時(shí)間域和本地內(nèi)存子塊的位置信息域。
通信域的初始化工作在步驟S102和步驟S103中已經(jīng)完成。
最老塊時(shí)間域,用來存儲其它節(jié)點(diǎn)上最早最少使用塊(LRU)的時(shí)間信息, 如圖4所示,用以估算內(nèi)存池全局最老塊的位置信息。最老時(shí)間域中存儲的信 息采用的是惰性更新機(jī)制,當(dāng)某一節(jié)點(diǎn)的LRU發(fā)生變化時(shí),它不會主動去通 知其它節(jié)點(diǎn)更新最老時(shí)間域,而是等到因?yàn)槟撤N請求,兩節(jié)點(diǎn)在通信時(shí),才會 彼此交換LRU,更新各自的最老塊時(shí)間域。每個(gè)存儲節(jié)點(diǎn)都存儲有其余存儲節(jié) 點(diǎn)上LRU塊的時(shí)間信息。因?yàn)槊看芜M(jìn)行替換時(shí)都要取其他存儲節(jié)點(diǎn)的LRU和自 身的LRU比較,所以從效率上考慮,本發(fā)明采用了大頂堆排序方式來組織管理 最老塊時(shí)間域中記錄的其他存儲節(jié)點(diǎn)的LRU。
本地內(nèi)存子塊的位置信息域,用于記錄管理本地內(nèi)存子塊的相關(guān)信息,如
24圖4所示。本地內(nèi)存的每個(gè)內(nèi)存子塊都對應(yīng)有一個(gè)位置信息區(qū),記錄該內(nèi)存子 塊查找路徑。
對于不同內(nèi)存子塊連接,采作三種形式, 一種是普通的鏈?zhǔn)竭B接,把最近 新生成的子塊加入到鏈表首部;第二種是接LRU方式把所有的子塊連接成一個(gè) LRU鏈表,并隨著子塊的使用,實(shí)時(shí)地調(diào)整該LRU鏈表,該鏈表是為了計(jì)算全 局最老時(shí)間塊而設(shè)置的,該LRU鏈表為最老塊時(shí)間表;第三種是把所有的子塊 按子塊名的排序建立平衡二叉樹(AVL樹),AVL樹的有序的二叉樹,査詢時(shí) 間logN,査詢效率較高。在本發(fā)明具體實(shí)施例中,該三種連接方式同時(shí)存在, 當(dāng)有一個(gè)內(nèi)存子塊發(fā)生變化,該三種鏈表都要作對應(yīng)的調(diào)整。
存儲節(jié)點(diǎn)也啟動兩個(gè)通信線程,InfiniBand通信線程和基于Socket的通 信線線程。當(dāng)有新請求到達(dá)時(shí),通信線程就會創(chuàng)建一個(gè)新線程來處理相應(yīng)的請 求,使用線程池對線程進(jìn)行管理。
存儲節(jié)點(diǎn)上支持的請求有三種分別為數(shù)據(jù)塊査詢請求,替換請求,讀寫請求。
步驟501,在存儲節(jié)點(diǎn)接收到査詢請求或接收到讀寫請求進(jìn)行讀取前,進(jìn) 行査詢操作。
在本發(fā)明中數(shù)據(jù)塊名字包括數(shù)據(jù)塊所在文件的文件名和該數(shù)據(jù)塊在文件 中的偏移。具體査詢步驟如下所述。
步驟511,所述存儲節(jié)點(diǎn)通過向所述管理主機(jī)發(fā)送包含所述文件名的獲取 主拷貝位置信息請求,將所述文件的所有數(shù)據(jù)塊的主拷貝的全局位置信息預(yù)讀 到本地。
對文件的所有數(shù)據(jù)塊進(jìn)行預(yù)讀是為了減少同管理主機(jī)間的頻繁通信。 步驟512,所述存儲節(jié)點(diǎn)根據(jù)所述數(shù)據(jù)塊的主拷貝的全局位置信息在內(nèi)存 池中査詢所述數(shù)據(jù)塊的主拷貝,如果査詢到,則返回査詢到的主拷貝的位置信 息,否則,執(zhí)行步驟513。
進(jìn)行査詢的具體實(shí)施方式
如下。 /根據(jù)獲得的全局位置信息到相應(yīng)節(jié)點(diǎn)上讀取對應(yīng)內(nèi)存子塊的塊頭,塊頭中 數(shù)據(jù)塊名字和欲査詢數(shù)據(jù)塊名比較,如果匹配,査詢成功,如果不匹配,査看 塊頭中的向?qū)?,如果向?qū)挥行Вf明數(shù)據(jù)塊已經(jīng)被替換到另一個(gè)節(jié)點(diǎn),則 按所述向?qū)У刂窎苏蚁乱还?jié)點(diǎn)。如果最后査找到的內(nèi)存子塊向?qū)粸闊o效或査詢的節(jié)點(diǎn)數(shù)超過預(yù)設(shè)值,則查詢失敗。
配置預(yù)設(shè)值為5。設(shè)置一個(gè)向?qū)в?jì)數(shù)器,初始值設(shè)為5次,每查詢一個(gè)節(jié) 點(diǎn),計(jì)數(shù)器值減一,減到零仍沒查找到主拷貝,認(rèn)為査詢失敗,從后端重新讀 入數(shù)據(jù)塊,在管理主機(jī)上修改主拷貝的全局位置信息。如此操作,雖然對一個(gè) 數(shù)據(jù)塊會出現(xiàn)兩個(gè)主拷貝,但在管理主機(jī)上只能査詢到新主拷貝的位置信息, 舊的主拷貝被稱為野數(shù)據(jù),沒有指針指向它,也不會再被節(jié)點(diǎn)訪問,在長時(shí)間 不被使用,按S502的替換操作,其中數(shù)據(jù)被從內(nèi)存池中刪除。所以雖然在某 段時(shí)間會出現(xiàn)多個(gè)主拷貝,但不會影響數(shù)據(jù)一致性。
步驟513,所述存儲節(jié)點(diǎn)根據(jù)數(shù)據(jù)塊名字從所述后端存儲系統(tǒng)讀入所述數(shù) 據(jù)塊的新主拷貝,從內(nèi)存池中選擇內(nèi)存子塊,將所述新主拷貝存儲到所述內(nèi)存 子塊。
步驟514,所述存儲節(jié)點(diǎn)返回所述數(shù)據(jù)塊的新主拷貝的位置信息,并向所 述管理主機(jī)發(fā)送注冊新主拷貝請求。
通過上述査詢操作,不管數(shù)據(jù)以前是否緩存在內(nèi)存池中,査詢都能在內(nèi)存 池中找到數(shù)據(jù)塊的對應(yīng)位置,除非該數(shù)據(jù)在后端存儲系統(tǒng)中也不存在。
步驟502,存儲節(jié)點(diǎn)接收到替換請求或從后端存儲系統(tǒng)中讀取新數(shù)據(jù)時(shí), 從內(nèi)存池中選擇待用的內(nèi)存子塊。
選擇完成后,如果是由替換請求引起選擇的情況,該存儲節(jié)點(diǎn)返回選擇的 待用內(nèi)存子塊位置信息。
選擇待用的內(nèi)存子塊具體實(shí)施方式
如下所述。
步驟521,所述存儲節(jié)點(diǎn)根據(jù)通信域和本地內(nèi)存子塊位置信息域判斷所述 內(nèi)存池中是否存在空閑空間,如果所述存儲節(jié)點(diǎn)本地存在,則從所述空閑空間 中選擇的待用的內(nèi)存子塊;如果空閑空間不在所述存儲節(jié)點(diǎn)本地,則將本地?cái)?shù) 據(jù)塊內(nèi)容拷貝到所述空閑空間,本地騰出的內(nèi)存空間為待用的內(nèi)存子塊;如果 內(nèi)存池不存在空閑空間,執(zhí)行步驟522。
步驟522,檢查所述本地最老塊時(shí)間表,判斷所述本地最老塊時(shí)間表中最 早最少使用的內(nèi)存子塊中存儲數(shù)據(jù)是否為主拷貝,如果不是,選擇所述內(nèi)存子 塊為待用的內(nèi)存子塊,執(zhí)行步驟523,否則,執(zhí)行步驟524。
步驟523,判斷已選擇的內(nèi)存子塊的空間加和是否小于要求選擇的空間, 如果是,執(zhí)行所述步驟521。步驟524,檢査所述最老塊時(shí)間域,選擇所述最老塊時(shí)間域中最早最少使 用的內(nèi)存子塊,確定所述內(nèi)存子塊所在節(jié)點(diǎn),從該節(jié)點(diǎn)的本地最老塊時(shí)間表中 選擇一個(gè)或多個(gè)最早最少使用的內(nèi)存子塊,選擇的內(nèi)存子塊的空間和大于或等 于要求選擇的空間;在所述存儲節(jié)點(diǎn)本地的內(nèi)存子塊的塊頭中設(shè)置向?qū)?biāo)志位 為有效,記錄向?qū)У刂窞檫x擇的最老內(nèi)存子塊位置,然后把本地?cái)?shù)據(jù)塊內(nèi)容拷 貝到向?qū)У刂匪赶虻奈恢茫诒镜赜序v出了足夠的內(nèi)存空間;騰出的內(nèi)存空 間為待用的內(nèi)存子塊。
在進(jìn)行讀寫時(shí),本地騰空的位置用于新讀取的數(shù)據(jù)塊的寫入。
新數(shù)據(jù)寫入的具體操作為,把新到數(shù)據(jù)拷貝到本地騰空的內(nèi)存空間,并把 子塊頭中子塊名修改為新數(shù)據(jù)塊的塊名,并調(diào)整該塊在LRU鏈表中位置至最 新;管理主機(jī)注冊這個(gè)新數(shù)據(jù)塊的位置。
如果找全局最早最少使用的塊,即使花再高代價(jià)也不可能實(shí)現(xiàn),因?yàn)槊總€(gè) 節(jié)點(diǎn)都在不停地運(yùn)作,等收集到每個(gè)節(jié)點(diǎn)最老的塊,決定出的全局最早最少使 用的塊,可能已經(jīng)過時(shí)。現(xiàn)有提出了一種次優(yōu)而高效的算法Best-Guess R印lacement,只通過本節(jié)點(diǎn)存儲的信息,來判斷本節(jié)點(diǎn)認(rèn)為的全局最早最少 使用的塊。具體做法為每個(gè)節(jié)點(diǎn)都有一個(gè)最老時(shí)間存儲域,存儲其余節(jié)點(diǎn)上最 早最少使用數(shù)據(jù)塊的使用時(shí)間,當(dāng)其余節(jié)點(diǎn)上的最老時(shí)間發(fā)生變化時(shí),不會主 動告訴其它節(jié)點(diǎn),而是采用一種惰性策略,只有當(dāng)兩個(gè)節(jié)點(diǎn)在通信時(shí),才會順 便交換兩個(gè)節(jié)點(diǎn)數(shù)據(jù)塊最老時(shí)間給對方,對方對其最老時(shí)間存儲域進(jìn)行更新; 當(dāng)計(jì)算全局最早最少使用的塊時(shí),從最老時(shí)間存儲域找出最老的數(shù)據(jù)塊和本地 的最早最少使用的數(shù)據(jù)塊比較,時(shí)間最老的認(rèn)為是全局最老的塊。這樣方法可 以減少大量的網(wǎng)絡(luò)開銷,對于有N個(gè)存儲節(jié)點(diǎn)的系統(tǒng)來說,按這種策略決定出 來的塊最壞情況下是第(N—1)(N — 2)/2老的塊。詳細(xì)計(jì)算過程見參考 Hint—Based Cooperative Caching . ACM Transactions on Computer Systems: Vol. 18, No. 4, November 2000, Pages 387-419。
但是,上述方法適用于內(nèi)存池中子塊為等大小情況,所以一個(gè)當(dāng)數(shù)據(jù)塊需 要替換時(shí),只需要找到一塊"最老時(shí)間塊"出來就可以了。
本發(fā)明中內(nèi)存子塊是由slab管理,內(nèi)存子塊的長度為不等長,所以當(dāng)兩 個(gè)數(shù)據(jù)塊大小不對等時(shí), 一塊數(shù)據(jù)要替換時(shí),可能需要找好幾個(gè)替換塊。本發(fā) 明中通過其余節(jié)點(diǎn)最老時(shí)間和本節(jié)點(diǎn)中最老時(shí)間比較,確定出最老時(shí)間塊所在節(jié)點(diǎn),再從該節(jié)點(diǎn)的LRU中找到最早最少使用的若干個(gè)內(nèi)存子塊,使它們的 內(nèi)存之和等于或大于欲替換的數(shù)據(jù),如果找到的最早最少使用的內(nèi)存子塊的內(nèi) 存與需要的內(nèi)存空間差值超過某一常數(shù),則把該若干內(nèi)存子塊中長度最大的塊 分割成兩個(gè)小塊,把不使用的小塊交給slab管理器的空閑鏈表,從而z保證一 個(gè)大的數(shù)據(jù)塊不會被分割存儲在不同的節(jié)點(diǎn)上。
例如,當(dāng)一個(gè)大數(shù)據(jù),假設(shè)大小為50M,需要從A節(jié)點(diǎn)轉(zhuǎn)移到其它時(shí),假 設(shè)計(jì)算得到全局最老時(shí)間塊在C節(jié)點(diǎn)上,大小為30M,因?yàn)?0M空間太小,還 要再找出20M的空間,這20M空間只能是C節(jié)點(diǎn)下一個(gè)最老塊,盡管這個(gè)塊可 能不如B節(jié)點(diǎn)的最老塊老。這樣做,是為了防止對一大數(shù)據(jù)轉(zhuǎn)移時(shí),還要分割, 存儲在不同節(jié)點(diǎn)。
步驟503,存儲節(jié)點(diǎn)接收到讀寫請求后按步驟501査詢到請求讀取的數(shù)據(jù) 塊塊在內(nèi)存池中的位置,進(jìn)行RDMA read/write操作,如果本節(jié)點(diǎn)沒有空閑 內(nèi)存,就要按步驟S502選擇內(nèi)存子塊進(jìn)行替換,進(jìn)行數(shù)據(jù)的丟棄或轉(zhuǎn)移,再 進(jìn)行讀寫操作,如果所述數(shù)據(jù)塊的主拷貝不在所述存儲節(jié)點(diǎn)本地,則復(fù)制所述 主拷貝為一個(gè)副拷貝,存儲到本地;讀寫操作后,要檢査該數(shù)據(jù)塊的信息頭標(biāo) 志位。
標(biāo)志位如圖4所示,標(biāo)志位包括有效標(biāo)志位,用于表示內(nèi)存子塊中數(shù)據(jù)是 否有效;主拷貝標(biāo)志位,用于表示所存數(shù)據(jù)是否為數(shù)據(jù)塊的主拷貝;鎖標(biāo)志, 用來防止多個(gè)請求同時(shí)對數(shù)據(jù)塊修改,保證一致性;塊長,數(shù)據(jù)塊的長度;子 塊名,用于記錄存儲的數(shù)據(jù)子塊的數(shù)據(jù)塊名字;向?qū)?,用于記錄主拷貝轉(zhuǎn)移 的向?qū)В幌驅(qū)У刂?,用于記錄主拷貝轉(zhuǎn)移的地址。
在內(nèi)存池中相同的數(shù)據(jù)塊可以有多份拷貝分別存儲在不同的節(jié)點(diǎn)上,有效 減少數(shù)據(jù)在不同節(jié)點(diǎn)上的反復(fù)傳遞。
本發(fā)明把內(nèi)存池中的內(nèi)存塊分為主拷貝和副拷貝。從后端存儲系統(tǒng)中拷貝 到內(nèi)存池中的塊叫主拷貝塊,由主拷貝塊復(fù)制生成的副本叫做副拷貝。
當(dāng)某一節(jié)點(diǎn)請求的數(shù)據(jù)塊不在內(nèi)存池中,則從后端存儲系統(tǒng)中拷貝,生 成主拷貝;如果數(shù)據(jù)塊在內(nèi)存池中已存在主拷貝,但不在本地,則從主拷貝中 復(fù)制一個(gè)副拷貝。在內(nèi)存池中, 一塊數(shù)據(jù)只有一個(gè)主拷貝,和任意個(gè)副拷貝, 主拷貝和副拷貝關(guān)系如圖5所示。對主拷貝塊,在管理主機(jī)上建立全局的相關(guān) 信息對其進(jìn)行注冊維護(hù)和更新;對于副拷貝,由本地的存儲節(jié)點(diǎn)負(fù)責(zé)維護(hù),當(dāng)數(shù)據(jù)不一致時(shí),僅僅簡單地使其無效。
查詢到數(shù)據(jù)讀取完成后進(jìn)行的操作具體方式如下所示。
步驟531,如果該數(shù)據(jù)的標(biāo)志位是有效的并且數(shù)據(jù)不是向?qū)В瑒t讀寫成功。 判斷數(shù)據(jù)是不是向?qū)У姆椒?,將讀取的數(shù)據(jù)塊的塊頭中數(shù)據(jù)塊名字和請求
操作的數(shù)據(jù)塊名比較,如果匹配,說明不是向?qū)?,如果不匹配,說明是向?qū)А?步驟532,如果標(biāo)志位顯示數(shù)據(jù)的無效的,則重新查詢主拷貝的位置,再
重新進(jìn)行讀寫。
步驟533,如果標(biāo)志位顯示數(shù)據(jù)有效但是向?qū)?,并且向?qū)粯?biāo)志為有效, 則取出向?qū)У刂罚侔凑赵摰刂分匦逻M(jìn)行讀寫。
判斷數(shù)據(jù)是不是向?qū)У姆椒?,將讀取的數(shù)據(jù)塊的塊頭中數(shù)據(jù)塊名字和請求 操作的數(shù)據(jù)塊名比較,判斷是否匹配;如果匹配,則有效;否則,無效。向?qū)?位有效,只是為了說明向?qū)У刂肥怯行У刂?;無效,說明向?qū)У刂肥菬o效地址。
步驟534,如果標(biāo)志位顯示數(shù)據(jù)加鎖,則說明數(shù)據(jù)正在更新中,等待隨機(jī) 時(shí)長或預(yù)設(shè)時(shí)長,按原地址重新進(jìn)行讀寫。
在存儲節(jié)點(diǎn)上的InfiniBand通信中,數(shù)據(jù)塊査詢和數(shù)據(jù)塊的替換采用 Send/Receive操作;數(shù)據(jù)塊的讀寫采用RDMA read/write操作。
通過上述方法讀寫,不僅是RDMA操作降低CPU消耗,而且通信中不需要 使用發(fā)送緩沖和接收緩沖區(qū)在緩存數(shù)據(jù),而直接寫入到節(jié)點(diǎn)內(nèi)存空間,實(shí)現(xiàn)數(shù) 據(jù)的零拷貝。
存儲節(jié)點(diǎn)支持的兩種一致性:弱一致性和強(qiáng)一致性。 弱一致性步驟如圖6所示,
當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)副拷貝進(jìn)行寫操作完成后,發(fā)送多播消息使其他 存儲節(jié)點(diǎn)上的副拷貝失效,將包含寫操作中更新數(shù)據(jù)信息的Diff結(jié)果發(fā)送給 主拷貝所在存儲節(jié)點(diǎn),以使主拷貝進(jìn)行同步更新。
當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作完成后,發(fā)送多播消息,使每 個(gè)副拷貝無效。
強(qiáng)一致性步驟如圖7所示,
當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)副拷貝進(jìn)行寫操作前,發(fā)送多播消息,其他存儲 節(jié)點(diǎn)上的副拷貝失效,將副拷貝對應(yīng)的主拷貝加鎖。
當(dāng)存儲節(jié)點(diǎn)對所述副拷貝進(jìn)行寫操作完成后,將包含寫操作中更新數(shù)據(jù)信
29息的Diff結(jié)果發(fā)送給所述主拷貝所在存儲節(jié)點(diǎn),以使主拷貝解鎖,并進(jìn)行同 先審新
當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作前,對自身加鎖,并發(fā)送多播 消息使每個(gè)副拷貝無效。
當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作完成后,對自身解鎖。
Diff為同一數(shù)據(jù)的一個(gè)臟拷貝和一個(gè)干凈拷貝的差異,臟拷貝是指對數(shù) 據(jù)進(jìn)行了更改數(shù)據(jù)的操作。當(dāng)數(shù)據(jù)的一個(gè)副拷貝進(jìn)行了更新操作,把更新的數(shù) 據(jù)組成一個(gè)Diff報(bào)文,發(fā)送給主拷貝節(jié)點(diǎn),主拷貝根據(jù)Diff更新自身數(shù)據(jù)。
使用Diff,可以大量減少冗余數(shù)據(jù)在節(jié)點(diǎn)間傳輸。
本發(fā)明基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),如圖2所示,所述系統(tǒng) 包括通過InfiniBand網(wǎng)絡(luò)連接的節(jié)點(diǎn),所述節(jié)點(diǎn)包括一個(gè)管理主機(jī)和多個(gè)存 儲節(jié)點(diǎn)。
每兩個(gè)所述節(jié)點(diǎn)伺建立InfiniBand通信。 節(jié)點(diǎn)還通過以太網(wǎng)絡(luò)連接;
節(jié)點(diǎn)包括通信域;每兩個(gè)所述節(jié)點(diǎn)間建立InfiniBand通信進(jìn)一步為,建 立以太網(wǎng)絡(luò)通信;節(jié)點(diǎn)通過以太網(wǎng)絡(luò)獲得其他節(jié)點(diǎn)的InfiniBand通信句柄, 并將所述InfiniBand通信句柄存儲到所述節(jié)點(diǎn)的通信域。
存儲節(jié)點(diǎn)800的結(jié)構(gòu)如圖8所示,包括內(nèi)存分配模塊810和請求處理模塊
820。
存儲節(jié)點(diǎn)800具有所述通信域、用于記錄本地內(nèi)存子塊的相關(guān)信息的本地 內(nèi)存子塊位置信息域、用于記錄其他存儲節(jié)點(diǎn)800上最早最少使用的內(nèi)存子塊 的時(shí)間信息的最老塊時(shí)間域;所述本地內(nèi)存子塊位置信息域中還包括用于記錄 本地最早最少使用的內(nèi)存子塊的時(shí)間信息的本地最老塊時(shí)間表。
內(nèi)存分配模塊810,用于分配內(nèi)存空間,對所述內(nèi)存空間進(jìn)行預(yù)注冊,將 分配的內(nèi)存空間的相關(guān)信息發(fā)送給其他節(jié)點(diǎn),所述內(nèi)存空間構(gòu)建成內(nèi)存池。
內(nèi)存分配模塊810進(jìn)一步用于分配一塊內(nèi)存空間,將所述內(nèi)存空間拴住, 使所述內(nèi)存空間的數(shù)據(jù)不被交換到交換空間;對所述內(nèi)存空間進(jìn)行預(yù)注冊,將 與分配內(nèi)存空間的位置和屬性相關(guān)信息記錄到InfiniBand通信句柄中對應(yīng)字 段,并發(fā)送給其他節(jié)點(diǎn);在接收其他存儲節(jié)點(diǎn)800發(fā)送的InfiniBand通信句 柄中對應(yīng)字段時(shí),將所述InfiniBand通信句柄中對應(yīng)字段存儲到所述存儲節(jié)點(diǎn)800的通信域?qū)?yīng)的通信句柄中。
內(nèi)存分配模塊810還用于采用Slab分配器管理內(nèi)存空間的分配和釋放。
請求處理模塊820,用于接收請求,根據(jù)從管理主機(jī)900獲得的同所述請 求相關(guān)的主拷貝的全局位置信息進(jìn)行同所述請求對應(yīng)的操作,或根據(jù)本地存儲 的其他存儲節(jié)點(diǎn)800分配的內(nèi)存空間相關(guān)信息進(jìn)行所述請求對應(yīng)的操作。
請求處理模塊820進(jìn)一步包括讀寫請求處理模塊821、査詢請求處理模塊 822、替換請求處理模塊823、用于根據(jù)所述數(shù)據(jù)塊名字從管理主機(jī)900中獲 得所述數(shù)據(jù)塊的主拷貝的全局位置信息,在所述內(nèi)存池中査詢數(shù)據(jù)塊的査詢模 塊824,以及用于從內(nèi)存池中選擇待用的內(nèi)存子塊的替換模塊825。
讀寫請求處理模塊821,用于在所述存儲節(jié)點(diǎn)800接收到讀寫請求時(shí),從 請求中獲得請求讀取的數(shù)據(jù)塊名字,所述數(shù)據(jù)塊名字包含數(shù)據(jù)塊所在文件的文 件名和所述數(shù)據(jù)塊在所述文件中的偏移,將所述數(shù)據(jù)塊名字發(fā)給査詢模塊 824;査詢模塊824在所述內(nèi)存池中査詢所述數(shù)據(jù)塊。
讀寫請求處理模塊821,還用于根據(jù)査詢結(jié)果,如果所述數(shù)據(jù)塊的主拷貝 不在存儲節(jié)點(diǎn)800本地,則復(fù)制所述主拷貝為一個(gè)副拷貝,存儲到本地。
査詢請求處理模塊822,進(jìn)一步用于在存儲節(jié)點(diǎn)800接收到數(shù)據(jù)塊査詢請 求時(shí),獲得數(shù)據(jù)塊査詢請求中包含的請求査詢的數(shù)據(jù)塊名字,將所述數(shù)據(jù)塊名 字發(fā)給査詢模塊824;查詢模塊824在所述內(nèi)存池中査詢所述數(shù)據(jù)塊。
査詢模塊824進(jìn)一步包括
位置信息預(yù)讀模塊,用于通過向管理主機(jī)900發(fā)送包含所述文件名的獲取 主拷貝位置信息請求,將所述文件的所有數(shù)據(jù)塊的主拷貝的全局位置信息預(yù)讀 到本地;
數(shù)據(jù)查找模塊,用于根據(jù)所述數(shù)據(jù)塊的主拷貝的全局位置信息在內(nèi)存池中 査詢所述數(shù)據(jù)塊的主拷貝,如果查詢到,則返回査詢到的主拷貝的位置信息, 否則,根據(jù)數(shù)據(jù)塊名字從所述后端存儲系統(tǒng)讀入所述數(shù)據(jù)塊的新主拷貝,啟動 替換模塊825從內(nèi)存池中選擇待用的內(nèi)存子塊,將所述新主拷貝存儲到所述內(nèi) 存子塊; y
位置信息更新模塊,用于返回所述數(shù)據(jù)塊的新主拷貝的位置信息,并向所 述管理主機(jī)900發(fā)送注冊新主拷貝請求。
位置信息更新模塊用于更新所述存儲節(jié)點(diǎn)800的本地內(nèi)存子塊位置信息域。
替換請求處理模塊823,用于在存儲節(jié)點(diǎn)800接收到替換請求時(shí),啟動替 換模塊825從內(nèi)存池中選擇待用的內(nèi)存子塊;返回所述待用的內(nèi)存子塊位置信 息。 z
替換模塊825進(jìn)一步包括空閑空間查找模塊、本地最早最少使用內(nèi)存査找 模塊、完成判斷模塊、全局最早最少使用內(nèi)存査找模塊。
空閑空間査找模塊,用于根據(jù)通信域和本地內(nèi)存子塊位置信息域判斷所述 內(nèi)存池中是否存在空閑空間,如果存儲節(jié)點(diǎn)800本地存在空閑空間,則從所述 空閑空間中選擇的待用的內(nèi)存子塊;如果空閑空間不在存儲節(jié)點(diǎn)800本地,則 將存儲節(jié)點(diǎn)800本地的內(nèi)存子塊的數(shù)據(jù)轉(zhuǎn)存到所述空閑空間,本地騰出的內(nèi)存 空間為待用的內(nèi)存子塊;如果內(nèi)存池不存在空閑空間,則被騰空的本地的內(nèi)存 子塊為所述待用的內(nèi)存子塊;如果內(nèi)存池中不存在空閑空間,則啟動本地最早 最少使用內(nèi)存査找模塊。
本地最早最少使用內(nèi)存查找模塊,用于檢査所述本地最老塊時(shí)間表,判斷 所述本地最老塊時(shí)間表中最早最少使用的內(nèi)存子塊中存儲數(shù)據(jù)是否為主拷貝, 如果不是,選擇所述內(nèi)存子塊為所述待用的內(nèi)存子塊,啟動所述完成判斷模塊, 否則,啟動全局最早最少使用內(nèi)存査找模塊。
完成判斷模塊,判斷已選擇的內(nèi)存子塊的空間加和是否小于要求選擇的空 間,如果是,則啟動空閑空間查找模塊。
全局最早最少使用內(nèi)存查找模塊,檢査所述最老塊時(shí)間域,選擇所述最老 塊時(shí)間域中最早最少使用的內(nèi)存子塊,確定所述內(nèi)存子塊所在節(jié)點(diǎn),從所述節(jié) 點(diǎn)的本地最老塊時(shí)間表中選擇一個(gè)或多個(gè)最早最少使用的內(nèi)存子塊,選擇的內(nèi) 存子塊的空間加和大于或等于要求選擇的空間;將存儲節(jié)點(diǎn)800本地的內(nèi)存子 塊的數(shù)據(jù)轉(zhuǎn)存到所述選擇的內(nèi)存子塊,被騰空的所述本地的內(nèi)存子塊為所述待 用的內(nèi)存子塊。
內(nèi)存子塊中包括用于記錄標(biāo)志位和管理控制信息的塊頭;
全局最早最少使用內(nèi)存査找模塊還用于在存儲節(jié)點(diǎn)800本地的數(shù)據(jù)z被轉(zhuǎn) 存的內(nèi)存子塊的塊頭中設(shè)置指向選擇的內(nèi)存子塊的向?qū)?biāo)志位,記錄向?qū)У?址。
數(shù)據(jù)查找模塊在根據(jù)所述數(shù)據(jù)塊的主拷貝的全局位置信息在內(nèi)存池中查詢所述數(shù)據(jù)塊的主拷貝時(shí)進(jìn)一步用于根據(jù)所述全局位置信息到相應(yīng)節(jié)點(diǎn)上讀 取對應(yīng)內(nèi)存子塊的塊頭,將所述塊頭中數(shù)據(jù)塊名字和被査詢的數(shù)據(jù)塊名比較, 如果匹配,查詢成功;否則,如果所述塊頭中包含向?qū)?biāo)志位,向?qū)У刂分赶?另一個(gè)節(jié)點(diǎn),則按所述向?qū)У刂凡檎蚁乱还?jié)點(diǎn);如果最后査找到的內(nèi)存子塊向 導(dǎo)為空或査詢的節(jié)點(diǎn)數(shù)超過預(yù)設(shè)值,則查詢失敗。
所述塊頭中包括有效標(biāo)志位和存儲的數(shù)據(jù)的數(shù)據(jù)塊名字, 讀寫請求處理模塊821在根據(jù)査詢結(jié)果復(fù)制所述主拷貝為一個(gè)副拷貝存 儲到本地時(shí)進(jìn)一步用于將査詢到的內(nèi)存子塊的塊頭中的數(shù)據(jù)塊名字同請求操 作的數(shù)據(jù)塊名字比較,如果匹配,則讀寫成功,否則,根據(jù)所述有效標(biāo)志位判 斷內(nèi)存子塊中數(shù)據(jù)是否有效,如果無效,則重新査詢主拷貝的位置,進(jìn)行讀寫, 如果有效,則按向?qū)У刂分赶虻奈恢弥匦逻M(jìn)行讀寫。
所述塊頭中還包括加鎖標(biāo)志位,如果加鎖表明內(nèi)存子塊中數(shù)據(jù)正在更新; 讀寫請求處理模塊821在讀寫時(shí)還用于判斷內(nèi)存子塊的加鎖標(biāo)志位判斷 是否加鎖,如果是,則等待隨機(jī)或預(yù)設(shè)時(shí)間,重新進(jìn)行讀寫。
存儲節(jié)點(diǎn)800進(jìn)行査詢和替換時(shí),所用所述Infiniband通信采用 Send/Receive操作,進(jìn)行讀寫時(shí),所用所述Infiniband通信采用RDMA read/write操作。
在一個(gè)實(shí)施例中,為保持系統(tǒng)中數(shù)據(jù)一致,讀寫請求處理模塊821還用于 當(dāng)對本地的一個(gè)副拷貝進(jìn)行寫操作完成后,發(fā)送多播消息使其他存儲節(jié)點(diǎn)800 上的副拷貝失效,將包含寫操作中更新數(shù)據(jù)信息的Diff結(jié)果發(fā)送給主拷貝所 在存儲節(jié)點(diǎn)800,以使主拷貝進(jìn)行同步更新;當(dāng)存儲節(jié)點(diǎn)800對本地的一個(gè)主 拷貝進(jìn)行寫操作完成后,發(fā)送多播消息,使每個(gè)副拷貝無效。
在另一個(gè)實(shí)施例中為保持系統(tǒng)中數(shù)據(jù)一致,讀寫請求處理模塊821還用于 當(dāng)存儲節(jié)點(diǎn)800對本地的一個(gè)副拷貝進(jìn)行寫操作前,發(fā)送多播消息,其他存儲 節(jié)點(diǎn)800上的副拷貝失效,將副拷貝對應(yīng)的主拷貝加鎖;當(dāng)存儲節(jié)點(diǎn)800對所 述副拷貝進(jìn)行寫操作完成后,將包含寫操作中更新數(shù)據(jù)信息的Diff結(jié)果發(fā)送 給所述主拷貝所在存儲節(jié)點(diǎn)800,以使主拷貝解鎖,并進(jìn)行同步更新;當(dāng)存儲 節(jié)點(diǎn)800對本地的一個(gè)主拷貝進(jìn)行寫操作前,對自身加鎖,并發(fā)送多播消息使 每個(gè)副拷貝無效;當(dāng)存儲節(jié)點(diǎn)800對本地的一個(gè)主拷貝進(jìn)行寫操作完成后,對 自身解鎖。
33存儲節(jié)點(diǎn)800對標(biāo)志位進(jìn)行修改時(shí),所用所述Inf iniband通信采用原子 操作。
管理主機(jī)900,用于通過InfiniBand通信接收存儲節(jié)點(diǎn)800的請求,提 供并維護(hù)所述節(jié)點(diǎn)從后端存儲系統(tǒng)讀入的主拷貝的全局位置信息。
管理主機(jī)900還用于接收存儲節(jié)點(diǎn)800發(fā)送的InfiniBand通信句柄中對 應(yīng)字段,并存儲到所述管理主機(jī)的通信域?qū)?yīng)的通信句柄中。
管理主機(jī)900接收的請求包括獲取主拷貝位置信息請求和注冊新主拷貝 請求,
管理主機(jī)900結(jié)構(gòu)如圖9所示,包括信息存儲模塊910、信息提供模塊920 和信息更新模塊930,
信息存儲模塊910,用于將文件的數(shù)據(jù)塊的主拷貝的全局位置信息以文件 名為索引存儲到管理主機(jī)900的主拷貝位置信息域;
信息提供模塊920,用于管理主機(jī)900接收到包含文件名的獲取主拷貝位 置信息請求時(shí),通過所述文件名在所述主拷貝位置信息域中查找對應(yīng)文件數(shù)據(jù) 塊的全局位置信息,并返回給請求的存儲節(jié)點(diǎn)800;
信息更新模塊930,用于管理主機(jī)900接收到從后端存儲系統(tǒng)讀入數(shù)據(jù)塊 的主拷貝的存儲節(jié)點(diǎn)800發(fā)送的注冊新主拷貝請求后,根據(jù)所述注冊新主拷貝 請求更新所述主拷貝位置信息域。
信息更新模塊930進(jìn)一步用于根據(jù)注冊新主拷貝請求中文件名判斷所述 主拷貝位置信息域中是否存儲對應(yīng)記錄,如果是,則用新主拷貝的全局位置信 息更新所述對應(yīng)記錄;否則,建立基于所述文件名的結(jié)構(gòu)體,在所述主拷貝位 置信息域中存儲所述新主拷貝的全局位置信息。
管理主機(jī)900所用的InfiniBand通信采用Send/Receive操作。
本領(lǐng)域的技術(shù)人員在不脫離權(quán)利要求書確定的本發(fā)明的精神和范圍的條 件下,還可以對以上內(nèi)容進(jìn)行各種各樣的修改。因此本發(fā)明的范圍并不僅限于 以上的說明,而是由權(quán)利要求書的范圍來確定的。
權(quán)利要求
1.一種基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特征在于,所述方法包括步驟1,通過InfiniBand網(wǎng)絡(luò)連接節(jié)點(diǎn),所述節(jié)點(diǎn)包括管理主機(jī)和存儲節(jié)點(diǎn);步驟2,每兩個(gè)所述節(jié)點(diǎn)間建立InfiniBand通信;步驟3,存儲節(jié)點(diǎn)分配內(nèi)存空間,對所述內(nèi)存空間進(jìn)行預(yù)注冊,將分配的內(nèi)存空間的相關(guān)信息發(fā)送給其他節(jié)點(diǎn),所述內(nèi)存空間構(gòu)建成內(nèi)存池;步驟4,管理主機(jī)通過InfiniBand通信接收所述存儲節(jié)點(diǎn)的請求,提供并維護(hù)所述節(jié)點(diǎn)從后端存儲系統(tǒng)讀入的主拷貝的全局位置信息;步驟5,所述存儲節(jié)點(diǎn)接收請求,根據(jù)從所述管理主機(jī)獲得的同所述請求相關(guān)的主拷貝的全局位置信息進(jìn)行同所述請求對應(yīng)的操作,或根據(jù)本地存儲的其他存儲節(jié)點(diǎn)分配的內(nèi)存空間相關(guān)信息進(jìn)行所述請求對應(yīng)的操作。
2. 如權(quán)利要求1所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特征 在于,所述步驟1還包括,通過以太網(wǎng)絡(luò)連接節(jié)點(diǎn);所述步驟2進(jìn)一步為,步驟21,建立以太網(wǎng)絡(luò)通信;步驟22,節(jié)點(diǎn)通過以太網(wǎng)絡(luò)獲得其他節(jié)點(diǎn)的InfiniBand通信句柄,并將 所述InfiniBand通信句柄存儲到所述節(jié)點(diǎn)的通信域。
3. 如權(quán)利要求2所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特征 在于,所述步驟3進(jìn)一步包括步驟31,所述存儲節(jié)點(diǎn)分配一塊內(nèi)存空間,將所述內(nèi)存空間拴住,使所 述內(nèi)存空間的數(shù)據(jù)不被交換到交換空間;步驟32,對所述內(nèi)存空間進(jìn)行預(yù)注冊,將與分配內(nèi)存空間的位置和屬性 相關(guān)信息記錄到InfiniBand通信句柄中對應(yīng)字段,并發(fā)送給其他節(jié)點(diǎn);步驟33,節(jié)點(diǎn)接收所述InfiniBand通信句柄中對應(yīng)字段,并存儲到所述 節(jié)點(diǎn)的通信域?qū)?yīng)的通信句柄中。
4. 如權(quán)利要求3所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特征在于,所述步驟3還包括,步驟41,所述存儲節(jié)點(diǎn)采用Slab分配器管理內(nèi)存空間的分配和釋放。
5. 如權(quán)利要求3所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特征 在于,,所述步驟4中請求包括獲取主拷貝位置信息請求和注冊新主拷貝請求, 所述步驟4進(jìn)一步為,步驟51,所述管理主機(jī)將文件的數(shù)據(jù)塊的主拷貝的全局位置信息以文件 名為索引存儲到所述管理主機(jī)的主拷貝位置信息域;步驟52,所述管理主機(jī)接收到包含文件名的獲取主拷貝位置信息請求時(shí), 通過所述文件名在所述主拷貝位置信息域中査找對應(yīng)文件數(shù)據(jù)塊的全局位置 信息,并返回給請求的存儲節(jié)點(diǎn);步驟53,所述管理主機(jī)接收到從后端存儲系統(tǒng)讀入數(shù)據(jù)塊的主拷貝的存 儲節(jié)點(diǎn)發(fā)送的注冊新主拷貝請求后,根據(jù)所述注冊新主拷貝請求更新所述主拷 貝位置信息域。
6. 如權(quán)利要求5所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特征 在于,所述步驟53進(jìn)一步為,步驟61,根據(jù)注冊新主拷貝請求中文件名判斷所述主拷貝位置信息域中 是否存儲對應(yīng)記錄,如果是,則用新主拷貝的全局位置信息更新所述對應(yīng)記錄; 否則,執(zhí)行步驟62;步驟62,建立基于所述文件名的結(jié)構(gòu)體,在所述主拷貝位置信息域中存 儲所述新主拷貝的全局位置信息。
7. 如權(quán)利要求1所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特征 在于,所述步驟4中InfiniBand通信采用Send/Receive操作。
8. 如權(quán)利要求5所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特征在于,/在所述存儲節(jié)點(diǎn)接收到讀寫請求時(shí),所述步驟5進(jìn)一步為, 步驟81,所述存儲節(jié)點(diǎn)從請求中獲得請求讀取的數(shù)據(jù)塊名字,所述數(shù)據(jù) 塊名字包含數(shù)據(jù)塊所在文件的文件名和所述數(shù)據(jù)塊在所述文件中的偏移;步驟82,根據(jù)所述數(shù)據(jù)塊名字從所述管理主機(jī)中獲得所述數(shù)據(jù)塊的主拷 貝的全局位置信息,在所述內(nèi)存池中査詢所述數(shù)據(jù)塊;步驟83,如果所述數(shù)據(jù)塊的主拷貝不在所述存儲節(jié)點(diǎn)本地,則復(fù)制所述 主拷貝為一個(gè)副拷貝,存儲到本地。
9. 如權(quán)利要求8所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特征 在于,在所述存儲節(jié)點(diǎn)接收到數(shù)據(jù)塊査詢請求時(shí),所述步驟5進(jìn)一步為, 步驟91,所述存儲節(jié)點(diǎn)獲得數(shù)據(jù)塊査詢請求中包含的請求查詢的數(shù)據(jù)塊 名字;步驟92,根據(jù)所述數(shù)據(jù)塊名字從所述管理主機(jī)獲得所述數(shù)據(jù)塊的主拷貝 的全局位置信息,在所述內(nèi)存池中査詢所述數(shù)據(jù)塊。
10. 如權(quán)利要求9所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特 征在于,所述步驟82和所述步驟92進(jìn)一步為,步驟101,所述存儲節(jié)點(diǎn)通過向所述管理主機(jī)發(fā)送包含所述文件名的獲取 主拷貝位置信息請求,將所述文件的所有數(shù)據(jù)塊的主拷貝的全局位置信息預(yù)讀 到本地;步驟102,所述存儲節(jié)點(diǎn)根據(jù)所述數(shù)據(jù)塊的主拷貝的全局位置信息在內(nèi)存 池中查詢所述數(shù)據(jù)塊的主拷貝,如果查詢到,則返回査詢到的主拷貝的位置信 息,否則,執(zhí)行步驟103;步驟103,所述存儲節(jié)點(diǎn)根據(jù)數(shù)據(jù)塊名字從所述后端存儲系統(tǒng)讀入所述數(shù) 據(jù)塊的新主拷貝,從內(nèi)存池中選擇待用的內(nèi)存子塊,將所述新主拷貝存儲到所 述內(nèi)存子塊;步驟104,所述存儲節(jié)點(diǎn)返回所述數(shù)據(jù)塊的新主拷貝的位置信息,并向所 述管理主機(jī)發(fā)送注冊新主拷貝請求。
11. 如權(quán)利要求10所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特 征在于, y在所述存儲節(jié)點(diǎn)接收到替換請求時(shí),所述步驟5進(jìn)一步為, 步驟lll,所述存儲節(jié)點(diǎn)從內(nèi)存池中選擇待用的內(nèi)存子塊; 步驟112,所述存儲節(jié)點(diǎn)返回所述待用的內(nèi)存子塊位置信息。
12. 如權(quán)利要求11所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特 征在于,所述存儲節(jié)點(diǎn)包括所述通信域、用于記錄本地內(nèi)存子塊的相關(guān)信息的本地 內(nèi)存^子塊位置信息域、用于記錄其他存儲節(jié)點(diǎn)上最早最少使用的內(nèi)存子塊的時(shí) 間信息的最老塊時(shí)間域;所述本地內(nèi)存子塊位置信息域中還包括用于記錄本地 最早最少使用的內(nèi)存子塊的時(shí)間信息的本地最老塊時(shí)間表;所述步驟104還包括更新所述存儲節(jié)點(diǎn)的本地內(nèi)存子塊位置信息域; 所述步驟103和所述步驟111中從內(nèi)存池中選擇待用的內(nèi)存子塊進(jìn)一步為,步驟121,所述存儲節(jié)點(diǎn)根據(jù)通信域和本地內(nèi)存子塊位置信息域判斷所述 內(nèi)存池中是否存在空閑空間,如果所述存儲節(jié)點(diǎn)本地存在空閑空間,則從所述 空閑空間中選擇的待用的內(nèi)存子塊;如果空閑空間不在所述存儲節(jié)點(diǎn)本地,則 將所述存儲節(jié)點(diǎn)本地的內(nèi)存子塊的數(shù)據(jù)轉(zhuǎn)存到所述空閑空間,本地騰出的內(nèi)存 空間為待用的內(nèi)存子塊;如果內(nèi)存池不存在空閑空間,則被騰空的本地的內(nèi)存 子塊為所述待用的內(nèi)存子塊;如果內(nèi)存池中不存在空閑空間,執(zhí)行步驟122;步驟122,檢查所述本地最老塊時(shí)間表,判斷所述本地最老塊時(shí)間表中最 早最少使用的內(nèi)存子塊中存儲數(shù)據(jù)是否為主拷貝,如果不是,選擇所述內(nèi)存子 塊為所述待用的內(nèi)存子塊,執(zhí)行步驟123,否則,執(zhí)行步驟124;步驟123,判斷已選擇的內(nèi)存子塊的空間加和是否小于要求選擇的空間, 如果是,執(zhí)行所述步驟121;步驟124,檢査所述最老塊時(shí)間域,選擇所述最老塊時(shí)間域中最早最少使 用的內(nèi)存子塊,確定所述內(nèi)存子塊所在節(jié)點(diǎn),從所述節(jié)點(diǎn)的本地最老塊時(shí)間表 中選擇一個(gè)或多個(gè)最早最少使用的內(nèi)存子塊,選擇的內(nèi)存子塊的空間加和大于 或等于要求選擇的空間;將所述存儲節(jié)點(diǎn)本地的內(nèi)存子塊的數(shù)據(jù)轉(zhuǎn)存到所述選 擇的內(nèi)存子塊,被騰空的所述本地的內(nèi)存子塊為所述待用的內(nèi)存子塊。
13. 如權(quán)利要求12所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特 征在于, -所述內(nèi)存子塊中包括用于記錄標(biāo)志位和管理控制信息的塊頭; 所述步驟124還包括在所述存儲節(jié)點(diǎn)本地的數(shù)據(jù)被轉(zhuǎn)存的內(nèi)存子塊的塊 頭中設(shè)置指向選擇的內(nèi)存子塊的向?qū)?biāo)志位,記錄向?qū)У刂贰?br>
14. 如權(quán)利要求13所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特 征在于,所述步驟102中所述存儲節(jié)點(diǎn)根據(jù)所述數(shù)據(jù)塊的主拷貝的全局位置信息 在內(nèi)存池中査詢所述數(shù)據(jù)塊的主拷貝進(jìn)一步為,步驟141,根據(jù)所述全局位置信息到相應(yīng)節(jié)點(diǎn)上讀取對應(yīng)內(nèi)存子塊的塊 頭,將所述塊頭中數(shù)據(jù)塊名字和被查詢的數(shù)據(jù)塊名比較,如果匹配,查詢成功; 否則,執(zhí)行步驟142;步驟142,如果所述塊頭中包含向?qū)?biāo)志位,向?qū)У刂分赶蛄硪粋€(gè)節(jié)點(diǎn), 則按所述向?qū)У刂窎苏蚁乱还?jié)點(diǎn);步驟143,如果最后查找到的內(nèi)存子塊向?qū)榭栈驏嗽兊墓?jié)點(diǎn)數(shù)超過預(yù)設(shè) 值,則査詢失敗。
15. 如權(quán)利要求13所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特 征在于,所述塊頭中包括有效標(biāo)志位和存儲的數(shù)據(jù)的數(shù)據(jù)塊名字, 所述步驟83還包括,步驟151,將査詢到的內(nèi)存子塊的塊頭中的數(shù)據(jù)塊名字同請求操作的數(shù)據(jù) 塊名字比較,如果匹配,則讀寫成功,否則,執(zhí)行步驟152;步驟152,根據(jù)所述有效標(biāo)志位判斷內(nèi)存子塊中數(shù)據(jù)是否有效,如果無效, 則重新查詢主拷貝的位置,進(jìn)行讀寫,否則,執(zhí)行步驟153;步驟153,按向?qū)У刂分赶虻奈恢弥匦逻M(jìn)行讀寫。
16. 如權(quán)利要求15所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特 征在于,所述塊頭中還包括加鎖標(biāo)志位,如果加鎖表明內(nèi)存子塊中數(shù)據(jù)正在更新; 所述步驟82還包括,步驟161,判斷內(nèi)存子塊的加鎖標(biāo)志位判斷是否加鎖,如果是,則等待待 隨機(jī)或預(yù)設(shè)時(shí)間,重新進(jìn)行讀寫。
17. 如權(quán)利要求15所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特 征在于,存儲節(jié)點(diǎn)進(jìn)行查詢和替換時(shí),所用所述Infiniband通信采用 Send/Receive操作,進(jìn)行讀寫時(shí),所用所述Infiniband通信采用RDMAread/write操作。
18. 如權(quán)利要求15所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特 征在于,所述步驟83還包括, z 步驟1S1,當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)副拷貝進(jìn)行寫操作完成后,發(fā)送多播 消息使其他存儲節(jié)點(diǎn)上的副拷貝失效,將包含寫操作中更新數(shù)據(jù)信息的Diff 結(jié)果發(fā)送給主拷貝所在存儲節(jié)點(diǎn),以使主拷貝進(jìn)行同步更 新;步驟182,當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作完成后,發(fā)送多播 消息,使每個(gè)副拷貝無效。
19. 如權(quán)利要求16所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法,其特 征在于,所述步驟83還包括,步驟191,當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)副拷貝進(jìn)行寫操作前,發(fā)送多播消息, 其他存儲節(jié)點(diǎn)上的副拷貝失效,將副拷貝對應(yīng)的主拷貝加鎖;步驟192,當(dāng)存儲節(jié)點(diǎn)對所述副拷貝進(jìn)行寫操作完成后,將包含寫操作中 更新數(shù)據(jù)信息的Diff結(jié)果發(fā)送給所述主拷貝所在存儲節(jié)點(diǎn),以使主拷貝解鎖, 并進(jìn)行同步更新;步驟193,當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作前,對自身加鎖, 并發(fā)送多播消息使每個(gè)副拷貝無效;步驟194,當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作完成后,對自身解鎖。
20. 如權(quán)利要求18或19所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法, 其特征在于,存儲節(jié)點(diǎn)對標(biāo)志位進(jìn)行修改時(shí),所用所述Inf iniband通信采用原子操作。
21. —種基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特征在于,所述系統(tǒng) 包括通過InfiniBand網(wǎng)絡(luò)連接的節(jié)點(diǎn),所述節(jié)點(diǎn)包括一個(gè)管理主機(jī)和多個(gè)存 儲節(jié)點(diǎn);每兩個(gè)所述節(jié)點(diǎn)間建立InfiniBand通信; 所述存儲節(jié)點(diǎn)包括內(nèi)存分配模塊和請求處理模塊,所述內(nèi)存分配模塊,用于分配內(nèi)存空間,對所述內(nèi)存空間進(jìn)行預(yù)注冊,將 分配的內(nèi)存空間的相關(guān)信息發(fā)送給其他節(jié)點(diǎn),所述內(nèi)存空間構(gòu)建成內(nèi)存池;所述請求處理模塊,用于接收請求,根據(jù)從所述管理主機(jī)獲得的同所述請 求相關(guān)的主拷貝的全局位置信息進(jìn)行同所述請求對應(yīng)的操作,或根據(jù)本地存儲 的其他存儲節(jié)點(diǎn)分配的內(nèi)存空間相關(guān)信息進(jìn)行所述請求對應(yīng)的操作;所述管理主機(jī),用于通過InfiniBand通信接收所述存儲節(jié)點(diǎn)的請求,提 供并維護(hù)所述節(jié)點(diǎn)從后端存儲系統(tǒng)讀入的主拷貝的全局位置信息。
22. 如權(quán)利要求21所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述節(jié)點(diǎn)還通過以太網(wǎng)絡(luò)連接; 所述節(jié)點(diǎn)包括通信域; 所述每兩個(gè)所述節(jié)點(diǎn)間建立InfiniBand通信進(jìn)一步為,建立以太網(wǎng)絡(luò)通 信;節(jié)點(diǎn)通過以太網(wǎng)絡(luò)獲得其他節(jié)點(diǎn)的InfiniBand通信句柄,并將所述 InfiniBand通信句柄存儲到所述節(jié)點(diǎn)的通信域。
23. 如權(quán)利要求22所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述內(nèi)存分配模塊進(jìn)一步用于分配一塊內(nèi)存空間,將所述內(nèi)存空間拴住, 使所述內(nèi)存空間的數(shù)據(jù)不被交換到交換空間;對所述內(nèi)存空間進(jìn)行預(yù)注冊,將 與分配內(nèi)存空間的位置和屬性相關(guān)信息記錄到InfiniBand通信句柄中對應(yīng)字 段,并發(fā)送給其他節(jié)點(diǎn);在接收其他存儲節(jié)點(diǎn)發(fā)送的InfiniBand通信句柄中 對應(yīng)字段時(shí),將所述InfiniBand通信句柄中對應(yīng)字段存儲到所述存儲節(jié)點(diǎn)的 通信域?qū)?yīng)的通信句柄中;所述管理主機(jī)還用于接收存儲節(jié)點(diǎn)發(fā)送的InfiniBand通信句柄中對應(yīng)字 段,并存儲到所述管理主機(jī)的通信域?qū)?yīng)的通信句柄中。
24. 如權(quán)利要求23所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述內(nèi)存分配模塊還用于采用Slab分配器管理內(nèi)存空間的分配和釋 放。 乂
25. 如權(quán)利要求23所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述管理主機(jī)接收的請求包括獲取主拷貝位置信息請求和注冊新主拷貝請求,所述管理主機(jī)進(jìn)一步包括信息存儲模塊、信息提供模塊和信息更新模塊,所述信息存儲模塊,用于將文件的數(shù)據(jù)塊的主拷貝的全局位置信息以文件 名為索引存儲到所述管理主機(jī)的主拷貝位置信息域;所述信息提供模塊,用于所述管理主機(jī)接收到包含文件名的獲取主拷貝位 置信息請求時(shí),通過所述文件名在所述主拷貝位置信息域中查找對應(yīng)文件數(shù)據(jù) 塊的全局位置信息,并返回給請求的存儲節(jié)點(diǎn);所述信息更新模塊,用于所述管理主機(jī)接收到從后端存儲系統(tǒng)讀入數(shù)據(jù)塊 的主拷貝的存儲節(jié)點(diǎn)發(fā)送的注冊新主拷貝請求后,根據(jù)所述注冊新主拷貝請求 更新所述主拷貝位置信息域。
26. 如權(quán)利要求25所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述信息更新模塊進(jìn)一步用于根據(jù)注冊新主拷貝請求中文件名判斷所述 主拷貝位置信息域中是否存儲對應(yīng)記錄,如果是,則用新主拷貝的全局位置信 息更新所述對應(yīng)記錄;否則,建立基于所述文件名的結(jié)構(gòu)體,在所述主拷貝位 置信息域中存儲所述新主拷貝的全局位置信息。
27. 如權(quán)利要求21所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述管理主機(jī)所用的InfiniBand通信采用Send/Receive操作。
28. 如權(quán)利要求25所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述請求處理模塊進(jìn)一步包括讀寫請求處理模塊和用于根據(jù)所述數(shù)據(jù)塊 名字從所述管理主機(jī)中獲得所述數(shù)據(jù)塊的主拷貝的全局位置信息,在所述內(nèi)存 池中査詢數(shù)據(jù)塊的査詢模塊,所述讀寫請求處理模塊,用于在所述存儲節(jié)點(diǎn)接收到讀寫請求時(shí),從請求 中獲得請求讀取的數(shù)據(jù)塊名字,所述數(shù)據(jù)塊名字包含數(shù)據(jù)塊所在文件的文件名 和所述數(shù)據(jù)塊在所述文件中的偏移,將所述數(shù)據(jù)塊名字發(fā)給所述查詢模塊;所述査詢模塊在所述內(nèi)存池中査詢所述數(shù)據(jù)塊;所述讀寫請 處理模塊,還用于根據(jù)査詢 果,如果所述 據(jù)塊的主拷貝 不在所述存儲節(jié)點(diǎn)本地,則復(fù)制所述主拷貝為一個(gè)副拷貝,存儲到本地。
29. 如權(quán)利要求28所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述請求處理模塊進(jìn)一步包括査詢請求處理模塊,所述査詢請求處理模塊,進(jìn)一步用于在所述存儲節(jié)點(diǎn)接收到數(shù)據(jù)塊查詢請 求時(shí),獲得數(shù)據(jù)塊査詢請求中包含的請求査詢的數(shù)據(jù)塊名字,將所述數(shù)據(jù)塊名 字發(fā)給所述査詢模塊;所述查詢模塊在所述內(nèi)存池中査詢所述數(shù)據(jù)塊。
30. 如權(quán)利要求29所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述存儲節(jié)點(diǎn)還包括用于從內(nèi)存池中選擇待用的內(nèi)存子塊的替換模塊, 所述査詢模塊進(jìn)一步包括位置信息預(yù)讀模塊,用于通過向所述管理主機(jī)發(fā)送包含所述文件名的獲取 主拷貝位置信息請求,將所述文件的所有數(shù)據(jù)塊的主拷貝的全局位置信息預(yù)讀 到本地;數(shù)據(jù)査找模塊,用于根據(jù)所述數(shù)據(jù)塊的主拷貝的全局位置信息在內(nèi)存池中 査詢所述數(shù)據(jù)塊的主拷貝,如果查詢到,則返回査詢到的主拷貝的位置信息, 否則,根據(jù)數(shù)據(jù)塊名字從所述后端存儲系統(tǒng)讀入所述數(shù)據(jù)塊的新主拷貝,啟動 所述替換模塊從內(nèi)存池中選擇待用的內(nèi)存子塊,將所述新主拷貝存儲到所述內(nèi) 存子塊;位置信息更新模塊,用于返回所述數(shù)據(jù)塊的新主拷貝的位置信息,并向所 述管理主機(jī)發(fā)送注冊新主拷貝請求。
31. 如權(quán)利要求30所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述請求處理模塊進(jìn)一步包括替換請求處理模塊,所述替換請求處理模塊,用于在所述存儲節(jié)點(diǎn)接收到替換請求時(shí),啟動所 述替換模塊從內(nèi)存池中選擇待用的內(nèi)存子塊;返回所述待用的內(nèi)存子塊位置信 息。 z
32. 如權(quán)利要求31所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述存儲節(jié)點(diǎn)包括所述通信域、用于記錄本地內(nèi)存子塊的相關(guān)信息的本地內(nèi)存子塊位置信息域、用于記錄其他存儲節(jié)點(diǎn)上最早最少使用的內(nèi)存子塊的時(shí)間信息的最老塊時(shí)間域;所述本地內(nèi)存子塊位置信息域中還包括用于記錄本地 最早最少使用的內(nèi)存子塊的時(shí)間信息的本地最老塊時(shí)間表;所述位置信息更新沖莫塊還用于更新所述存儲節(jié)點(diǎn)的本地內(nèi)存子塊位置信 息域;所述替換模塊進(jìn)一步包括空閑空間査找模塊、本地最早最少使用內(nèi)存査找 模塊、完成判斷模塊、全局最早最少使用內(nèi)存査找模塊;所述空閑空間查找模塊,用于根據(jù)通信域和本地內(nèi)存子塊位置信息域判斷 所述內(nèi)存池中是否存在空閑空間,如果所述存儲節(jié)點(diǎn)本地存在空閑空間,則從 所述空閑空間中選擇的待用的內(nèi)存子塊;如果空閑空間不在所述存儲節(jié)點(diǎn)本 地,則將所述存儲節(jié)點(diǎn)本地的內(nèi)存子塊的數(shù)據(jù)轉(zhuǎn)存到所述空閑空間,本地騰出 的內(nèi)存空間為待用的內(nèi)存子塊;如果內(nèi)存池不存在空閑空間,則被騰空的本地 的內(nèi)存子塊為所述待用的內(nèi)存子塊;如果內(nèi)存池中不存在空閑空間,則啟動所 述本地最早最少使用內(nèi)存査找模塊;所述本地最早最少使用內(nèi)存査找模塊,用于檢査所述本地最老塊時(shí)間表, 判斷所述本地最老塊時(shí)間表中最早最少使用的內(nèi)存子塊中存儲數(shù)據(jù)是否為主 拷貝,如果不是,選擇所述內(nèi)存子塊為所述待用的內(nèi)存子塊,啟動所述完成判 斷模塊,否則,啟動所述全局最早最少使用內(nèi)存査找模塊;所述完成判斷模塊,判斷已選擇的內(nèi)存子塊的空間加和是否小于要求選擇 的空間,如果是,則啟動所述空閑空間査找模塊;所述全局最早最少使用內(nèi)存査找模塊,檢査所述最老塊時(shí)間域,選擇所述 最老塊時(shí)間域中最早最少使用的內(nèi)存子塊,確定所述內(nèi)存子塊所在節(jié)點(diǎn),從所 述節(jié)點(diǎn)的本地最老塊時(shí)間表中選擇一個(gè)或多個(gè)最早最少使用的內(nèi)存子塊,選擇 的內(nèi)存子塊的空間加和大于或等于要求選擇的空間;將所述存儲節(jié)點(diǎn)本地的內(nèi) 存子塊的數(shù)據(jù)轉(zhuǎn)存到所述選擇的內(nèi)存子塊,被騰空的所述本地的內(nèi)存子塊為所 述待用的內(nèi)存子塊。
33.如權(quán)利要求32所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述內(nèi)存子塊中包括用于記錄標(biāo)志位和管理控制信息的塊頭; 所述全局最早最少使用內(nèi)存査找模塊還用于在所述存儲節(jié)點(diǎn)本地的數(shù)據(jù)被轉(zhuǎn)存的內(nèi)存子塊的塊頭中設(shè)置指向選擇的內(nèi)存子塊的向?qū)?biāo)志位,記錄向?qū)?地址。
34. 如權(quán)利要求33所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述數(shù)據(jù)査找模塊在根據(jù)所述數(shù)據(jù)塊的主拷貝的全局位置信息在內(nèi)存池 中査詢所述數(shù)據(jù)塊的主拷貝時(shí)進(jìn)一步用于根據(jù)所述全局位置信息到相應(yīng)節(jié)點(diǎn) 上讀取對應(yīng)內(nèi)存子塊的塊頭,將所述塊頭中數(shù)據(jù)塊名字和被查詢的數(shù)據(jù)塊名比 較,如果匹配,査詢成功;否則,如果所述塊頭中包含向?qū)?biāo)志位,向?qū)У刂?指向另一個(gè)節(jié)點(diǎn),則按所述向?qū)У刂窎苏蚁乱还?jié)點(diǎn);如果最后查找到的內(nèi)存子 塊向?qū)榭栈驏嗽兊墓?jié)點(diǎn)數(shù)超過預(yù)設(shè)值,則査詢失敗。
35. 如權(quán)利要求33所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述塊頭中包括有效標(biāo)志位和存儲的數(shù)據(jù)的數(shù)據(jù)塊名字, 所述讀寫請求處理模塊在根據(jù)査詢結(jié)果復(fù)制所述主拷貝為一個(gè)副拷貝存 儲到本地時(shí)進(jìn)一步用于將査詢到的內(nèi)存子塊的塊頭中的數(shù)據(jù)塊名字同請求操 作的數(shù)據(jù)塊名字比較,如果匹配,則讀寫成功,否則,根據(jù)所述有效標(biāo)志位判 斷內(nèi)存子塊中數(shù)據(jù)是否有效,如果無效,則重新査詢主拷貝的位置,進(jìn)行讀寫, 如果有效,則按向?qū)У刂分赶虻奈恢弥匦逻M(jìn)行讀寫。
36. 如權(quán)利要求35所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述塊頭中還包括加鎖標(biāo)志位,如果加鎖表明內(nèi)存子塊中數(shù)據(jù)正在更新; 所述讀寫請求處理模塊在讀寫時(shí)還用于判斷內(nèi)存子塊的加鎖標(biāo)志位判斷 是否加鎖,如果是,等待隨機(jī)或預(yù)設(shè)時(shí)間,重新進(jìn)行讀寫。
37. 如權(quán)利要求35所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,存儲節(jié)點(diǎn)進(jìn)行查詢和替換時(shí),所用所述Infiniband通信采用 Send/Rec"ve操作,進(jìn)行讀寫時(shí),所用所述Infiniband通信采用RDMA read/write操作。
38. 如權(quán)利要求35所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述讀寫請求處理模塊還用于當(dāng)對本地的一個(gè)副拷貝進(jìn)行寫操作完成后, 發(fā)送多播消息使其他存儲節(jié)點(diǎn)上的副拷貝失效,將包含寫操作中更新數(shù)據(jù)信息 的Diff結(jié)果發(fā)送給主拷貝所在存儲節(jié)點(diǎn),以使主拷貝進(jìn)行同步更新;當(dāng)存儲 節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作完成后,發(fā)送多播消息,使每個(gè)副拷貝無 效。
39. 如權(quán)利要求36所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng),其特 征在于,所述讀寫請求處理模塊還用于當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)副拷貝進(jìn)行寫操 作前,發(fā)送多播消息,其他存儲節(jié)點(diǎn)上的副拷貝失效,將副拷貝對應(yīng)的主拷貝 加鎖;當(dāng)存儲節(jié)點(diǎn)對所述副拷貝進(jìn)行寫操作完成后,將包含寫操作中更新數(shù)據(jù) 信息的Diff結(jié)果發(fā)送給所述主拷貝所在存儲節(jié)點(diǎn),以使主拷貝解鎖,并進(jìn)行 同步更新;當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作前,對自身加鎖,并發(fā) 送多播消息使每個(gè)副拷貝無效;當(dāng)存儲節(jié)點(diǎn)對本地的一個(gè)主拷貝進(jìn)行寫操作完 成后,對自身解鎖。
40. 如權(quán)利要求38或39所述的基于InfiniBand網(wǎng)絡(luò)的分布式存儲系統(tǒng), 其特征在于,存儲節(jié)點(diǎn)對標(biāo)志位進(jìn)行修改時(shí),所用所述Inf iniband通信采用原子操作。
全文摘要
本發(fā)明涉及基于InfiniBand網(wǎng)絡(luò)的分布式存儲方法及系統(tǒng),方法包括步驟1,通過InfiniBand網(wǎng)絡(luò)連接節(jié)點(diǎn),節(jié)點(diǎn)包括管理主機(jī)和存儲節(jié)點(diǎn);步驟2,每兩個(gè)節(jié)點(diǎn)間建立InfiniBand通信;步驟3,存儲節(jié)點(diǎn)分配內(nèi)存空間,對內(nèi)存空間進(jìn)行預(yù)注冊,將分配的內(nèi)存空間的相關(guān)信息發(fā)送給其他節(jié)點(diǎn),內(nèi)存空間構(gòu)建成內(nèi)存池;步驟4,管理主機(jī)通過InfiniBand通信接收存儲節(jié)點(diǎn)的請求,提供并維護(hù)節(jié)點(diǎn)從后端存儲系統(tǒng)讀入的主拷貝的全局位置信息;步驟5,存儲節(jié)點(diǎn)接收請求,根據(jù)從管理主機(jī)獲得的同請求相關(guān)的主拷貝的全局位置信息進(jìn)行同請求對應(yīng)的操作,或根據(jù)本地存儲的其他存儲節(jié)點(diǎn)分配的內(nèi)存空間相關(guān)信息進(jìn)行請求對應(yīng)的操作。本發(fā)明能夠充分發(fā)揮了InfiniBand網(wǎng)絡(luò)優(yōu)點(diǎn),實(shí)現(xiàn)了各節(jié)點(diǎn)間數(shù)據(jù)的快速轉(zhuǎn)移。
文檔編號H04L29/08GK101577716SQ200910086888
公開日2009年11月11日 申請日期2009年6月10日 優(yōu)先權(quán)日2009年6月10日
發(fā)明者周永豪, 李金榜, 韓冀中 申請人:中國科學(xué)院計(jì)算技術(shù)研究所