深化設計文件存儲架構
『壹』 設計一個存儲器
1.雲計算存儲開發
2003年,谷歌發表論文GFS,披露解決了索引地球的海量互聯網數據的存儲問題。2006年,亞馬遜推出了劃時代的AWS雲計算服務EC2和S3,開啟了改變世界IT格局的雲計算時代。谷歌,微軟,阿里雲等。都跟著。
上面提到的A Bite os S3 Arch如何構建一個分布式存儲系統來支持大規模S3對象存儲。雲計算世睜還有另外兩個重要的基礎存儲基礎架構組件EBS(彈性塊存儲)和EFS(彈性文件服務),分別對應傳統IT基礎架構中的本地磁碟和共享文件存儲服務。
雲計算很重要的一點就是超賣和靈活性,所以支持EBS和EFS方案的底層基礎存儲層的支持不太可能是本地本地化方案,必須是分布式的存儲資源管理和分配系統。
然而,與S3服務相比,EBS底層的分布式存儲系統提供的IO模型實際上有很大不同。S3的基本外部介面功能是PUT/GET/DELETE,它對底層分布式文件系統的要求是Append。EBS和EFS需要支持對用戶隨機地址空間的重寫,那麼如何設計底層存儲系統來支持這兩類服務呢?
對於這一塊的業務架構,目前各大互聯網公司基本都沒有開源,基本架構也沒有或者很少正面出來。這一方面可能被視為商業秘密,另一方面可能從安全、輿論等方面考慮。
當然,開源系統的論文和一些互聯網公司的存儲系統可以參考,比如ceph、Lustre、HDFS、GlusterFS、FastDFS、Window Azure Storage、GFS等等。這些都稱自己為分布式文件系統,但是在具體的場景和文件的定義上有很多不同。以下幾個方面差別很大。
EBS底層的亮御分布式存儲系統至少需要確保以下幾點
EBS底層分布式存儲系統需要提供上述重要特性,還有一敬返岩些重要的核心需求。
那麼如何設計和構建EBS底層的分布式存儲系統來滿足業務的需求,也就是如何設計一個向上層業務提供隨機IO能力的分布式存儲系統。這里有一些可能的方法來建立它。
對於EBS業務,抽象地說,需要底層分布式文件系統提供可以隨機讀寫的文件的能力。按照最直接的方式,可以如下圖邏輯映射。1TB Vdisk /dev/sad對應的是底層分布式文件系統為/foo/sda的文件。1TB地址空間上的chunk是按需分配的,分配的基本單元一般是固定的,如下圖,4MB。
Qemu等。提供了對接塊設備驅動的API,只要在分布式文件系統對接對應的客戶端實現API,塊設備就可以向上輸出。
網易實現了這種從0到1的構建方式。CURVE現在是開源的(網路類似於這個方案),底層抽象為典型的分布式文件系統,向服務輸出具有隨機讀寫能力的文件,以支持上層塊設備的EBS類型服務。架構基本類似於經典分布式文件系統的鼻祖GFS,如下圖所示。
基礎設施
數據表面核心
底層ChunkServer基於Raft)狀態機來實現副本一致性。有關詳細信息,請參見Raft對等復制狀態機。所有上層用戶的寫入都依賴於一致性協議來確保多個副本的一致性,每個用戶的區塊都分配給這些復制組。
如上圖所示
這種架構方案優點是:
該方案的缺點:
上述構建模式1是一種0對1的架構設計和實現。第二種構造方法主要是和圈內的童鞋溝通,細節無法研究,但從整體結構層面解釋分析沒有大問題。
其基本架構類似於Window Azure Storage的架構。Stream層構建在底層,Partition層構建在Stream層的基礎上(類似GFS),EBS方案可以構建在Partition層的基礎上(類似BigTable)。
如何支持基於這種架構的服務,需要從另一個角度思考如何解決這個問題。回到問題的出發點,EBS隨機地址空間讀寫方案的核心是什麼問題?
簡單來說,塊設備提供對每個地址空間(比如4KB)的原子讀寫(PUT/GET)。換句話說,如果為每個EBS實例的每個4KB內容定義了一個全局可編碼的惟一鍵,那麼它的內容就是4KB的固定大小值。那麼底層的分布式存儲系統就是一個專用的分布式鍵值系統。
構造方法2基本上遵循這樣的思想。
作為上面的基本邏輯視圖示例,底層物理層結構如下圖所示。
StreamLayer:類似於GFS/HDFS層次結構,每個流類似於一個文件,流只支持append。Stream由盤區組成(類似於HDFS/GFS的chunk),盤區使用固定復制組的方案實現多個副本/EC(參考微軟PacificA協議)。范圍支持可變長度。當盤區不可用時,seal/new創建一個新的盤區繼續提供寫入,以保證寫入的高可用性。
分區伺服器:提供一段表(根據字典
序分裂)的kv 存儲服務(增/刪/改/查)。其通過WAL實現數據的快速和及時寫入,保障數據的持久性;然後寫入MemStore(SkipList跳錶實現),在MemStore達到固定大小,比如128MB的時候Dump成SSTable(Sorted String Table),Block Cache 負責SStable 熱點數據的讀緩存。一個Partiton Server 負責多個Partition。
架構方面的更加具體的參考Window Azure Storage 的paper或者BigTable開源實現方面的書籍和資料,這里不多做展開。
在實際操作層面,對於一個上層的EFS實例,有挺多的映射關系:
一般來說為了實現EFS的快照和克隆功能,一個EFS實例一般都選擇一個table。如果是只有一個WAL,寫入的吞吐容易受影響,可以在上層使用一定的間接的業務邏輯手段使得多個相鄰的地址空間換分到不同的Region,從而把上層IO映射到更多的Region,使用多個WAL寫入能力提升帶寬。比如將地址空間按照1MB取模劃分到4個獨立的連續字典序區間Region。
此種構架方案的優點:
反脆弱:這是這種方案我認為最最大的優點,也是相比方案一的絕對殺手鐧,很多分布式存儲系統其實從 基層層面都沒有好好考慮這個問題,或者到意識到這種方案的巨大優勢。即從讀層面WAS基本實現了 已經seal 數據的任何副本是可讀的。對於寫數據來說,由於寫入只限制在當前 尚未seal 掉的chunk上,也就是3個磁碟上,並且在故障情況下隨時可以seal掉轉移。這兩點使得雖然 上層一個table的數據打散到底層這么多磁碟上。但是從爆炸半徑來說,基本上算是實現了本地盤方案的爆炸半徑,甚至在故障,過載情況下可以實現快速轉移。從這點上來說,這樣基本為分布式存儲方案去完全乾掉本地存儲方案,打下了極其堅實的基礎。
此種構建方案的缺點:
構建方案3類似方案2的變種。核心的不同點在於,構建方案2的全局排序和垃圾回收工作依賴於後期的compaction。而構建方式3傾向於盡可能塊得進行原地排序。
其基本原理是,通過WAL 寫入確保數據持久性,然後使用到內存。後台定期將寫入原地使用到隨機讀寫文件(沒錯,底層除了需要實現AppendFile,還需要實現弱一致的隨機讀寫文件RandomFile,多幅本的數據一致性由Client負責,這引入一個缺點,隨機讀寫文件很難做EC),WAL使用seal-new的方式確保寫入可用性,讀取採用Merge 更新數據(wal) 基線數據(隨機讀寫文件數據)的方式實現數據的讀取。在內存中建立對整個WAL內容的索引,最新的數據在WAL中則直接從WAL中讀取,否則從隨機讀寫文件中讀取,其基本讀寫流程圖如下
寫入:寫入還是一樣寫入WAL,然後更新內存索引,將最新數據的使用MemTable(Hash表)指向WAL。但是最終結果的Dump其實並不是按照sstable的方式,而是直接後台非同步mp到對應RandomFile的隨機地址空間。
PS1:WAL 也是類似Segment方式,定期做checkpoint(刷入RandomFile),在內存中會構建所有WAL segment的索引,WAL採用Seal/New的方式來保障可用性。
PS2: RandomFile是隨機讀寫文件,為了保障WAL長度的收斂性,後台線程會將WAL數據寫入RandomFile。RandomFile 沒法使用Seal-New的可用性,但是由於是BackGround的寫入。所以如果發現一個副本失敗,會使得BackGround mp機制阻塞(這種方案在壞盤恢復場景下,會導致BackGround寫入會卡很久)。
讀取: 讀取會首先通過Memtable查找最新數據是否在WAL中,不存在的情況下再讀RandomFile。對於RandomFile未達到一致性狀態的數據,會從WAL里頭進行讀取。(PS:由於WAL(AppendFile) 到 RandomFile的寫入是全三副本,並且一直是卡著的,所以RandomFile的恢復可以採用很魯棒的方式,直接選中任意一個還在復制組中的副本作為數據源復制。)
這種方案可以一定程度解決。讀放大、空間利用率等方面的問題。但是在克隆、快照等方面會稍微差一些,並且隨機讀寫文件很難做EC(EC改寫好麻煩)。
如上對3種構建方式進行了簡要的構建和優缺點的說明。沒有絕對的那個構建方案優於另外一個構建方案。在實踐過程中應結合自身面向的實際業務特點和技術條件等進行選擇,能快速跟上業務發展並且對方案做中長期的評估適時進行調整。
很重要一點是一定得進行抽絲剝繭、形而上得分析問題的本質。這樣才能夠把精力集中在真正的問題上,好鋼放在刀刃上。
簡單來說,塊設備提供了對每一個地址空間(比如4KB)的原子寫入和讀取(PUT/GET)。換一個角度來說如果對每一個EBS實例的每一個4KB內容定義一個全局可編碼的唯一Key,其內容為4KB的固定大小的Value。那麼這個底層分布式存儲系統就是一個專用的分布式Key-Value系統。
以上不同的方案,從邏輯上往上抽象都可以認為是向業務提供KV存儲。最本質的區別可以認為是排序在什麼時候進行。構建方案1總體來說是即刻全局排序。構建方案2 則採用局部有序的方案。而架構方案3則 使用架構方案1和方案2 的折中。
另外一個很重要的差別是從核心可靠性的角度來說,構建方案1採用了多數派(如Raft)方案應對分布式的CAP問題。而構建方案2、3採用PrimayBackup Master(多數派) Append Only的特點來應對CAP問題。
相關問答:EBS在PVC製品中的添加效果?急急急求回答!!!??
由於ebs分子存在極性醯胺基團,因此它與pvc樹脂有一定的相容性,在加工過程中ebs可以插入pvc樹脂內部,降低樹脂分子間的摩擦力,避免糊料達到防粘作用。但總體來說,ebs與pvc樹脂相容性有限,可以由樹脂內部牽引到表面,主要起到外潤滑劑的作用,可避免過高剪切應力,降低剪切熱,減小物料與加工設備之間的相互摩擦,防止物料黏附設備,從而提高製品的尺寸精度,提高製品的表面光澤度。『貳』 文件的邏輯存儲模型為
邏輯文件一般指文件邏輯結構,文件的邏輯結構是用戶可見結構。邏輯文件從結構上分成二種形式:一種是無結構的流式文件,是指對文件內信息不再劃分單位,它是依次的一串字元流構成的文件。一種是有結構的記錄式文件, 是用戶把文件內的信息按邏輯上獨立的含義劃分信息單位,每個單位稱為一個邏輯記錄
文件的邏輯結構:
文件的邏輯結構是用戶可見結構。邏輯文件從結構上分成二種形式:
一種是無結構的流式文件,是指對文件內信息不再劃分單位,它是依次的一串字元流構成的文件。
一種是有結構的記錄式文件, 是用戶把文件內的信息按邏輯上獨立的含義劃分信息單位,每個單位稱為一個邏輯記錄(簡稱記錄)。
所有記錄通常都是描述一個實體集的,有著相同或不同數目的數據項,記錄的長度可分為定長和不定長記錄兩類。
在文件系統設計時,選擇何種邏輯結構才能更有利於用戶對文件信息的操作呢?
一般情況下,選取文件的邏輯結構應遵循下述原則:
(1)當用戶對文件信息進行修改操作時,給定的邏輯結構應能盡量減少對已存儲好的文件信息的變動。
(2)當用戶需要對文件信息進行操作時,給定的邏輯結構應使文件系統在盡可能短的時間內查找到需要查找的記錄或基本信息單位。
(3)應使文件信息占據最小的存儲空間。
(4)應是便於用戶進行操作的。
『叄』 java軟體開發的架構設計
軟體架構作為一個概念,體現在技術和業務兩個方面。
從技術角度來說:軟體架構隨著技術的革新不斷地更新其內容,軟體架構建立於當前技術和一些基本原則的基礎之上。
先說一些基本原則:
分層原則:分層是為了降低軟體深度復雜性而使用的關鍵思想,就像社會有了階級一樣,軟體有了層次結構。
模塊化原則:模塊化是化解軟體廣度復雜的必然手段,模塊化的目的就是讓軟體分工。
介面實現分離原則隨著軟體模塊化的不斷深入改進,面向介面編程而不是面向實現編程可以讓復雜度日趨增高的軟體降低模塊之間的耦合度,從而讓各模塊更輕松改進。從這個原則出發,軟體也從微觀進行了細致的規范化。
還有兩個比較小但很重要的原則:
細節隱藏原則很顯然把復雜問題簡化,把難看的細節隱去,能讓軟體結構更清晰。其實這個原則使用很普遍,java/c++語言中的封裝原則以及設計模式中的Facade(外觀)模式就很能體現這個原則的精神。
依賴倒置原則隨著軟體結構的進一步發展,層與層之間、模塊與模塊之間的依賴逐漸加深,而層、模塊的動態可插拔要求不端增大。依賴倒置原則可看視為介面實現分離原則的深化,根據此原則的精神,軟體進入了工具時代。這個原則有點類似於知名的好萊塢法則:Don't call us, we'll call you。
以上這些原則奠定了我們的軟體架構的價值指標。但軟體架構畢竟是建立在當前技術之上的。而每一代技術都有架構模式。過去的不再說了,讓我們就來看一下當前流行的技術,以及當前我們能採用的架構。
因為面向對象是當前最流行開發技術,且設計模式的大量使用使面向對象的走向成熟,而資料庫是當前最有效的存儲結構、web界面是當前最流行的用戶介面,所以當前最典型的三層次架構就架構在以上幾項技術的基礎之上,用資料庫作存儲層、用面向對象來實現業務層、用web來作為用戶介面層。我們從三層次架構談起:
因為面向對象技術和資料庫技術不適配,所以在標准三層次架構的基礎上,我們增加了數據持久層,來管理O-R雙向映射,但目前一直沒有最理想的實現技術。cmp和entity bean技術因為其實現復雜,功能前景有限,已接近被淘汰的邊緣。JDO及hibernate作為o-r映射的後期之秀,尤其是hibernate,功能相當完備。推薦作為持久層的首選
在業務層,因為當前業務日趨負載,且變動頻繁,所以我們必須有足夠敏捷的技術來保證我們的適應變化的能力,在標准j2ee系統中session bean負責業務處理,且有不錯的性能表現,但採用ejb系統對業務架構模式改變太大,且其復雜而昂貴,業務代碼移植性差。而spring 作為一個bean配置的輕量級架構,漂亮的IOC模式實現,對業務架構影響小,所以推薦作為中間層業務框架。
在用戶結構層,雖然servlet/jsp/jstl/javaBean 能夠實現MVC架構,但終究過於粗糙。struts對MVC架構的實現就比較完美,Taperstry也極好地實現MVC架構,且採用基於事件的方式,非常誘人,惜其不夠成熟,我們仍舊推薦struts作為用戶介面層基礎架構。
因為業務層是三層次架構中最有決定意義的,所以讓我們回到業務層細致地分析一下,在復雜的業務我們常常需要以下基礎服務的一種或幾種:事務一致 性服務acid(tool:jta/jts)、並發加鎖服務concurrent&&lock、池化管理服務cache、訪問控制服務(tool:jaas)、流程式控制制服務workflow、動態實現服務IOC,串列化消息服務(tool:jms)、負載平衡服務blance等。如果我們不採用重量級應用伺服器(如weblogic,websphere,jboss等)及重量級組件(EJB),我們必須自己實現其中一些服務。雖然我們大 多情況下,不需要所有這些服務,但實現起來卻非易事。幸運的是我們有大量的開源實現代碼,但採用開源代碼卻常常是件不輕松的事。
隨著xml作為結構化信息傳輸和存儲地位日漸重要,一些xml文檔操作工具(DOM,Digester,SAX等)的使用愈發重要,而隨著 xml schema的java binding工具(jaxb,xmlbean等)工具的成熟,採用xml schema來設計xml文檔格式,然後採用java binding來生成java bean 會成為主要編程模式,而這又進一步使數據中心向xml轉移,使在中小數據量上,愈發傾向於以xquery為查詢語言的xml資料庫。現還有一個趨勢, microsoft,ibm等紛紛大量開發中間軟體如(microsoft office之infopath),可以直接從xml schema 生成錄入頁面等非常實用的功能。還有web service 的廣泛應用,都將對軟體的架構有非常重大的影響。至於面向服務架構(SOA)前景如何,三層次架構什麼時候走入歷史,現還很難定論。
aop的發展也會對軟體架構有很深的影響,但在面向對象架構里,無論aspectJ還是jboss-aop抑是aspectWerks、 nanning都有其自身的嚴重問題:維護性很差,所以說它將很難走遠。也許作為一個很好的思想,它將在web service里大展身手。
rdf,owl作為w3c語義模型的標志性的語言,也很難想像能在當前業務架構發揮太大影響。但如果真如它所聲稱那樣,廣泛地改變著信息的結構。那麼對軟體架構也會有深遠影響。
『肆』 存儲的架構有哪些
目前市場上的存儲架構如下:
(1)基於嵌入式架構的存儲系統
節點NVR架構主要面向小型高清監控系統,高清前端數量一般在幾十路以內。系統建設中沒有大型的存儲監控中心機房,存儲容量相對較小,用戶體驗度、系統功能集成度要求較高。在市場應用層面,超市、店鋪、小型企業、政法行業中基本管理單元等應用較為廣泛。
(2)基於X86架構的存儲系統
平台SAN架構主要面向中大型高清監控系統,前端路數成百上千甚至上萬。一般多採用IPSAN或FCSAN搭建高清視頻存儲系統。作為監控平台的重要組成部分,前端監控數據通過錄像存儲管理模塊存儲到SAN中。
此種架構接入高清前端路數相對節點NVR有了較高提升,具備快捷便利的可擴展性,技術成熟。對於IPSAN而言,雖然在ISCSI環節數據並發讀寫傳輸速率有所消耗,但其憑借擴展性良好、硬體平台通用、海量數據可充分共享等優點,仍然得到很多客戶的青睞。FCSAN在行業用戶、封閉存儲系統中應用較多,比如縣級或地級市高清監控項目,大數據量的並發讀寫對千兆網路交換提出了較大的挑戰,但應用FCSAN構建相對獨立的存儲子系統,可以有效解決上述問題。
(3)基於雲技術的存儲方案
當前,安防行業可謂「雲」山「物」罩。隨著視頻監控的高清化和網路化,存儲和管理的視頻數據量已有海量之勢,雲存儲技術是突破IP高清監控存儲瓶頸的重要手段。雲存儲作為一種服務,在未來安防監控行業有著客觀的應用前景。
與傳統存儲設備不同,雲存儲不僅是一個硬體,而是一個由網路設備、存儲設備、伺服器、軟體、接入網路、用戶訪問介面以及客戶端程序等多個部分構成的復雜系統。該系統以存儲設備為核心,通過應用層軟體對外提供數據存儲和業務服務。