虚拟化改变了计算机使用存储的方式。正如物理机被抽象成虚拟机(VM)一样,物理存储设备被抽象成虚拟磁盘。今天,我们来谈谈存储虚拟化技术。虚拟磁盘是如何实现的?

我们知道,服务器扩展存储主要有三种方法:直连存储(DAS)、存储区域网络(SAN)和网络连接存储(NAS)。那么,哪种存储类型可用于实施虚拟磁盘呢?在虚拟化环境中,像VMWare这样的虚拟机管理程序必须同时向许多虚拟机分配存储空间。在这个过程中,我们需要将物理存储资源划分为虚拟磁盘,然后再将它们分配给虚拟机。

显然,我们不能通过DAS将物理磁盘直接连接到虚拟机,如果这样,我们将需要太多的物理磁盘。SAN以逻辑单元(LUN)的形式提供存储资源,但是虚拟环境中的虚拟机数量非常庞大,LUN的数量不足以支撑这么多的虚拟磁盘。更重要的是,虚拟磁盘是由很多虚拟机共享的,因为虚拟机需要随时创建、删除或迁移,迁移虚拟机时需要共享存储,这样原始数据就不会丢失。DAS和SAN都不适合共享存储。

考虑到资源分配和共享的问题,hypervisor使用NAS实现虚拟磁盘。VMware通常使用VMFS(虚拟机文件系统)或NFS协议来实现虚拟磁盘。VMFS是专门针对虚拟机环境的文件系统协议。

每个虚拟机的数据其实就是一堆文件,最重要的文件是虚拟磁盘文件(VMDK文件),此外还有交换分区文件(vswp文件,相当于swap),非易失性内存文件(nvram相当于bios)等等。每个VM对虚拟磁盘的IO操作,其实就是对这个虚拟磁盘文件的读写。

VMFS专为虚拟服务器环境而设计、构建和优化,支持多个虚拟机一起访问集成的集群存储池,从而显著提高资源利用率。使用VMFS可以实现资源共享,使管理员可以轻松地直接受益于更高的效率和存储利用率。

使用虚拟磁盘的最重要方式之一是实例存储。每个虚拟机都是一个虚拟机实例,虚拟机管理程序在每个实例中提供一个模拟的硬件环境,包括CPU、内存和磁盘。这样,虚拟磁盘就成为了虚拟机实例的一部分,就像物理世界一样。删除虚拟机后,虚拟磁盘也将被删除。

在此实例存储模型中,虚拟磁盘和虚拟机之间的存储关系实际上是DAS存储。但是虚拟磁盘的底层实现,我们上面说了,是通过NAS实现的。hypervisor的作用是将VM层的存储模型与虚拟机下层的实现协议(VMFS或NFS)分离开来。

实例存储有其局限性。开发人员通常希望将实例数据(如操作系统和一些已安装的服务器应用程序)与用户数据分开,以便在重建虚拟机时可以保留用户数据。这种需求导致了另一种存储模型:卷存储。卷是存储的主要单位,相当于一个虚拟磁盘分区。不是虚拟机实例的一部分,可以视为虚拟机的外部存储设备。

卷可以从一个虚拟机上卸载,然后连接到另一个虚拟机。这样,我们可以将实例数据与用户数据分离开来。OpenStack的Cinder是卷存储的一种实现。除了实例存储和卷存储,最后,我们来谈谈另一种特殊的虚拟化存储:对象存储。

许多云应用程序需要在不同的虚拟机之间共享数据,通常跨越多个数据中心。对象存储可以解决这个问题。《云计算IaaS管理平台的基本功能有哪些?》中提到了对象存储。

在对象存储模型中,数据存储在一个桶中,从字面上也可以称为桶。我们可以用硬盘做个类比。对象就像文件,存储段就像文件夹(或目录)。对象和存储段可以通过统一资源标识符(URI)找到。

对象存储的核心设计思想其实就是虚拟化,具体来说就是虚拟化文件的物理存储位置,比如卷、目录、磁盘等。放入桶中,并将文件虚拟化为对象。对于应用层,它简化了对数据的访问,屏蔽了底层存储技术的异构性和复杂性。

当然你可能会问,NAS存储技术不是也能解决数据共享的问题吗?由于对象存储的规模优势和成本优势,很多云环境都使用对象存储而不是NAS。因为对象存储会分布在很多节点上,而且最新的数据并不总是可用,所以对象存储的数据一致性不强。如果需要很强的一致性,那么可以使用NAS。目前,在云计算环境中,NAS和对象存储并存。