一種基于scst的雙控緩存同步設(shè)計(jì)方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)服務(wù)器存儲(chǔ)技術(shù)領(lǐng)域,具體地說(shuō)是一種基于SCST的雙控緩存同步設(shè)計(jì)方法。
【背景技術(shù)】
[0002]隨著計(jì)算機(jī)技術(shù)、網(wǎng)絡(luò)技術(shù)的快速發(fā)展,對(duì)于數(shù)據(jù)存儲(chǔ)的可靠性也逐漸得到了重視。現(xiàn)在的存儲(chǔ)方式多采用價(jià)格較為磁盤組合成為巨大容量的磁盤組,配合數(shù)據(jù)分散排列的設(shè)計(jì),將數(shù)據(jù)分割為不同的區(qū)段,分別進(jìn)行存儲(chǔ),從而構(gòu)成了磁盤陣列。這樣系統(tǒng)的可靠性瓶頸為磁盤陣列控制器,目前的方式可以采用多路磁盤陣列控制器共享磁盤陣列的方式,這樣既可以增加陣列系統(tǒng)的可靠性,又可以通過(guò)多路控制器對(duì)外進(jìn)行數(shù)據(jù)存儲(chǔ)服務(wù),提高了存儲(chǔ)效率。
[0003]目前來(lái)說(shuō),基于SCST的網(wǎng)絡(luò)存儲(chǔ)構(gòu)架方案中,SCST已經(jīng)為不同類型的目標(biāo)端驅(qū)動(dòng)程序提供統(tǒng)一的接口,屏蔽不同類型驅(qū)動(dòng)程序的差異性,便于多種目標(biāo)端驅(qū)動(dòng)程序以統(tǒng)一的方式和底層各種存儲(chǔ)設(shè)備的連接。SCST的核心模塊處于Linux存儲(chǔ)結(jié)構(gòu)的塊設(shè)備層之上。SCST支持多種I/O模式,常用的方式為Block 1和File 1兩種模式。采用Block1模式,可以繞開系統(tǒng)cache,創(chuàng)建獨(dú)立的緩存池結(jié)構(gòu),并設(shè)計(jì)不同的緩存刷寫算法實(shí)現(xiàn)硬盤的刷寫。但是單臺(tái)存儲(chǔ)控制器存在單點(diǎn)失效的問題,影響了數(shù)據(jù)的可靠存儲(chǔ)。因此,實(shí)現(xiàn)在多臺(tái)控制器之間的緩存同步是一個(gè)必要的技術(shù)。
[0004]基于此,本發(fā)明提供一種基于SCST的雙控緩存同步設(shè)計(jì)方法,該方法采用SCST來(lái)處理I/O請(qǐng)求,將數(shù)據(jù)緩存到系統(tǒng)緩存池中。通過(guò)設(shè)計(jì)同步機(jī)制和同步算法,解決了存儲(chǔ)控制器的單點(diǎn)失效引起的數(shù)據(jù)丟失問題。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的技術(shù)任務(wù)是針對(duì)在現(xiàn)有技術(shù)的不足,提供一種基于SCST的雙控緩存同步設(shè)計(jì)方法。
[0006]本發(fā)明的技術(shù)方案是按以下方式實(shí)現(xiàn)的,該一種基于SCST的雙控緩存同步設(shè)計(jì)方法,該方法通過(guò)以下步驟實(shí)現(xiàn):
將客戶機(jī)連接到兩個(gè)相同的存儲(chǔ)控制器A和B中,兩存儲(chǔ)控制器內(nèi)均設(shè)置SCST緩存區(qū)、緩存池模塊和同步模塊,兩存儲(chǔ)控制器均連接磁盤陣列;
當(dāng)客戶機(jī)數(shù)據(jù)輸入一存儲(chǔ)控制器時(shí),該存儲(chǔ)控制器內(nèi)的數(shù)據(jù)備份到另一存儲(chǔ)控制器,實(shí)現(xiàn)兩存儲(chǔ)控制器內(nèi)的緩存同步;
然后將存儲(chǔ)控制器中的數(shù)據(jù)寫入到磁盤陣列中。
[0007]所述SCST緩存區(qū)以存儲(chǔ)控制器主機(jī)的主存為存儲(chǔ)器;緩存塊大小按照內(nèi)存頁(yè)面的4KB大小設(shè)計(jì),緩存塊由一個(gè)內(nèi)存頁(yè)組成。
[0008]所述存儲(chǔ)控制器內(nèi)的數(shù)據(jù)同步緩存過(guò)程為:
數(shù)據(jù)傳輸?shù)酱鎯?chǔ)控制器A,首先放入其緩存池模塊中,該緩存池模塊同時(shí)保存未寫入磁盤的數(shù)據(jù)和已寫入磁盤的數(shù)據(jù);
緩存池模塊中的數(shù)據(jù)發(fā)送到同步模塊A與存儲(chǔ)控制器B的同步模塊中,最后傳遞到存儲(chǔ)控制器B的緩存池模塊中,使得每個(gè)存儲(chǔ)控制器中的數(shù)據(jù),既包含有本地存儲(chǔ)控制器的緩存數(shù)據(jù),也包含有另一存儲(chǔ)控制器的緩存數(shù)據(jù)。
[0009]所述存儲(chǔ)控制器A與B進(jìn)行數(shù)據(jù)緩存前,需要進(jìn)行握手通信的步驟,該握手通信的步驟為:
首先是存儲(chǔ)控制器A的緩存池模塊發(fā)送一個(gè)隨機(jī)數(shù)a至存儲(chǔ)控制器A的同步模塊;存儲(chǔ)控制器A的同步模塊將隨機(jī)數(shù)a作為種子參數(shù)生成隨機(jī)數(shù)b,存儲(chǔ)控制器A的同步模塊存儲(chǔ)隨機(jī)數(shù)對(duì)(a,b),并將隨機(jī)數(shù)b發(fā)送到存儲(chǔ)控制器B的同步模塊;
存儲(chǔ)控制器B的同步模塊將隨機(jī)數(shù)b作為種子參數(shù)生成隨機(jī)數(shù)C,存儲(chǔ)控制器B的同步模塊存儲(chǔ)隨機(jī)數(shù)對(duì)(b,c),并將隨機(jī)數(shù)c發(fā)送到存儲(chǔ)控制器B的緩存池模塊;
存儲(chǔ)控制器B的緩存池模塊將收到隨機(jī)數(shù)c加I發(fā)送至存儲(chǔ)控制器B的同步模塊,存儲(chǔ)控制器B的同步模塊收到Ack確認(rèn)c+1后根據(jù)隨機(jī)數(shù)對(duì)(b,c)返回Ack確認(rèn)b+Ι ;
依次進(jìn)行該過(guò)程,直到存儲(chǔ)控制器A收到Ack確認(rèn)信號(hào)。
[0010]經(jīng)過(guò)握手步驟后,數(shù)據(jù)開始傳輸緩存,數(shù)據(jù)傳輸過(guò)程兩部分內(nèi)容:一是數(shù)據(jù)流,另一個(gè)是確認(rèn)流數(shù)據(jù);
當(dāng)數(shù)據(jù)從存儲(chǔ)控制器A傳輸?shù)酱鎯?chǔ)控制器B中時(shí),存儲(chǔ)控制器A將不斷進(jìn)行數(shù)據(jù)流發(fā)送,存儲(chǔ)控制器B將確認(rèn)收到的數(shù)據(jù)塊進(jìn)行確認(rèn),發(fā)送確認(rèn)流;
當(dāng)存儲(chǔ)控制器A未收到存儲(chǔ)控制器B的確認(rèn)信號(hào)時(shí),就不斷重發(fā),直到收到ACK信號(hào)或達(dá)到閾值時(shí)間后停止。
[0011]所述每一個(gè)存儲(chǔ)控制器的數(shù)據(jù)來(lái)源均為客戶機(jī)或另一存儲(chǔ)控制器,當(dāng)數(shù)據(jù)源為客戶機(jī)時(shí),數(shù)據(jù)首先緩存到緩存池模塊中查詢塊數(shù)據(jù)是否存在;若數(shù)據(jù)塊已經(jīng)存在于緩存池模塊中,那么將數(shù)據(jù)塊丟棄,并發(fā)送Ack信號(hào)確定已經(jīng)執(zhí)行成功;若數(shù)據(jù)塊不在緩存池模塊中,將數(shù)據(jù)保存到緩存池模塊中,并將數(shù)據(jù)傳輸?shù)酵侥K中;同步模塊將數(shù)據(jù)同步到其他控制器并收到Ack信號(hào)以后,修改緩存池模塊中數(shù)據(jù);
當(dāng)數(shù)據(jù)源為另一存儲(chǔ)控制器時(shí),數(shù)據(jù)首先緩存到緩存池模塊中查詢塊數(shù)據(jù)是否存在;若數(shù)據(jù)塊已經(jīng)存在于緩存池模塊中,那么將數(shù)據(jù)塊丟棄,并發(fā)送Ack信號(hào)確定已經(jīng)執(zhí)行成功;若數(shù)據(jù)塊不在緩存池模塊中,將數(shù)據(jù)保存到緩存池模塊中,發(fā)送ACK以后修改緩存池模塊中數(shù)據(jù)。
[0012]存儲(chǔ)控制器A的同步模塊的數(shù)據(jù)發(fā)送到存儲(chǔ)控制器B的同步模塊中采用滑動(dòng)窗口算法,定義Syc Module A為發(fā)送方,Syc Module B為接收方,該算法的具體過(guò)程為:
初始態(tài),發(fā)送方?jīng)]有幀發(fā)出,發(fā)送窗口前后沿相重合;接收方O號(hào)窗口打開,等待接收O號(hào)幀;
發(fā)送方打開O號(hào)窗口,表示已發(fā)出O幀但尚確認(rèn)返回信息,此時(shí)接收窗口狀態(tài)不變;發(fā)送方打開O、I號(hào)窗口,表不O、I號(hào)幀均在等待確認(rèn)之列;至此,發(fā)送方打開的窗口數(shù)已達(dá)規(guī)定限度,在未收到新的確認(rèn)返回幀之前,發(fā)送方將暫停發(fā)送新的數(shù)據(jù)幀,接收窗口此時(shí)狀態(tài)仍未變;
接收方已收到O號(hào)幀,O號(hào)窗口關(guān)閉,I號(hào)窗口打開,表不準(zhǔn)備接收I號(hào)幀,此時(shí)發(fā)送窗口狀態(tài)不變; 發(fā)送方收到接收方發(fā)來(lái)的O號(hào)幀確認(rèn)返回信息,關(guān)閉O號(hào)窗口,表示從重發(fā)表中刪除O號(hào)幀,此時(shí)接收窗口狀態(tài)仍不變;
發(fā)送方繼續(xù)發(fā)送2號(hào)幀,2號(hào)窗口打開,表不2號(hào)幀也納入待確認(rèn)之列,至此,發(fā)送方窗口又已達(dá)規(guī)定限度,在未收到新的確認(rèn)返回幀之前,發(fā)送方將暫停發(fā)送新的數(shù)據(jù)幀,此時(shí)接收窗口狀態(tài)仍不變;
接收方已收到I號(hào)幀,I號(hào)窗口關(guān)閉,2號(hào)窗口打開,表不準(zhǔn)備接收2號(hào)幀,時(shí)發(fā)送窗口狀態(tài)不變;
發(fā)送方收到接收方發(fā)來(lái)的I號(hào)幀的確認(rèn)信息,關(guān)閉I號(hào)窗口,表示從重發(fā)表中刪除I號(hào)幀,此時(shí)接收窗口狀態(tài)仍不變。
[0013]本發(fā)明與現(xiàn)有技術(shù)相比所產(chǎn)生的有益效果是:
本發(fā)明的一種基于SCST的雙控緩存同步設(shè)計(jì)方法可將控制器的數(shù)據(jù)備份到其他控制器中,可以實(shí)現(xiàn)存儲(chǔ)控制器數(shù)據(jù)的備份存儲(chǔ),緩存數(shù)據(jù)可以實(shí)現(xiàn)多物理傳輸介質(zhì)的同步,滿足海量陣列存儲(chǔ)系統(tǒng)的吞吐量需求;當(dāng)某一控制器出現(xiàn)故障時(shí),其它控制器可繼續(xù)進(jìn)行數(shù)據(jù)可靠存儲(chǔ),保證了數(shù)據(jù)的安全性和可靠性,實(shí)用性強(qiáng),易于推廣。
【附圖說(shuō)明】
[0014]附圖1是本發(fā)明的總體實(shí)現(xiàn)框圖。
[0015]附圖2是本發(fā)明的緩存同步數(shù)據(jù)流示意圖。
[0016]附圖3是本發(fā)明的緩存同步過(guò)程流程圖。
[0017]附圖4是本發(fā)明的滑動(dòng)窗口算法示意圖。
【具體實(shí)施方式】
[0018]下面結(jié)合附圖對(duì)本發(fā)明所提供的一種基于SCST的雙控緩存同步設(shè)計(jì)方法作以下詳細(xì)說(shuō)明。
[0019]本發(fā)明提出一種基于SCST的雙控緩存同步設(shè)計(jì)方法,該模塊需要與SCST結(jié)合,實(shí)現(xiàn)塊數(shù)據(jù)的緩存同步。本發(fā)明將用于存儲(chǔ)控制器中,方案需要設(shè)計(jì)同步機(jī)制和同步算法,保持兩個(gè)控制器之間的數(shù)據(jù)一致性。該方案包括兩個(gè)模塊,分別為緩存池模塊Memp00I與同步模塊Syc Module,主要設(shè)計(jì)傳遞數(shù)據(jù)結(jié)構(gòu),同步算法和同步策略等。
[0020]如附圖1所示,該方法通過(guò)以下步驟實(shí)現(xiàn):
將客戶機(jī)連接到兩個(gè)相同的存儲(chǔ)控制器A和B中,兩存儲(chǔ)控制器內(nèi)均設(shè)置SCST緩存區(qū)、緩存池模塊和同步模塊,兩存儲(chǔ)控制器均連接磁盤陣列;
當(dāng)客戶機(jī)數(shù)據(jù)輸入一存儲(chǔ)控制器時(shí),該存儲(chǔ)控制器內(nèi)的數(shù)據(jù)備份到另一存儲(chǔ)控制器,實(shí)現(xiàn)兩存儲(chǔ)控制器內(nèi)的緩存同步;
然后將存儲(chǔ)控制器中的數(shù)據(jù)寫入到磁盤陣列中。
[0021]SCST緩存區(qū)以控制器主機(jī)的主存為存儲(chǔ)器。緩存塊大小按照內(nèi)存頁(yè)面的4KB大小設(shè)計(jì),緩存塊由一個(gè)內(nèi)存頁(yè)組成。
[0022]從客戶機(jī)Client的數(shù)據(jù)傳輸?shù)酱鎯?chǔ)控制器A,首先放入Mempool中。Mempool需要同時(shí)保存未寫入磁盤的數(shù)據(jù)和已寫入磁盤的數(shù)據(jù)(加快文件讀)。Mempool中的數(shù)據(jù)發(fā)送到Syc Module與存儲(chǔ)控制器B的Syc Module中,最后傳遞到存儲(chǔ)控制器B的Mempool中。該過(guò)程中需要實(shí)時(shí)保證數(shù)據(jù)的一致性,即存儲(chǔ)控制器A與B的Mempool是一致的。同理,對(duì)于存儲(chǔ)控制器B的數(shù)據(jù)也是執(zhí)行相同的操作。對(duì)于每個(gè)存儲(chǔ)控制器中的數(shù)據(jù),既包含有本地存儲(chǔ)控制器的緩存數(shù)據(jù),也包含有其他存儲(chǔ)控制器的緩存數(shù)據(jù),因此每個(gè)存儲(chǔ)控制器都有全部數(shù)據(jù)的備份,保證在單點(diǎn)失效的情況下,其他存儲(chǔ)控制器也可以將數(shù)據(jù)寫入磁盤陣列 Disk Array 中。
[0023]如附圖2所示,所述存儲(chǔ)控制器A與B進(jìn)行數(shù)據(jù)緩存前,需要進(jìn)行握手通信Handshaking的步驟,該握手通信的步驟為:
首先是存儲(chǔ)控制器A的緩存池模塊發(fā)送一個(gè)隨機(jī)數(shù)a至存儲(chǔ)控制器A的同步模塊;存儲(chǔ)控制器A的同步模塊將隨機(jī)數(shù)a作為種子參數(shù)生成隨機(jī)數(shù)b,存儲(chǔ)控制器A的同步模塊存儲(chǔ)隨機(jī)數(shù)對(duì)(a,b),并將隨機(jī)數(shù)b發(fā)送到存儲(chǔ)控制器B的同步