本發明實施例涉及通信技術領域,尤其涉及一種數據存儲方法及裝置。
背景技術:
Docker是一個開源的應用容器引擎,在物理主機上安裝Docker后,可在Docker的基礎上承載多個容器,多個容器之間相互隔離,多個容器共享物理主機的操作系統,各容器可放置并執行不同的應用程序。
現有技術中,Docker引擎承載的每個Docker容器可能有數據產生,同時,Docker容器需要將其產生的數據存儲到存儲器,多個Docker容器可能會將各自的數據存儲到同一個存儲器中,此時,存儲器一次只能允許一個Docker容器寫數據,該Docker容器往存儲器中寫數據的時候,其他Docker容器等能排隊等待。
可見,當需要往存儲器中同時寫數據的Docker容器較多時,勢必造成Docker容器排隊等待時間較長,導致數據存儲效率低。
技術實現要素:
本發明實施例提供一種數據存儲方法及裝置,以提高數據存儲效率。
本發明實施例的一個方面是提供一種數據存儲方法,包括:
接收第一Docker容器發送的第一待存儲數據;
對所述第一待存儲數據進行分塊處理,獲得多個第一目標數據塊;
給每個第一目標數據塊分配一個令牌,并將每個第一目標數據塊對應的令牌發送給所述第一Docker容器,以使所述第一Docker容器根據所述令牌存儲所述多個第一目標數據塊;
接收第二Docker容器發送的第二待存儲數據;
對所述第二待存儲數據進行分塊處理,獲得多個第二目標數據塊;
確定所述多個第二目標數據塊與所述多個第一目標數據塊的重復數據塊;
給所述多個第二目標數據塊中除所述重復數據塊之外的每個第二目標數據塊分配一個令牌,并將分配有令牌的第二目標數據塊對應的令牌發送給所述第二Docker容器,以使所述第二Docker容器存儲所述分配有令牌的第二目標數據塊。
本發明實施例的另一個方面是提供一種數據存儲裝置,包括:
接收模塊,用于接收第一Docker容器發送的第一待存儲數據;接收第二Docker容器發送的第二待存儲數據;
處理模塊,用于對所述第一待存儲數據進行分塊處理,獲得多個第一目標數據塊;給每個第一目標數據塊分配一個令牌;對所述第二待存儲數據進行分塊處理,獲得多個第二目標數據塊;確定所述多個第二目標數據塊與所述多個第一目標數據塊的重復數據塊;給所述多個第二目標數據塊中除所述重復數據塊之外的每個第二目標數據塊分配一個令牌;
發送模塊,用于將每個第一目標數據塊對應的令牌發送給所述第一Docker容器,以使所述第一Docker容器根據所述令牌存儲所述多個第一目標數據塊;將分配有令牌的第二目標數據塊對應的令牌發送給所述第二Docker容器,以使所述第二Docker容器存儲所述分配有令牌的第二目標數據塊。
本發明實施例提供的數據存儲方法及裝置,當各個Docker容器同時有待存儲的數據時,通過對各個Docker容器產生的待存儲數據進行分塊處理,給每個分塊后的數據分配一個令牌,該令牌起到標識數據的作用,不同的分塊數據對應不同的令牌,各個Docker容器可將分配有令牌的分塊數據同時發送給存儲器,存儲器根據不同的令牌,存儲不同的分塊數據,各個Docker容器無需排隊等待存儲器存儲數據,提高了數據存儲效率。
附圖說明
圖1為本發明實施例提供的數據存儲方法流程圖;
圖2為本發明實施例提供的數據存儲方法適用的網絡架構圖;
圖3為本發明另一實施例提供的數據存儲方法流程圖;
圖4為本發明另一實施例提供的數據存儲方法流程圖;
圖5為本發明實施例提供的數據存儲裝置的結構圖;
圖6為本發明另一實施例提供的數據存儲裝置的結構圖。
具體實施方式
圖1為本發明實施例提供的數據存儲方法流程圖;圖2為本發明實施例提供的數據存儲方法適用的網絡架構圖。本發明實施例針對現有技術中,當需要往存儲器中同時寫數據的Docker容器較多時,勢必造成Docker容器排隊等待時間較長,導致數據存儲效率低,提供了數據存儲方法,該方法具體步驟如下:
步驟S101、接收第一Docker容器發送的第一待存儲數據。
如圖2所示,Docker服務器11包括Docker容器1、Docker容器2、以及Docker引擎1,Docker服務器12包括Docker容器3、Docker容器4、以及Docker引擎2。Docker容器1、Docker容器2產生的數據可以通過Docker引擎1存儲到主存儲器14或備存儲器15,Docker容器3、Docker容器4產生的數據可以通過Docker引擎2存儲到主存儲器14或備存儲器15。
本實施例的執行主體是圖2所示的服務器13,服務器13包括目標區塊識別模塊,當Docker容器1、Docker容器2、Docker容器3、Docker容器4產生待存儲的數據時,將該待存儲的數據發送給服務器13。假設服務器13接收到了Docker容器1發送的第一待存儲數據。
步驟S102、對所述第一待存儲數據進行分塊處理,獲得多個第一目標數據塊。
服務器13中的目標區塊識別模塊對該第一待存儲數據進行分塊處理,具體可以按照預先設定的分塊大小對該第一待存儲數據進行分塊處理,得到多個小的分塊,每個小的分塊記為第一目標數據塊。
步驟S103、給每個第一目標數據塊分配一個令牌,并將每個第一目標數據塊對應的令牌發送給所述第一Docker容器,以使所述第一Docker容器根據所述令牌存儲所述多個第一目標數據塊。
服務器13中的目標區塊識別模塊給每個第一目標數據塊分配一個令牌,服務器13將每個第一目標數據塊對應的令牌發送給Docker容器1,Docker容器1可將令牌作為每個第一目標數據塊的標識,并將每個第一目標數據塊,以及每個第一目標數據塊對應的令牌發送給主存儲器14,主存儲器14對每個令牌標識的第一目標數據塊進行存儲。
步驟S104、接收第二Docker容器發送的第二待存儲數據。
另外,當Docker容器2、Docker容器3或Docker容器4產生待發送的數據時,服務器13還可以接收Docker容器2、Docker容器3或Docker容器4發送的第二待存儲數據,服務器13可以同時接收Docker容器1、Docker容器2、Docker容器3或Docker容器4發送的數據,也可以分時接收。
假設服務器13在接收到Docker容器1發送的數據之后,接收到了Docker容器2發送的第二待存儲數據。
步驟S105、對所述第二待存儲數據進行分塊處理,獲得多個第二目標數據塊。
服務器13中的目標區塊識別模塊對該第二待存儲數據進行分塊處理,具體可以按照預先設定的分塊大小對該第二待存儲數據進行分塊處理,得到多個小的分塊,每個小的分塊記為第二目標數據塊。
步驟S106、確定所述多個第二目標數據塊與所述多個第一目標數據塊的重復數據塊。
由于Docker容器1和Docker容器2是同一個Docker服務器的Docker容器,Docker容器1和Docker容器2產生的數據可能相同,導致所述多個第二目標數據塊與所述多個第一目標數據塊有重復數據塊,目標區塊識別模塊可以比對出所述多個第二目標數據塊與所述多個第一目標數據塊的重復數據塊。
另外,目標區塊識別模塊還可以將重復數據塊放入排隊隊列,Docker容器1中與排隊隊列重復的數據塊存儲到主存儲器14之后,Docker容器1中的數據的令牌被釋放,釋放的令牌可以分配給排隊隊列中相應的數據塊。
步驟S107、給所述多個第二目標數據塊中除所述重復數據塊之外的每個第二目標數據塊分配一個令牌,并將分配有令牌的第二目標數據塊對應的令牌發送給所述第二Docker容器,以使所述第二Docker容器存儲所述分配有令牌的第二目標數據塊。
目標區塊識別模塊給所述多個第二目標數據塊中除所述重復數據塊之外的每個第二目標數據塊分配一個令牌,并將分配有令牌的第二目標數據塊對應的令牌發送給Docker容器2,Docker容器2可將令牌作為第二目標數據塊的標識,將分配有令牌的第二目標數據塊,以及第二目標數據塊的令牌發送給主存儲器14,主存儲器14對每個令牌標識的第二目標數據塊進行存儲。
本實施例中,當各個Docker容器同時有待存儲的數據時,通過對各個Docker容器產生的待存儲數據進行分塊處理,給每個分塊后的數據分配一個令牌,該令牌起到標識數據的作用,不同的分塊數據對應不同的令牌,各個Docker容器可將分配有令牌的分塊數據同時發送給存儲器,存儲器根據不同的令牌,存儲不同的分塊數據,各個Docker容器無需排隊等待存儲器存儲數據,提高了數據存儲效率。
圖3為本發明另一實施例提供的數據存儲方法流程圖。在圖1所示實施例的基礎上,給所述多個第二目標數據塊中除所述重復數據塊之外的每個第二目標數據塊分配一個令牌之后,還包括如下方法步驟:
步驟S301、接收存儲器發送的已用令牌。
當主存儲器14存儲了第一目標數據塊或第二目標數據塊后,第一目標數據塊或第二目標數據塊對應的令牌可以釋放,具體的,主存儲器14將已用令牌發送給服務器13,服務器13將已用令牌轉發給目標區塊識別模塊。
步驟S302、根據所述已用令牌對應的目標數據塊,確定所述重復數據塊中是否有與所述目標數據塊相同的數據塊。
目標區塊識別模塊接收到已用令牌后,確定出已用令牌對應的目標數據塊,例如第一目標數據塊或第二目標數據塊,進一步確定步驟S106中重復數據塊是否包括有與所述目標數據塊相同的數據塊。
步驟S303、若所述重復數據塊中有與所述目標數據塊相同的數據塊,則將所述已用令牌分配給所述數據塊。
若所述重復數據塊中有與所述目標數據塊相同的數據塊,則目標區塊識別模塊將該已用令牌分配給所述數據塊。
步驟S304、將所述已用令牌發送給所述數據塊對應的Docker容器。
由于所述重復數據塊是Docker容器2對應的第二目標數據塊,目標區塊識別模塊將已用令牌發送給Docker容器2,Docker容器2根據該已用令牌將所述數據塊發送給主存儲器14。
本實施例中,當存儲器存儲數據后,將數據對應的令牌返回給目標區塊識別模塊,目標區塊識別模塊用存儲器返回的令牌標記重復數據塊中的數據,提高了令牌利用率。
圖4為本發明另一實施例提供的數據存儲方法流程圖。在上述任一實施例的基礎上,如圖4所示,本實施例提供的數據存儲方法還包括如下方法步驟:
步驟S401、在預設時間內檢測所述存儲器是否返回所述令牌。
另外,目標區塊識別模塊還可以記錄發放出去的令牌是否在預設時間內被收回,即發放出去的令牌是否在預設時間內由主存儲器14返回給了目標區塊識別模塊。
步驟S402、若在預設時間內所述存儲器沒有返回所述令牌,則將所述令牌分配給其他Docker容器。
假設某一令牌,從目標區塊識別模塊發放時刻開始,在預設時間內,主存儲器14沒有返回給目標區塊識別模塊,則目標區塊識別模塊將該令牌分配給其他Docker容器例如Docker容器3。
步驟S403、檢測所述令牌的進程健康狀態。
為了保證分配給Docker容器3的令牌正常執行數據存儲過程,目標區塊識別模塊還可進一步檢測該令牌的進程健康狀態。
步驟S404、若所述進程健康狀態表示所述令牌處于非正常狀態,則給其他Docker容器分配一個新的令牌。
若所述進程健康狀態表示所述令牌處于非正常狀態,則目標區塊識別模塊給Docker容器3重新分配一個令牌。
步驟S405、調整所述預設分塊大小。
進一步的,目標區塊識別模塊還可以調整預設分塊大小,即調整對各個Docker容器發送的待存儲數據的分塊粒度。
本實施例中,通過檢測每個令牌是否在預設時間內被收回,可將沒有在預設時間內收回的令牌分配給其他Docker容器,并檢測該令牌的進程健康狀態,當該進程健康狀態標識分配給其他Docker容器的令牌非正常狀態時,給其他Docker容器分配一個新的令牌,保證了數據存儲的正常執行,同時還可以調整預設分塊大小,即可根據丟失的令牌數量,調整對各個Docker容器發送的待存儲數據的分塊粒度,提高了分塊粒度的靈活性。
圖5為本發明實施例提供的數據存儲裝置的結構圖。本發明實施例提供的數據存儲裝置可以執行數據存儲方法實施例提供的處理流程,如圖5所示,數據存儲裝置包括接收模塊51、處理模塊52和發送模塊53,其中,接收模塊51用于接收第一Docker容器發送的第一待存儲數據;接收第二Docker容器發送的第二待存儲數據;處理模塊52用于對所述第一待存儲數據進行分塊處理,獲得多個第一目標數據塊;給每個第一目標數據塊分配一個令牌;對所述第二待存儲數據進行分塊處理,獲得多個第二目標數據塊;確定所述多個第二目標數據塊與所述多個第一目標數據塊的重復數據塊;給所述多個第二目標數據塊中除所述重復數據塊之外的每個第二目標數據塊分配一個令牌;發送模塊53用于將每個第一目標數據塊對應的令牌發送給所述第一Docker容器,以使所述第一Docker容器根據所述令牌存儲所述多個第一目標數據塊;將分配有令牌的第二目標數據塊對應的令牌發送給所述第二Docker容器,以使所述第二Docker容器存儲所述分配有令牌的第二目標數據塊。
本實施例中,當各個Docker容器同時有待存儲的數據時,通過對各個Docker容器產生的待存儲數據進行分塊處理,給每個分塊后的數據分配一個令牌,該令牌起到標識數據的作用,不同的分塊數據對應不同的令牌,各個Docker容器可將分配有令牌的分塊數據同時發送給存儲器,存儲器根據不同的令牌,存儲不同的分塊數據,各個Docker容器無需排隊等待存儲器存儲數據,提高了數據存儲效率。
圖6為本發明另一實施例提供的數據存儲裝置的結構圖。如圖6所示,在圖5的基礎上,接收模塊51還用于接收存儲器發送的已用令牌;處理模塊52還用于根據所述已用令牌對應的目標數據塊,確定所述重復數據塊中是否有與所述目標數據塊相同的數據塊;若所述重復數據塊中有與所述目標數據塊相同的數據塊,則將所述已用令牌分配給所述數據塊;發送模塊53還用于將所述已用令牌發送給所述數據塊對應的Docker容器。
處理模塊52具體用于根據預設分塊大小,對所述第一待存儲數據進行分塊處理;根據預設分塊大小,對所述第二待存儲數據進行分塊處理。
數據存儲裝置還包括檢測模塊54,檢測模塊54用于在預設時間內檢測所述存儲器是否返回所述令牌;處理模塊52還用于若在預設時間內所述存儲器沒有返回所述令牌,則將所述令牌分配給其他Docker容器。
進一步的,檢測模塊54還用于檢測所述令牌的進程健康狀態;處理模塊52還用于若所述進程健康狀態表示所述令牌處于非正常狀態,則給其他Docker容器分配一個新的令牌;調整所述預設分塊大小。
本發明實施例提供的數據存儲裝置可以具體用于執行上述圖3或圖4所提供的方法實施例,具體功能此處不再贅述。
本實施例中,當存儲器存儲數據后,將數據對應的令牌返回給目標區塊識別模塊,目標區塊識別模塊用存儲器返回的令牌標記重復數據塊中的數據,提高了令牌利用率;通過檢測每個令牌是否在預設時間內被收回,可將沒有在預設時間內收回的令牌分配給其他Docker容器,并檢測該令牌的進程健康狀態,當該進程健康狀態標識分配給其他Docker容器的令牌非正常狀態時,給其他Docker容器分配一個新的令牌,保證了數據存儲的正常執行,同時還可以調整預設分塊大小,即可根據丟失的令牌數量,調整對各個Docker容器發送的待存儲數據的分塊粒度,提高了分塊粒度的靈活性。
綜上所述,本發明實施例當各個Docker容器同時有待存儲的數據時,通過對各個Docker容器產生的待存儲數據進行分塊處理,給每個分塊后的數據分配一個令牌,該令牌起到標識數據的作用,不同的分塊數據對應不同的令牌,各個Docker容器可將分配有令牌的分塊數據同時發送給存儲器,存儲器根據不同的令牌,存儲不同的分塊數據,各個Docker容器無需排隊等待存儲器存儲數據,提高了數據存儲效率;當存儲器存儲數據后,將數據對應的令牌返回給目標區塊識別模塊,目標區塊識別模塊用存儲器返回的令牌標記重復數據塊中的數據,提高了令牌利用率;通過檢測每個令牌是否在預設時間內被收回,可將沒有在預設時間內收回的令牌分配給其他Docker容器,并檢測該令牌的進程健康狀態,當該進程健康狀態標識分配給其他Docker容器的令牌非正常狀態時,給其他Docker容器分配一個新的令牌,保證了數據存儲的正常執行,同時還可以調整預設分塊大小,即可根據丟失的令牌數量,調整對各個Docker容器發送的待存儲數據的分塊粒度,提高了分塊粒度的靈活性。
在本發明所提供的幾個實施例中,應該理解到,所揭露的裝置和方法,可以通過其它的方式實現。例如,以上所描述的裝置實施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現時可以有另外的劃分方式,例如多個單元或組件可以結合或者可以集成到另一個系統,或一些特征可以忽略,或不執行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網絡單元上。可以根據實際的需要選擇其中的部分或者全部單元來實現本實施例方案的目的。
另外,在本發明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現,也可以采用硬件加軟件功能單元的形式實現。
上述以軟件功能單元的形式實現的集成的單元,可以存儲在一個計算機可讀取存儲介質中。上述軟件功能單元存儲在一個存儲介質中,包括若干指令用以使得一臺計算機設備(可以是個人計算機,服務器,或者網絡設備等)或處理器(processor)執行本發明各個實施例所述方法的部分步驟。而前述的存儲介質包括:U盤、移動硬盤、只讀存儲器(Read-Only Memory,ROM)、隨機存取存儲器(Random Access Memory,RAM)、磁碟或者光盤等各種可以存儲程序代碼的介質。
本領域技術人員可以清楚地了解到,為描述的方便和簡潔,僅以上述各功能模塊的劃分進行舉例說明,實際應用中,可以根據需要而將上述功能分配由不同的功能模塊完成,即將裝置的內部結構劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。上述描述的裝置的具體工作過程,可以參考前述方法實施例中的對應過程,在此不再贅述。
最后應說明的是:以上各實施例僅用以說明本發明的技術方案,而非對其限制;盡管參照前述各實施例對本發明進行了詳細的說明,本領域的普通技術人員應當理解:其依然可以對前述各實施例所記載的技術方案進行修改,或者對其中部分或者全部技術特征進行等同替換;而這些修改或者替換,并不使相應技術方案的本質脫離本發明各實施例技術方案的范圍。