VMFS簡介:資料組織,鎖和寫時拷貝
VMFS(Virtual Machine File System)是VMWare為其VMWare ESX Server和VMWare Infrastructure產品開發的叢集檔案系統。它主要用來儲存虛擬機器的磁碟映象,設計的初衷是為了讓多個主機合作維護儲存在共享磁碟上的檔案系統,而不需要一個coordinator的角色。
VMFS會將共享的磁碟分成四個不同的資源池:inode,指標塊,資料塊和子塊。Inode和指標塊在VMFS中的作用和在傳統的UNIX檔案系統中的作用類似,分別用來儲存檔案的後設資料以及指向包含實際檔案資料的資料塊的指標。資料塊和子塊都用於儲存檔案的資料,區別是塊的大小。在每個資源池中,資源都被組織成叢集(cluster),每個叢集的頭部維護了該叢集包含的資源的後設資料,比如每個資源的引用數量,哪些資源已經被分配了。
前面提到,VMFS採用了兩種不同的資源型別來儲存檔案資料:資料塊和子塊。在VMFS中檔案大小滿足雙峰分佈,虛擬機器磁碟映象檔案通常有幾個GB那麼大,而配置檔案和日誌檔案通常只有幾個KB。因此,VMFS使用1MB的資料塊來儲存大檔案,減少後設資料開銷和外部碎片;而對於小檔案,VMFS使用更小的子塊來儲存,減少內部碎片。
VMFS使用分散式鎖管理來支援多個主機併發訪問檔案和資源。大多數叢集檔案系統使用IP網路來進行同步(RPC?),而VMFS完全依靠磁碟的鎖來同步所有的檔案訪問。為了保護臨界區的讀-改-寫,VMFS使用基於SCSI-2的邏輯單元號預留技術(LUN reservations)保證訪問鎖資料結構的原子性(這段不是很懂)。為了利用SAN的可靠性,在VMFS中訪問同步狀態(鎖的狀態)和訪問檔案系統的狀態的方法是相同的,避免了基於IP的同步機制典型的“split brain[2]”問題,一旦網路連線中斷,多個主機將不能知道檔案系統的鎖定狀態而導致同時訪問檔案系統的共享資料。
VMFS的鎖可以分為檔案鎖和叢集鎖。VMFS的檔案鎖是粗粒度的,會同時鎖住檔案的後設資料(inode和指標塊)和資料(資料塊和子塊),也就是檔案涉及的所有資源。另外VMFS中的檔案鎖一般持續較長的時間,比如一個虛擬機器的磁碟映象檔案,只要虛擬機器開機就會被一直鎖住。為了保護資源的後設資料,VMFS還使用了叢集鎖,分配和回收資源都必須將其涉及的所有叢集鎖住。這裡就涉及到一個鎖開銷和競爭鎖開銷的權衡。如果設定一個叢集包含很多的資源,主機就可以用較少的鎖來操作更多的資源,但同時也加劇了主機之間的競爭開銷。
VMFS還支援塊級的寫時拷貝。VMFS的每個資料塊和子塊都可以被多個指標塊引用,因此不同的檔案之間可以共享相同的資料。每個指向共享資源的引用都被打上一個寫時拷貝的位標記,當需要修改這個資源時,必須生成這個資源的一個副本,對副本進行修改。值得注意的是,這個寫時拷貝的位標記是打在引用上,而不是打在共享資源上,否則的話,每次寫操作都必須獲取叢集鎖來檢查目標資源的寫時拷貝位標記。當要在兩個檔案之間共享資源時,需要獲得兩個檔案的鎖,因為兩個檔案的指標塊都需要修改,即使其中一個可能只需要修改寫時拷貝標記位。
參考文獻:
[1] Austin T. Clements et al. Decentralized Deduplication in SAN Cluster File Systems. In Proceedings of the USENIX Annual Technical Conference, 2009. USENIX.
[2] Split-brain. http://en.wikipedia.org/wiki/Split-brain_(computing)
[3] Logical Unit Number. http://en.wikipedia.org/wiki/Logical_Unit_Number
相關文章
- javaScript深拷貝和淺拷貝簡單梳理JavaScript
- 深拷貝和淺拷貝的簡要詳解
- C++---寫時拷貝解決深淺拷貝問題C++
- python深拷貝和淺拷貝之簡單分析Python
- JavaScript資料型別AND深拷貝和淺拷貝的不歸路JavaScript資料型別
- 深究cp拷貝資料夾時`/`的用法
- iOS深拷貝和淺拷貝iOS
- Java深拷貝和淺拷貝Java
- 物件深拷貝和淺拷貝物件
- JavaScript 深度拷貝和淺拷貝JavaScript
- JavaScript深拷貝和淺拷貝JavaScript
- js 淺拷貝和深拷貝JS
- js 深拷貝和淺拷貝JS
- JavaScript淺拷貝和深拷貝JavaScript
- js深拷貝和淺拷貝JS
- python 指標拷貝,淺拷貝和深拷貝Python指標
- 組織程式和資料
- js資料型別賦值,淺拷貝,深拷貝JS資料型別賦值
- C++淺拷貝和深拷貝C++
- go slice深拷貝和淺拷貝Go
- JavaScript之深拷貝和淺拷貝JavaScript
- js的深拷貝和淺拷貝JS
- 聊聊物件深拷貝和淺拷貝物件
- ECMAScript-淺拷貝和深拷貝
- js之淺拷貝和深拷貝JS
- 深度解析深拷貝和淺拷貝
- Objective C淺拷貝和深拷貝Object
- VUE 中 的深拷貝和淺拷貝Vue
- 對淺拷貝和深拷貝的理解
- js實現深拷貝和淺拷貝JS
- 淺探js深拷貝和淺拷貝JS
- Javascript知識點:淺拷貝和深拷貝JavaScript
- js 陣列的淺拷貝和深拷貝JS陣列
- PHP中的淺拷貝和深拷貝薦PHP
- [JS系列二]談談深拷貝和淺拷貝,如何實現深拷貝JS
- STL——STL中string的寫時拷貝機制
- js的淺拷貝和深拷貝和應用場景JS
- 【Python】直接賦值,深拷貝和淺拷貝Python賦值