本發(fā)明屬于互聯(lián)網技術領域,具體地說,涉及一種數據存儲方法、數據存儲系統(tǒng)和數據讀寫方法、用于數據讀寫的客戶端及用于數據讀寫的系統(tǒng)。
背景技術:
近年來互聯(lián)網公司需要備份、歸檔的數據呈爆發(fā)趨勢。出于成本的考慮,磁帶一直是備份和歸檔系統(tǒng)以及虛擬機主存儲系統(tǒng)的主要存儲介質。但是磁帶的存放環(huán)境要求高而壽命又較短,一般每隔4-5年就需要轉存到新的磁帶上。當磁帶的數量累計到幾萬甚至幾十萬后,轉存工作將成為一場夢魘。
隨著磁盤技術的發(fā)展,容量已經達到了6T甚至8T,其容量價格比逐漸與磁帶接近,而且磁盤相對磁帶的優(yōu)勢是支持隨機訪問,這使得重復數據刪除技術的應用成為可能,通過結合磁盤技術和重復數據刪除技術,可以大大節(jié)約備份歸檔的成本。
目前市場上已有的重復數據刪除商用產品,比如EMC DD990、HP StoreOnce B6200設備、SEPATON DeltaStor軟件等等,基本屬于單機模式,可伸縮性非常有限,最大可用容量1.6PB,最大的吞吐量31TB/h(8.8G/s),無論從容量還是性能上,根本無法滿足互聯(lián)網公司的存儲需求。
中國科學院計算技術研究所的《一種支持海量數據備份的可擴展分布式重復數據刪除系統(tǒng)》,針對單機模式的不足,在去重系統(tǒng)的擴展性和去重效率這兩個方面提出了分布式布隆過濾器(bloomfilter)用于分布式去重系統(tǒng)中去重節(jié)點的數據路由,并提出了基于取樣機制的指紋查詢用以提高指紋查詢速度,實現(xiàn)了分布式重復數據刪除系統(tǒng)3D-deduper。 以下簡稱為方案一。
EMC公司也在其單機(single-node)模式的基礎上研發(fā)了集群化去重存儲系統(tǒng)(cluster deduplication storage system)。其做法是增加幾臺備份服務器,負責對數據流進行切塊、計算數據塊的指紋,然后打包成一個超級塊(super chunk)并根據一定的策略路由到某個去重節(jié)點進行處理。以下簡稱方案二。
以上兩種方案從嚴格意義來講,不能稱為分布式系統(tǒng),而是集群系統(tǒng)。集群系統(tǒng)的基本思路是在多個可靠的單節(jié)點之間進行任務的負載均衡。而分布式系統(tǒng)的基本思路是在多個不可靠的單節(jié)點之間進行數據分布(當數據分布均衡,則自然實現(xiàn)了任務的負載均衡),并且利用多副本或者校驗碼等手段來保障可靠性。
在上述兩個方案中,集群系統(tǒng)的指紋庫是分散管理的,雖然采用了一定的措施盡量將之前出現(xiàn)過的數據塊及其指紋路由到之前負責處理的去重節(jié)點上,但是難以避免被路由到一個從未處理該數據塊的去重節(jié)點上,從而被誤判為新的數據塊并被重復保存。方案一更是對指紋采用了基于采樣的稀疏索引,進一步加重了數據塊被誤判的概率。哪怕只有2%的誤判,對于100PB甚至更大數量級的系統(tǒng)來說,也是不可接受的。
技術實現(xiàn)要素:
有鑒于此,本申請?zhí)峁┮环N數據存儲方法、數據存儲系統(tǒng)和數據讀寫方法、用于數據讀寫的客戶端及用于數據讀寫的系統(tǒng),解決了在大數量級的去重系統(tǒng)中由于指紋信息的分散管理而造成的誤判概率較大的技術問題。
為了解決上述技術問題,本申請公開了一種數據存儲方法,應用于包括中心節(jié)點和去重節(jié)點的數據存儲系統(tǒng);所述數據存儲方法,包括:所述中心節(jié)點根據預設策略將每個桶(Bucket)分配到對應的去重節(jié)點;所述中心節(jié)點根據Bucket與去重節(jié)點的對應關系創(chuàng)建路由表,并同步所述路由表到每個去重節(jié)點;所述去重節(jié)點根據所述路由表,存儲每個所述分配到的Bucket所對應的指紋信息和所述指紋信息代表的數據塊。
所述去重節(jié)點根據所述路由表,存儲每個所述分配到的Bucket所對應的指紋信息和所述指紋信息代表的數據塊包括:所述去重節(jié)點為每個所述分配到的Bucket分別創(chuàng)建對應的容器(Container)文件;所述去重節(jié)點在每個所述分配到的Bucket中保存對應的指紋信息,在與每個所述分配到的Bucket對應的Container文件中保存所述指紋信息代表的數據塊。
所述去重節(jié)點判斷所述Container文件的大小是否大于預設閾值;當所述Container文件的大小大于預設閾值時,所述去重節(jié)點將所述Container文件歸檔至后臺服務器。
所述中心節(jié)點根據預設策略將每個Bucket分配給對應的去重節(jié)點包括:所述中心節(jié)點將每個Bucket分配到多個對應的去重節(jié)點,在所述多個對應的去重節(jié)點中確定一個主節(jié)點和至少一個備用節(jié)點。
所述中心節(jié)點判斷每個去重節(jié)點是否可用,或者是否增加了新的去重節(jié)點;當判斷出某個去重節(jié)點不可用,或者增加了新的去重節(jié)點時,所述中心節(jié)點重新分配所述每個Bucket;所述中心節(jié)點更新所述路由表并同步到每個去重節(jié)點;所述去重節(jié)點根據所述更新后的路由表進行數據遷移。
所述去重節(jié)點根據所述更新后的路由表進行數據遷移包括:所述主節(jié)點根據所述更新后的路由表發(fā)起所述數據遷移。
所述當判斷出某個去重節(jié)點不可用時,所述中心節(jié)點重新分配所述每個Bucket包括:當判斷出所述主節(jié)點不可用時,所述中心節(jié)點從所述至少一個備用節(jié)點中重新確定出一個主節(jié)點;所述去重節(jié)點根據所述更新后的路由表進行數據遷移包括:所述重新確定的主節(jié)點根據所述更新后的路由表發(fā)起所述數據遷移。
每個所述去重節(jié)點包括一個指紋信息庫,所述指紋信息庫是存儲于固態(tài)硬盤上的布谷鳥哈希映射表,包括所述去重節(jié)點的每個Bucket所對應的指紋信息和所述指紋信息代表的數據塊的存儲信息。
所述固態(tài)硬盤上同時運行M個布谷鳥哈希映射表,并同時使用N個布谷鳥哈希函數;其中,M×N=128。
所述固態(tài)硬盤上同時運行32個布谷鳥哈希映射表,并同時使用4路布 谷鳥哈希函數。
為了解決上述技術問題,本申請還公開了一種數據讀寫方法,包括:將數據切分為多個數據塊并分別計算每個數據塊的指紋信息;確定所述每個數據塊的指紋信息所對應的Bucket;根據從中心節(jié)點獲取的路由表,確定與所述Bucket對應的去重節(jié)點;發(fā)送指紋查詢請求至與所述Bucket對應的去重節(jié)點,所述指紋查詢請求包括數據塊的指紋信息;接收到與所述Bucket對應的去重節(jié)點返回的未查詢到的指紋信息;上傳所述未查詢到的指紋信息及其代表的數據塊至與所述Bucket對應的去重節(jié)點。
所述確定所述每個數據塊的指紋信息所對應的Bucket包括:將所述指紋信息與所述Bucket的總數量進行取模運算,根據所述取模運算的結果確定所述指紋信息所對應的Bucket。
所述方法還包括:當所述未查詢到的指紋信息及其代表的數據塊全部上傳完畢時,上傳所述數據的映射文件至去重節(jié)點,所述映射文件包括所述數據的每個數據塊的指紋信息,所述每個數據塊的指紋信息按照數據塊的切分順序排列。
所述上傳所述數據的映射文件至去重節(jié)點,包括:將所述映射文件切分為多個數據塊并分別計算映射文件的數據塊的哈希值;確定所述映射文件的數據塊的哈希值所對應的Bucket;根據所述路由表確定與所述映射文件的數據塊的哈希值對應的Bucket所對應的去重節(jié)點;上傳所述映射文件的數據塊和相應的哈希值至與所述映射文件的數據塊的哈希值對應的Bucket所對應的去重節(jié)點。
所述將所述映射文件切分為多個數據塊包括:將所述映射文件的頭信息切分為所述多個數據塊中的第一個數據塊;所述映射文件的頭信息包括所述映射文件的總大小、所述多個數據塊的總數量等信息。
所述方法還包括:從去重節(jié)點獲取所述數據的映射文件;根據所述映射文件中所述數據的每個數據塊的指紋信息從去重節(jié)點獲取所述數據的每個數據塊;按照所述每個數據塊的指紋信息在所述映射文件中的順序拼接出所述數據。
所述從去重節(jié)點獲取所述數據的映射文件包括:根據所述映射文件的名 稱和數據塊序號從去重節(jié)點獲取所述映射文件的每個數據塊;將所述映射文件的每個數據塊拼接為所述數據的映射文件。
所述根據從中心節(jié)點獲取的路由表,確定與所述Bucket對應的去重節(jié)點包括:當首次存儲數據時,從所述中心節(jié)點獲取路由表;根據從中心節(jié)點獲取的路由表,確定與所述Bucket對應的去重節(jié)點。
所述根據從中心節(jié)點獲取的路由表,確定與所述Bucket對應的去重節(jié)點還包括:發(fā)送請求包至與所述Bucket對應的去重節(jié)點;接收與所述Bucket對應的去重節(jié)點返回的響應包,所述響應包包括路由表的版本信息;判斷所述響應包中的路由表的版本信息與所述從中心節(jié)點獲取的路由表的版本信息是否相同;當所述響應包中的路由表的版本信息與所述與從中心節(jié)點獲取的路由表的版本信息相同時,根據所述從中心節(jié)點獲取的路由表確定與所述Bucket對應的去重節(jié)點;當所述響應包中的路由表的版本信息與從中心節(jié)點獲取的路由表的版本信息不相同時,從所述中心節(jié)點獲取更新后的路由表;根據所述更新后的路由表重新確定與所述Bucket對應的去重節(jié)點。
為了解決上述技術問題,本申請還公開了一種數據讀寫方法,包括:
中心節(jié)點發(fā)送路由表至客戶端,所述路由表包括Bucket與去重節(jié)點之間的對應關系;去重節(jié)點接收到所述客戶端的指紋查詢請求,所述指紋查詢請求包括與所述去重節(jié)點分配到的Bucket對應的指紋信息;所述去重節(jié)點對所述指紋信息進行查詢,將未查詢到的指紋信息返回至所述客戶端;所述去重節(jié)點接收到所述客戶端上傳的所述未查詢到的指紋信息及其所代表的數據塊。
所述方法還包括:所述去重節(jié)點在所述分配到的Bucket中保存所述未查詢到的指紋信息,在與所述分配到的Bucket對應的Container文件中保存所述數據塊,所述去重節(jié)點向所述客戶端返回所述數據塊保存成功的消息。
所述去重節(jié)點向所述客戶端返回所述數據塊保存成功的消息之前,所述方法還包括:所述去重節(jié)點將所述未查詢到的指紋信息及其代表的數據塊備份到備用節(jié)點。
所述方法還包括:所述去重節(jié)點保存所述客戶端上傳的映射文件的數據塊和相應的哈希值。
所述保存所述客戶端上傳的映射文件的數據塊和相應的哈希值包括:在所述對應的Bucket所對應的Container文件中,保存所述映射文件的數據塊;在所述對應的Bucket中,保存所述映射文件的數據塊的哈希值以及第一存儲信息。
所述第一存儲信息包括:保存所述映射文件的數據塊的Container文件的名稱,所述映射文件的數據塊在所述Container文件中的偏移量和所述映射文件的數據塊的大小。
所述方法還包括:所述去重節(jié)點接收到所述客戶端獲取所述映射文件的數據塊的請求;所述去重節(jié)點發(fā)送所述映射文件的數據塊至所述客戶端;所述去重節(jié)點接收到所述客戶端獲取所述映射文件中的每個指紋信息所代表的數據塊的請求;所述去重節(jié)點發(fā)送所述每個指紋信息所代表的數據塊至所述客戶端。
所述去重節(jié)點發(fā)送所述每個指紋信息所代表的數據塊至所述客戶端包括:所述去重節(jié)點根據所述指紋信息確定所述數據塊的第二存儲信息,所述第二存儲信息包括保存所述數據塊的Container文件的名稱,所述數據塊在所述Container文件中的偏移量和所述數據塊的大小;所述去重節(jié)點根據所述Container文件的名稱判斷所述Container文件是否已歸檔至后臺服務器;當所述Container文件已歸檔至后臺服務器時,所述去重節(jié)點根據所述數據塊在所述Container文件中的偏移量和所述數據塊的大小從所述后臺服務器獲取所述數據塊并發(fā)送至所述客戶端;當所述Container文件仍保存在本地時,所述去重節(jié)點根據所述數據塊在所述Container文件中的偏移量和所述數據塊的大小從本地獲取所述數據塊并發(fā)送至所述客戶端。
所述中心節(jié)點發(fā)送路由表至客戶端包括:當所述客戶端首次存儲數據時,所述中心節(jié)點接收到所述客戶端的路由表請求;所述中心節(jié)點發(fā)送路由表至所述客戶端。
所述中心節(jié)點發(fā)送路由表至客戶端還包括:所述去重節(jié)點接收到所述客戶端的請求包:所述去重節(jié)點發(fā)送響應包至所述客戶端,所述響應包包括所述去重節(jié)點保存的路由表的版本信息;當所述客戶端保存的路由表的版本信息與所述所述去重節(jié)點保存的路由表的版本信息不一致時,所述中心節(jié)點接 收到所述客戶端的路由表請求;所述中心節(jié)點發(fā)送更新后的路由表至所述客戶端。
所述去重節(jié)點對所述指紋信息進行查詢,將未查詢到的指紋信息返回至所述客戶端包括:所述去重節(jié)點通過布隆過濾器判斷所述指紋信息是否存在;當通過布隆過濾器判斷出所述指紋信息不存在時,確定所述指紋信息為未查詢到的指紋信息;當通過布隆過濾器判斷出所述指紋信息存在時,在指紋信息庫中查詢所述指紋信息是否存在;當在指紋信息庫中查詢到所述指紋信息時,確定所述指紋信息已存在;當在指紋信息庫中未查詢到所述指紋信息時,確定所述指紋信息為未查詢到的指紋信息。
為了解決上述技術問題,本申請還公開了一種數據存儲系統(tǒng),包括:中心節(jié)點和一個或多個去重節(jié)點,其中,所述中心節(jié)點,用于根據預設策略將每個桶(Bucket)分配到對應的去重節(jié)點,并根據Bucket與去重節(jié)點的對應關系創(chuàng)建路由表,并同步所述路由表到每個去重節(jié)點;所述去重節(jié)點,用于根據所述路由表,存儲每個所述分配到的Bucket所對應的指紋信息和所述指紋信息代表的數據塊。
為了解決上述技術問題,本申請還公開了一種用于數據讀寫的客戶端,包括:切分計算模塊,用于將數據切分為多個數據塊并分別計算每個數據塊的指紋信息;桶確定模塊,用于確定所述每個數據塊的指紋信息所對應的Bucket;節(jié)點確定模塊,用于根據從中心節(jié)點獲取的路由表,確定與所述Bucket對應的去重節(jié)點;請求發(fā)送模塊,用于發(fā)送指紋查詢請求至與所述Bucket對應的去重節(jié)點,所述指紋查詢請求包括數據塊的指紋信息;信息接收模塊,用于接收到與所述Bucket對應的去重節(jié)點返回的未查詢到的指紋信息;數據上傳模塊,用于上傳所述未查詢到的指紋信息及其代表的數據塊至與所述Bucket對應的去重節(jié)點。
為了解決上述技術問題,本申請還公開了一種用于數據讀寫的系統(tǒng),包括:中心節(jié)點和去重節(jié)點,其中,所述中心節(jié)點,用于發(fā)送路由表至客戶端,所述路由表包括Bucket與去重節(jié)點之間的對應關系;所述去重節(jié)點,用于接收到所述客戶端的指紋查詢請求,所述指紋查詢請求包括與所述去重節(jié)點分配到的Bucket對應的指紋信息;對所述指紋信息進行查詢,將未查詢到的指 紋信息返回至所述客戶端;接收到所述客戶端上傳的所述未查詢到的指紋信息及其所代表的數據塊。
與現(xiàn)有技術相比,本申請可以獲得包括以下技術效果:實現(xiàn)了對100PB以上級別的原始數據以及100TB以上級別的指紋信息的全局去重存儲管理,具有非常高的可擴展性,系統(tǒng)中加入新的去重節(jié)點后中心節(jié)點能夠根據預設策略重新進行數據分布,去重節(jié)點自動完成數據遷移,使系統(tǒng)的性能和容量都能夠便捷的進行擴展。
當然,實施本申請的任一產品必不一定需要同時達到以上所述的所有技術效果。
附圖說明
此處所說明的附圖用來提供對本申請的進一步理解,構成本申請的一部分,本申請的示意性實施例及其說明用于解釋本申請,并不構成對本申請的不當限定。在附圖中:
圖1是本申請實施例的一種數據存儲系統(tǒng)(用于數據讀寫的系統(tǒng))的結構示意圖;
圖2是本申請實施例的路由表示意圖;
圖3是本申請實施例的一種數據讀寫方法的流程示意圖;
圖4是本申請實施例的一種數據讀寫方法的流程示意圖;
圖5是本申請實施例的一種用于數據讀寫的客戶端的結構示意圖。
具體實施方式
以下將配合附圖及實施例來詳細說明本發(fā)明的實施方式,藉此對本發(fā)明如何應用技術手段來解決技術問題并達成技術功效的實現(xiàn)過程能充分理解并據以實施。
圖1是本申請實施例提供的數據存儲系統(tǒng)(以下簡稱“系統(tǒng)”),包括中心節(jié)點10和去重節(jié)點11,中心節(jié)點10與去重節(jié)點11耦接。在系統(tǒng)中, 中心節(jié)點10負責對多個去重節(jié)點11的分布式管理和系統(tǒng)內的數據分布以及副本管理。去重節(jié)點11負責對數據塊、以及數據塊的指紋信息和存儲信息進行管理和保存,并在中心節(jié)點10的分布式管理下完成數據的復制和遷移。去重節(jié)點11具備抽象的存儲引擎層,可以很方便的添加新存儲引擎。
系統(tǒng)對數據塊的管理以桶(Bucket)為單位,Bucket是系統(tǒng)中的一個邏輯概念,為每個Bucket分配一個Bucket編號,該Bucket編號用于與各個數據塊的指紋信息通過預設的哈希算法建立對應關系,從而將數據塊按照Bucket編號分別存儲并建立數據塊與存儲文件之間的對應關系。系統(tǒng)的中心節(jié)點通過Bucket對系統(tǒng)保存的數據塊和數據塊的指紋信息進行全局管理。
中心節(jié)點根據預設策略將每個Bucket分配到對應的去重節(jié)點,該預設策略可以是負載均衡策略。例如,中心節(jié)點獲取各個去重節(jié)點的負載數據,通過負載數據的實時變化來確定每個去重節(jié)點的當前負載狀況,將Bucket優(yōu)先分配到當前負載較低的去重節(jié)點,通過數據分布均衡實現(xiàn)各個去重節(jié)點的負載均衡。該預設策略可以是位置安全策略,例如,中心節(jié)點根據數據的涉密性或者客戶端的權限將不同的Bucket分配到不同的去重節(jié)點,使不同涉密級別或者不同權限的客戶端數據保存在不同的去重節(jié)點中。
中心節(jié)點將各個Bucket分配到對應的去重節(jié)點,通過Bucket編號以及去重節(jié)點的標識來建立Bucket與去重節(jié)點的對應關系,并根據該對應關系創(chuàng)建路由表。該路由表可看作一個映射表,記錄了Bucket與去重節(jié)點之間的映射關系,圖2是本申請實施例中路由表的示例圖,其中,橫向表頭的數字代表Bucket編號,縱向表頭的數字代表Bucket的拷貝標識,表格中的字母分別代表不同的去重節(jié)點。如圖2所示,其中編號為0的Bucket,0號拷貝被分配到去重節(jié)點D,1號拷貝被分配到去重節(jié)點A;編號為1的Bucket,0號拷貝被分配到去重節(jié)點A,1號拷貝被分配到去重節(jié)點B。圖2用于對本申請實施例中的路由表進行示例性說明,并不構成對本申請保護范圍的限制,系統(tǒng)中可設置任意多個去重節(jié)點,每個去重節(jié)點可以被分配到多個Bucket,每個Bucket也可以有一個或多個備份并備份在不同的去重節(jié)點。
中心節(jié)點創(chuàng)建路由表之后,將該路由表同步到每個去重節(jié)點。系統(tǒng)中的各個去重節(jié)點根據路由表確定被分配到本地的Bucket,存儲與被分配到本地 的Bucket對應的指紋信息和指紋信息代表的數據塊。去重節(jié)點保存每個Bucket對應的指紋信息和指紋信息代表的數據塊時,為每個分配到的Bucket創(chuàng)建對應的容器(Container)文件,在每個Bucket中保存對應的指紋信息,在與Bucket對應的Container文件中保存指紋信息代表的數據塊。而指紋信息與Bucket之間的對應關系,是通過指紋信息對系統(tǒng)內部的Bucket總數進行取模運算,根據運算結果確定指紋信息對應的Bucket編號,這一運算過程通常由向系統(tǒng)存儲數據的客戶端來完成。當與Bucket對應的指紋信息越來越多時,相應的Container文件中保存的數據塊隨之增多,Container文件占用的存儲空間也隨之增大,為了確保每個去重節(jié)點能夠存儲多個Bucket的拷貝并且控制去重節(jié)點的負載,當一個Bucket對應的Container文件的大小超過預設閾值時,去重節(jié)點將該Container文件歸檔到后臺服務器12,如圖1中所示,每個去重節(jié)點都與后臺服務器12耦接,去重節(jié)點再接收到相應的數據塊時,存儲到位于后臺服務器12的Container文件中。
中心節(jié)點根據預設策略將每個Bucket分配給對應的去重節(jié)點時,可以將每個Bucket分配到多個對應的去重節(jié)點,使每個Bucket在系統(tǒng)中存在多個拷貝,并且為每個拷貝分配不同的拷貝標識。例如圖2所示的路由表中,中心節(jié)點為每個Bucket分配到兩個去重節(jié)點,每個Bucket在不同的去重節(jié)點的拷貝分別具有的拷貝標識0和1。
中心節(jié)點將每個Bucket分配到多個去重節(jié)點時,在該多個去重節(jié)點中確定一個主節(jié)點和至少一個備用節(jié)點。中心節(jié)點可根據拷貝標識確定主節(jié)點和備用節(jié)點,在每個Bucket的多個拷貝標識中確定一個主拷貝標識,其他拷貝標識均為備用拷貝標識,例如,將拷貝標識為0的拷貝做為每個Bucket的主拷貝,其他拷貝標識的拷貝均為備用拷貝。而在所有去重節(jié)點中,將某個Bucket的拷貝標識為0的拷貝所在的去重節(jié)點確定為該Bucket的主節(jié)點,該Bucket的其他拷貝所在的去重節(jié)點均為該Bucket的備用節(jié)點。以防止某個去重節(jié)點不可用時,該去重節(jié)點上的Bucket的數據存儲和讀寫都將無法進行。Bucket的每一個拷貝包括該Bucket對應的指紋信息和保存該指紋信息代表的數據塊的Container文件。
中心節(jié)點會判斷每個去重節(jié)點是否可用,或者判斷系統(tǒng)內部是否增加了 新的去重節(jié)點。中心節(jié)點通過與去重節(jié)點之間的心跳信息來判斷每個去重節(jié)點是否可用或者是否增加了新的去重節(jié)點。中心節(jié)點判斷出某個去重節(jié)點不可用或者系統(tǒng)內增加了新的去重節(jié)點時,中心節(jié)點重新分配每個Bucket,系統(tǒng)內部Bucket與去重節(jié)點的映射關系將發(fā)生變化。當某個去重節(jié)點不可用時,中心節(jié)點根據預設策略將與該去重節(jié)點對應的Bucket重新分配到其他去重節(jié)點中;當系統(tǒng)內增加了新的去重節(jié)點時,中心節(jié)點根據預設策略將系統(tǒng)內的Bucket進行重新分配。上述兩種情形都會使系統(tǒng)內部Bucket與去重節(jié)點的映射關系發(fā)生變化,中心節(jié)點根據變化后的Bucket與去重節(jié)點的映射關系更新路由表,并將更新后的路由表同步到每個去重節(jié)點。由于Bucket分配到的去重節(jié)點發(fā)生了變化,系統(tǒng)內的去重節(jié)點將根據更新后的路由表進行數據遷移。
由被分配到的去重節(jié)點發(fā)生變化的Bucket的主節(jié)點發(fā)起該數據遷移。例如,在路由表中,編號為1的Bucket的0號拷貝(主拷貝)由去重節(jié)點A變?yōu)槿ブ毓?jié)點B,則由該去重節(jié)點A發(fā)起編號為1的Bucket的0號拷貝向去重節(jié)點B的數據遷移,去重節(jié)點B再根據路由表判斷該編號為1的Bucket的其他備用節(jié)點是否發(fā)生了變化,如果發(fā)生了變化,例如從去重節(jié)點D變?yōu)槿ブ毓?jié)點E,則再將編號為1的Bucket中的數據備份到去重節(jié)點E,去重節(jié)點E的編號為1的Bucket的拷貝標識為備用拷貝標識。數據遷移完成后每個去重節(jié)點會根據更新后的路由表刪除與本地不存在映射關系的Bucket的數據。當做為某個Bucket的主節(jié)點的去重節(jié)點不可用時,中心節(jié)點在該Bucket的備用節(jié)點中重新確定一個主節(jié)點,由重新確定的主節(jié)點根據更新后的路由表發(fā)起有關該Bucket的數據遷移。例如,編號為1的Bucket的主節(jié)點——去重節(jié)點A不可用時,中心節(jié)點從編號為1的Bucket的備用節(jié)點——去重節(jié)點B和去重節(jié)點C中,確定去重節(jié)點B為編號為1的Bucket的主節(jié)點,則去重節(jié)點B中編號為1的Bucket的拷貝的拷貝標識變?yōu)橹骺截悩俗R(例如0),更新后的路由表中編號為1的Bucket的備用節(jié)點為去重節(jié)點C和去重節(jié)點D,則由去重節(jié)點B將編號為1的Bucket的數據備份到去重節(jié)點D。
每個去重節(jié)點內部構建有一個指紋信息庫。該指紋信息庫包括去重節(jié)點的每個Bucket所對應的指紋信息和指紋信息代表的數據塊的存儲信息。該指 紋信息庫可以采用Key-Value Store的形式,以指紋信息為Key,該指紋信息代表的數據塊的存儲信息為Value。在系統(tǒng)的數據讀寫過程中,涉及到大量的指紋信息查詢和比對處理,在每個去重節(jié)點中采用布隆過濾器來承擔部分查詢請求,由于布隆過濾器的存在漏查的可能,還有大量請求進一步需要由指紋信息庫來完成。因此對指紋信息庫(Key-Value Store)的讀取性能要求非常高。通常對于小型的Key-Value Store來說,可以把Key-Value對(Key-Value Pair)以預設形式,比如log-structure,存放在普通硬盤上,然后在內存中建立索引,以快速地訪問硬盤上的Key-Value Pair。但由于本系統(tǒng)應用于100PB級別以上的數據存儲,指紋信息和存儲信息量非常大(100PB的原始數據,對應大約50TB的指紋信息和存儲信息),因此此時無法在設備內存中建立索引。因此本申請的發(fā)明人發(fā)現(xiàn),完全可以在固態(tài)硬盤(Solid State Drives,SSD)上實現(xiàn)一個哈希表來存放指紋信息庫的全部Key-Value Pair。這個存儲于固態(tài)硬盤上的哈希表是布谷鳥哈希映射表,由于去重節(jié)點的首先通過布隆過濾器進行指紋信息的查詢比對,存在由于哈希沖突而漏查的情形,布谷鳥哈希映射表是一種能夠處理哈希沖突的方式,它的基本思路是使用兩個不同的哈希函數來計算Key存放的位置,(1)如果兩個位置都空閑,則選擇一個位置插入;(2)如果只有一個位置空閑,則插入到這個空閑位置;(3)如果兩個位置都不空閑,隨機選擇兩者之一的位置并將該位置上的Key踢出,然后計算被踢出的Key的另一個哈希值對應的位置進行插入,如果這個位置為空則插入,如果不為空則再踢出這個位置上的Key,如此繼續(xù)一直找到空閑位置。顯然這種方式有可能產生無限循環(huán),因此通常設定一個最大的查找次數,當達到這個最大值時,認為該哈希表已滿。發(fā)明人選擇布谷鳥哈希,是因為系統(tǒng)在查詢Key時的輸入輸出次數通常設置為常量。
普通布谷鳥哈希映射表只有49%的利用率,所以通常采用布谷鳥哈希的兩種主要的變形:1)增加hash函數的個數;2)增加每個位置可以存放Key的個數。這兩種變形都可以用來提高布谷鳥哈希映射表的利用率。本申請的發(fā)明人選擇了murmur2哈希函數作為基本的哈希函數,并通過設置不同的種子,相同的Key值可以產生不同的哈希值。
由于基于NVMe(NonVolatile Memory express,高速非易失存儲器)協(xié)議的固態(tài)硬盤(SSD)底層都是以4K的頁(Page)為基本單位,因此指紋信息庫進行操作的時都是以4K為大小進行讀寫操作。指紋信息庫中的Key-Value Pair大小是256Byte,則一個4K的Page可以存儲16個指紋信息。那么該布谷鳥哈希映射表,每個位置存放16個Key-Value Pair,每個Key-Value Pair在Page內是按插入順序寫入,并不按Key來排序,這種無序的方式可以避免在固態(tài)硬盤上排序帶來的開銷。根據本申請的發(fā)明人的實際測試,采用128并發(fā)(隊列深度×job數=128)的異步模式,可以充分挖掘NVMe的IOPS(Input/Output Operations Per Second,每秒進行讀寫(I/O)操作的次數)的能力(450K),為了產生這么大的并發(fā),本申請的發(fā)明人在兩個方面進行了優(yōu)化:1、在一塊NVMe硬盤上運行多個布谷鳥哈希映射表形式的Key-Value Store;2、在一塊NVMe硬盤上采用多個布谷鳥哈希函數,并且采用異步讀取方式;并且需要同時滿足:每塊固態(tài)硬盤上運行的布谷鳥哈希映射表的個數乘以布谷鳥哈希函數的個數等于128。本申請的發(fā)明人發(fā)現(xiàn),當布谷鳥哈希函數變多時,單個布谷鳥哈希映射表的QPS(每秒查詢率,Query Per Second)下降十分明顯,從4路布谷鳥哈希函數變?yōu)?路布谷鳥哈希函數時,QPS下降了一半,而當布谷鳥哈希函數太少時,布谷鳥哈希映射表空間利用率則下降明顯。綜合權衡考慮性能和空間利用率,本申請的發(fā)明人選擇4路布谷鳥哈希函數,其空間利用率能夠達到98.66%。由此,需要在一塊NVMe硬盤上運行32個布谷鳥哈希映射表。而分成多個哈希映射表的另外一個好處是能夠降低該指紋信息庫的鎖定粒度。
下面對客戶端與上述數據存儲系統(tǒng)進行數據讀寫操作的過程做進一步說明??蛻舳讼蛳到y(tǒng)寫入數據時,如圖3所示,該過程包括以下步驟。
在步驟S201中,客戶端將數據切分為多個數據塊并分別計算每個數據塊的指紋信息。
采用沖突率較低的哈希算法計算出每個數據塊的哈希值做為指紋信息,例如SHA-1,MD5等哈希算法。
在步驟S202中,客戶端確定每個數據塊的指紋信息所對應的Bucket。
客戶端將數據塊的指紋信息與系統(tǒng)內的Bucket總數進行取模運算,根據 取模運算的結果與Bucket編號進行匹配,從而確定該指紋信息對應的Bucket。例如,數據塊的哈希值為a,系統(tǒng)內的Bucket總數為p,進行取模運算a%P,取模運算結果為2,則該數據塊的指紋信息對應編號為2的Bucket。
在步驟S203中,客戶端根據從中心節(jié)點獲取的路由表,確定與Bucket對應的去重節(jié)點。
客戶端根據保存的路由表確定指紋信息對應的Bucket所在的去重節(jié)點,當客戶端首次向系統(tǒng)寫入數據時,會先向中心節(jié)點請求路由表。例如,數據塊的指紋信息對應編號為2的Bucket,在路由表中,編號為2的Bucket被分配到去重節(jié)點A和去重節(jié)點B,其中去重節(jié)點A為編號為2的Bucket的主節(jié)點,去重節(jié)點B為編號為2的Bucket的備用節(jié)點,因此需要將該數據塊的指紋信息發(fā)送到去重節(jié)點A進行指紋查詢。
在步驟S204中,客戶端發(fā)送指紋查詢請求至與Bucket對應的去重節(jié)點,該指紋查詢請求包括數據塊的指紋信息。
客戶端包括讀取線程、發(fā)送線程和邏輯處理線程。多個讀取線程分別負責該數據的不同部分進行切塊并計算數據塊的指紋信息,然后將指紋信息暫存到查詢請求隊列中,每個讀取線程包括多個查詢請求隊列,每個查詢請求隊列對應著一個Bucket編號??蛻舳藭粋€Bucket的指紋信息暫存到同一個查詢請求隊列中。當查詢請求隊列中的數據超過一定量或者是該查詢請求隊列的延遲到期后,讀取線程將查詢請求放置到發(fā)送線程的緩沖區(qū)。
發(fā)送線程根據每個查詢請求隊列對應的Bucket,發(fā)送請求包到該Bucket所在的去重節(jié)點(該Bucket的主節(jié)點)。在一個實施例中,該發(fā)送線程包括四個緩沖區(qū),其中兩個緩沖區(qū)存儲正在向系統(tǒng)傳輸的請求,分別對應指紋查詢請求和數據塊上傳請求,另外兩個緩沖區(qū)接收客戶端內部其他線程發(fā)送的新請求,分別對應指紋查詢請求和數據塊上傳請求。設置兩種不同的緩沖區(qū),將正在向系統(tǒng)傳輸的請求和其他線程發(fā)送的新請求分離,能夠避免其他線程在寫入新請求過程中出現(xiàn)長時間的阻塞。
當發(fā)送線程接收到去重節(jié)點發(fā)回的響應包時,會將響應包發(fā)送給邏輯處理線程進行相應的處理。邏輯處理線程根據相應的去重節(jié)點返回的指紋查詢 結果將未查詢到指紋信息和其代表的數據塊的上傳請求傳遞給發(fā)送線程,由發(fā)送線程將未查詢到的指紋信息和其代表的數據塊發(fā)送至對應的去重節(jié)點。這樣的線程并發(fā)模式可以保證請求的發(fā)送是連續(xù)的、平穩(wěn)的。
其中發(fā)送線程接收到的響應包中包括該去重節(jié)點當前存儲的路由表的版本信息,判斷該響應包中的路由表的版本信息與從中心節(jié)點獲取的路由表的版本信息是否相同,當響應包中的路由表的版本信息與從中心節(jié)點獲取的路由表的版本信息不相同時,代表該中心節(jié)點已經更新了路由表并同步到系統(tǒng)內的去重節(jié)點,此時客戶端通過發(fā)送線程向從中心節(jié)點獲取更新后的路由表,并根據該更新后的路由表重新確定Bucket對應的去重節(jié)點,從而重新確定未查詢到的指紋信息和其代表的數據塊所應上傳到的去重節(jié)點。當響應包中的路由表的版本信息與從中心節(jié)點獲取的路由表的版本信息相同時,仍根據從中心節(jié)點獲取的路由表確定與Bucket對應的去重節(jié)點,未查詢到的指紋信息和其代表的數據塊所應上傳的去重節(jié)點不變。
在步驟S205中,去重節(jié)點對指紋信息進行查詢,將未查詢到的指紋信息返回至客戶端。
去重節(jié)點內部包括一個布隆過濾器和一個指紋信息庫。該布隆過濾器建立了該去重節(jié)點當前存儲的所有指紋信息的哈希索引;該指紋信息庫中以Key-Value Pair的形式保存著所有指紋信息以及指紋信息代表的數據塊的存儲信息。去重節(jié)點將指紋查詢請求中的所有指紋信息依次訪問布隆過濾器和指紋信息庫。通過布隆過濾器計算每個指紋信息的哈希索引并判斷是否與布隆過濾器中的哈希索引相同。當與布隆過濾器中的哈希索引都不相同時,則確定該去重節(jié)點中沒有相同的指紋信息及其代表的數據塊,當與布隆過濾器中的某個哈希索引相同時,由于布隆過濾器存在哈希沖突的漏洞,能確定該指紋信息有可能已存在,需要進一步通過指紋信息庫查詢是否包含該指紋信息,當指紋信息庫中存在該指紋信息時,確定該指紋信息已存在,當指紋信息庫中不存在該指紋信息時,確定該指紋信息不存在。首先通過具有指紋信息哈希索引的布隆過濾器進行查詢能夠提高去重節(jié)點指紋查詢的效率,再通過指紋信息庫來彌補布隆過濾器由于哈希沖突而可能出現(xiàn)的漏查情況,提高了去重節(jié)點指紋查詢的準確度。去重節(jié)點將該指紋查詢請求中所有未查詢到 的指紋信息放入響應包并返回至客戶端。該響應包還包括該去重節(jié)點當前存儲的路由表的版本信息,以用于客戶端判斷是否需要更新路由表。
在步驟S206中,客戶端上傳未查詢到的指紋信息及其代表的數據塊至與Bucket對應的去重節(jié)點。
客戶端將響應包中的未查詢到的指紋信息及其代表的數據塊上傳至與未查詢到的指紋信息對應的Bucket所在的去重節(jié)點。如果路由表的版本信息沒有變化,則該與未查詢到的指紋信息對應的Bucket所在的去重節(jié)點就是步驟S205中進行指紋查詢的去重節(jié)點。指紋查詢請求中的其他指紋信息由于在去重節(jié)點中已經存在,則不需要再次上傳,避免系統(tǒng)重復存儲相同的數據塊。
在步驟S207中,去重節(jié)點在分配到的Bucket中保存所述未查詢到的指紋信息,在與分配到的Bucket對應的Container文件中保存所述數據塊。
去重節(jié)點接收到未查詢到的指紋信息及其代表的數據塊,在與指紋信息對應的Bucket中保存未查詢到的指紋信息,在與指紋信息對應的Bucket所對應的Container文件中保存該指紋信息代表的數據塊。Container文件的名稱是由Container文件所對應的Bucket的編號+系統(tǒng)內部通用唯一識別碼(UUID)+日期(Date)組成,例如2_abcd234_010515。為了保證數據塊寫入磁盤,通過設置O_SYNC標志位的方式將數據塊寫入相應的Container文件,使每次寫入完成后才返回,當pwrite返回后再將該數據塊的指紋信息寫入指紋信息庫,寫入指紋信息庫時,將該數據塊的指紋信息作為Key,將該數據塊的第二存儲信息做為Value,形成一個Key-Value Pair保存在指紋信息庫中。該第二存儲信息包括保存該數據塊的Container文件的名稱,該數據塊在該Container文件中的偏移量(Offset)和該數據塊的大小(Chunksize)。在布隆過濾器中更新該新保存的Key-Value Pair的哈希索引,以用于后續(xù)的數據去重查詢。
在步驟S208中,去重節(jié)點向客戶端返回數據塊保存成功的消息。
在未查詢到的指紋信息及其代表的數據塊保存完畢后,去重節(jié)點向客戶端返回數據塊保存成功的消息,或者在一個實施例中,當未查詢到的指紋信息對應的Bucket在系統(tǒng)中存在備用節(jié)點時,主節(jié)點將客戶端上傳的未查詢到 的指紋信息及其代表的數據塊保存完畢后,再備份到相應的Bucket的備用節(jié)點,當備份完畢后向客戶端返回數據塊保存成功的消息。
在步驟S209中,當未查詢到的指紋信息及其代表的數據塊全部上傳完畢時,客戶端上傳數據的映射文件至去重節(jié)點。
映射文件包括該數據的每個數據塊的指紋信息,并且每個數據塊的指紋信息按照客戶端將該數據切分為多個數據塊時的切分順序排列,以保證對該數據的正確映射。
客戶端在上傳映射文件時,也同樣將映射文件分塊上傳。客戶端將映射文件切分為多個數據塊并分別計算映射文件的數據塊的哈希值。例如,客戶端通過murmur2哈希函數分別計算映射文件的每個數據塊的哈希值??蛻舳舜_定映射文件的數據塊的哈希值所對應的Bucket,根據路由表確定與映射文件的數據塊的哈希值對應的Bucket所對應的去重節(jié)點,上傳映射文件的數據塊和相應的哈希值至對應的Bucket所對應的去重節(jié)點??蛻舳松蟼髟撚成湮募臄祿K時,也同樣根據各個映射文件的數據塊的哈希值進行指紋查詢,只上傳未查詢到的哈希值所對應的映射文件的數據塊,避免上傳重復的映射文件數據塊。客戶端將映射文件切分為多個數據塊時,將映射文件的頭信息切分為多個數據塊中的第一個數據塊,該映射文件的頭信息包括映射文件的總大小以及該多個數據塊的總數量等信息。
在步驟S210中,去重節(jié)點保存客戶端上傳的映射文件的數據塊和相應的哈希值。
在與映射文件的數據塊的哈希值對應的Bucket中,保存映射文件的數據塊的哈希值以及第一存儲信息,在該對應的Bucket所對應的Container文件中保存映射文件的數據塊。該第一存儲信息包括保存映射文件的數據塊的Container文件的名稱,映射文件的數據塊在Container文件中的偏移量和映射文件的數據塊的大小。再以映射文件的名稱+數據塊序號為Key,以映射文件的數據塊的第一存儲信息為Value,做為Key-Value Pair更新指紋信息庫。至此客戶端向系統(tǒng)寫入數據的過程全部結束。
如圖4所示,本申請實施例中客戶端從系統(tǒng)讀取數據的過程,該過程包括以下步驟。
在步驟S301中,客戶端根據數據的映射文件名稱和數據塊序號向去重節(jié)點請求映射文件。
客戶端首先向去重節(jié)點請求映射文件的第一個數據塊,映射文件的第一個數據塊包括該映射文件的頭信息。該映射文件的頭信息包括映射文件的大小以及該映射文件的數據塊的總數量。客戶端根據映射文件的頭信息向去重節(jié)點發(fā)出獲取映射文件的其他數據塊的請求。
在步驟S302中,去重節(jié)點發(fā)送映射文件的數據塊至客戶端。
去重節(jié)點根據客戶端發(fā)送的映射文件名稱和數據塊序號與指紋信息庫中的Key進行匹配,從而查詢到該映射文件的數據塊在指紋信息庫中的Key-Value Pair,確定與映射文件的數據塊的Key對應的第一存儲信息。根據第一存儲信息中的Container文件名稱確定該映射文件的數據塊存儲在哪個Container文件中,進一步根據該映射文件的數據塊在Container文件中的偏移量和該映射文件數據塊的大小從Container文件中獲取到該映射文件的數據塊。
在步驟S303中,客戶端根據映射文件的數據塊拼接出映射文件,并根據映射文件中每個數據塊的指紋信息向去重節(jié)點請求數據塊。
客戶端根據映射文件數據塊的塊序號拼接出完整的映射文件。映射文件包括全部數據塊的指紋信息并且按照數據塊的切分順序排列??蛻舳舜_定與指紋信息對應的Bucket,在通過路由表確定與指紋信息對應的Bucket所在的去重節(jié)點,向該去重節(jié)點發(fā)送獲取相應的數據塊的請求。
在步驟S304中,去重節(jié)點發(fā)送映射文件的指紋信息代表的數據塊至客戶端。
去重節(jié)點根據獲取數據塊的請求中的指紋信息來查詢指紋信息庫,查詢到與該指紋信息對應的第二存儲信息。根據第二存儲信息中的Container文件名稱確定該指紋信息代表的數據塊保存在哪個Container文件中,并根據該數據塊在Container文件中的偏移量和該數據塊的大小從Container文件獲取到該數據塊。在一個實施例中,根據第二存儲信息中的Container文件名稱確定該指紋信息代表的數據塊保存在哪個Container文件后,判斷該Container文件是否已經歸檔到后臺服務器,如果該Container文件已歸檔到 后臺服務器,去重節(jié)點從存儲于后臺服務器的該Container文件中獲取到數據塊并將數據塊發(fā)送至客戶端。
在步驟S305中,客戶端按照每個數據塊的指紋信息在映射文件中的順序拼接出所述數據。
如圖5所示,本申請實施例中用于數據讀寫的客戶端,包括:
切分計算模塊501,用于將數據切分為多個數據塊并分別計算每個數據塊的指紋信息;
桶確定模塊502,用于確定所述每個數據塊的指紋信息所對應的Bucket;
節(jié)點確定模塊503,用于根據從中心節(jié)點獲取的路由表,確定與所述Bucket對應的去重節(jié)點;
請求發(fā)送模塊504,用于發(fā)送指紋查詢請求至與所述Bucket對應的去重節(jié)點,所述指紋查詢請求包括數據塊的指紋信息;
信息接收模塊505,用于接收到與所述Bucket對應的去重節(jié)點返回的未查詢到的指紋信息;
數據上傳模塊506,用于上傳所述未查詢到的指紋信息及其代表的數據塊至與所述Bucket對應的去重節(jié)點;當所述未查詢到的指紋信息及其代表的數據塊全部上傳完畢時,還用于上傳所述數據的映射文件至去重節(jié)點,所述映射文件包括所述數據的每個數據塊的指紋信息,所述每個數據塊的指紋信息按照數據塊的切分順序排列。
另外,還公開了一種本申請實施例中用于數據讀寫的系統(tǒng),可以參考圖1所示,包括:中心節(jié)點10和一個或多個去重節(jié)點11,其中,
所述中心節(jié)點10,用于發(fā)送路由表至客戶端,所述路由表包括Bucket與去重節(jié)點之間的對應關系;
所述去重節(jié)點11,用于接收到所述客戶端的指紋查詢請求,所述指紋查詢請求包括與所述去重節(jié)點分配到的Bucket對應的指紋信息;對所述指紋信息進行查詢,將未查詢到的指紋信息返回至所述客戶端;接收到所述客戶端上傳的所述未查詢到的指紋信息及其所代表的數據塊。
需要說明的是,圖1所示出的用于數據讀寫的系統(tǒng)與圖3、4所示出的 實施例的特征相互對應,圖5所示出的用于數據讀寫的客戶端也與圖3、4所示出的實施例的特征相互對應,因此圖1、5的實施例中的不足之處可參見圖3、4所示出的實施例的描述,不再贅述。
本申請實施例提供的數據存儲方法、數據存儲系統(tǒng)和數據讀寫方法、用于數據讀寫的客戶端及用于數據讀寫的系統(tǒng),實現(xiàn)了對100PB以上級別的原始數據以及100TB以上級別的指紋信息的全局去重存儲管理,具有非常高的可擴展性,系統(tǒng)加入新的去重節(jié)點后,中心節(jié)點能夠根據預設策略重新進行數據分布,去重節(jié)點自動完成數據遷移,使系統(tǒng)的性能和容量都能夠便捷的進行擴展。在每個去重節(jié)點實現(xiàn)了一個基于固態(tài)硬盤的高性能指紋信息庫,在固態(tài)硬盤中建立大容量的布谷鳥哈希映射表,克服了當指紋信息的數據量很大時無法在內存中建立索引,進而無法進行去重查詢的技術困難,同時保證了指紋信息查詢的效率和并提高了指紋信息查詢的準確度。
在一個典型的配置中,計算設備包括一個或多個處理器(CPU)、輸入/輸出接口、網絡接口和內存。
內存可能包括計算機可讀介質中的非永久性存儲器,隨機存取存儲器(RAM)和/或非易失性內存等形式,如只讀存儲器(ROM)或閃存(flash RAM)。內存是計算機可讀介質的示例。
計算機可讀介質包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術來實現(xiàn)信息存儲。信息可以是計算機可讀指令、數據結構、程序的模塊或其他數據。計算機的存儲介質的例子包括,但不限于相變內存(PRAM)、靜態(tài)隨機存取存儲器(SRAM)、動態(tài)隨機存取存儲器(DRAM)、其他類型的隨機存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)、快閃記憶體或其他內存技術、只讀光盤只讀存儲器(CD-ROM)、數字多功能光盤(DVD)或其他光學存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設備或任何其他非傳輸介質,可用于存儲可以被計算設備訪問的信息。按照本文中的界定,計算機可讀介質不包括非暫存電腦可讀媒體(transitory media),如調制的數據信號和載波。
如在說明書及權利要求當中使用了某些詞匯來指稱特定組件。本領域技術人員應可理解,硬件制造商可能會用不同名詞來稱呼同一個組件。本說明 書及權利要求并不以名稱的差異來作為區(qū)分組件的方式,而是以組件在功能上的差異來作為區(qū)分的準則。如在通篇說明書及權利要求當中所提及的“包含”為一開放式用語,故應解釋成“包含但不限定于”?!按笾隆笔侵冈诳山邮盏恼`差范圍內,本領域技術人員能夠在一定誤差范圍內解決所述技術問題,基本達到所述技術效果。此外,“耦接”一詞在此包含任何直接及間接的電性耦接手段。因此,若文中描述一第一裝置耦接于一第二裝置,則代表所述第一裝置可直接電性耦接于所述第二裝置,或通過其他裝置或耦接手段間接地電性耦接至所述第二裝置。說明書后續(xù)描述為實施本發(fā)明的較佳實施方式,然所述描述乃以說明本發(fā)明的一般原則為目的,并非用以限定本發(fā)明的范圍。本發(fā)明的保護范圍當視所附權利要求所界定者為準。
還需要說明的是,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的商品或者系統(tǒng)不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種商品或者系統(tǒng)所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的商品或者系統(tǒng)中還存在另外的相同要素。
上述說明示出并描述了本發(fā)明的若干優(yōu)選實施例,但如前所述,應當理解本發(fā)明并非局限于本文所披露的形式,不應看作是對其他實施例的排除,而可用于各種其他組合、修改和環(huán)境,并能夠在本文所述發(fā)明構想范圍內,通過上述教導或相關領域的技術或知識進行改動。而本領域人員所進行的改動和變化不脫離本發(fā)明的精神和范圍,則都應在本發(fā)明所附權利要求的保護范圍內。