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