也谈存储虚拟化与软件定义存储
现在,无论是传统 IT 还是互联网行业,云平台似乎越来越受到关注和认可。在通常的 IAAS 平台中,虚拟化技术和相应的平台管理工具(API)是主要技术点,而虚拟化实现实际上决定这个云平台的扩展和利用能力,几乎决定了 IAAS 平台的能力和竞争力。
虚拟化是一个既熟悉又复杂的词汇,在很大一部分场所指的是利用物理机的资源(计算,存储,网络)为众多虚拟机提供相应的隔离资源,比如成熟的单机虚拟化工具 KVM 和 Xen。而实际上虚拟化有时候会泛指资源的池化,如一个集群的所有资源都是可以调度利用并提供能力的,特别是指存储资源的虚拟化,往往倾向于一个集群机器的存储资源的整合利用。
在谈到单机虚拟化与集群虚拟化的时候,计算资源虚拟化往往比存储虚拟化更容易理解,我们在谈及存储虚拟化的时候可以以前者为例。
大家都已经习惯单机虚拟化的使用,如使用 VirtualBox 可以随意创建出虚拟机,虚拟快设备和虚拟网络。而为了弥补性能问题,硬件提供了相应的虚拟化指令帮助更好的切换 Host/VM 运行态和更快的内存访问。这种虚拟化满足用户应用多样化的需要,提高了资源的利用率,但是当用户希望能利用一群机器资源池子化来创建一个更强大能力的单一运行环境时,Hadoop 和 Spark 部分满足了这个需求,它跟一个理想中巨大”VM”的区别就是运行环境 API 的差异。理想化的集群虚拟化可能是一个 Nginx 服务器无缝的在一个集群“VM”上运行,一个 fork 调用会跑到不同的机器运行,这可能就需要一个分布式“内核”去搞定(一个学术项目在做这件事)。
不过这个兼容 Posix 标准的 VM 未必就是合理的,如果串行编程之于并行编程,在程序设计思路和实现上会有巨大鸿沟,那么分布式编程如果还能直接使用 Posix 标准,那么想必也绝不是直接拿并行编程的那一套就可以,假设具备一个庞大的支持 Posix 标准的 VM,那么程序设计反而需要向 Mapreduce 靠拢,数据更多考虑分片化,减少避免锁和同步,尽量减少中间结果。那么最后既然在分布式编程需要向 Mapreduce 上靠,这个支持 Posix 的容器可能也没有想象的重要。
存储虚拟化
花了这么多时间讲计算资源虚拟化和 Posix 标准的关系就是为了铺垫存储虚拟化,先考虑单机存储虚拟化,就是在 Host 机器分配一个文件,一个虚拟块设备(LVM)或者一个物理设备到 VM,通过全模拟的 Qemu 或者 KVM 来帮助实现从 VM 到设备的访问。相应的,当用户希望能自由组合和利用多个机器上的存储资源时,集群的存储虚拟化就是需要的。与计算资源不同的是,依赖于网络的存储资源更具备可能性,本质原因是存储资源与计算相比是个慢得多的设备。因此,网络并不会为节点间存储资源传输增添太多的负荷,原来的程序设计也不需要像计算资源一样过多考虑局部性的问题。
图片来自SNIA Technical Tutorial
因此,与计算资源虚拟化概念不太一样的是,大多时候,存储虚拟化更多的会是集群所有存储资源的池子化,通常提供存储虚拟化能力的是软件,通过沟通多个网络连接的存储设备来提供一致性的数据服务。任何一个技术都是为了解决一些问题才是有价值的,存储虚拟化它作为一个技术提供了解决一些问题的新方法,而这些问题中最显著改善的就是整个存储基础设施的管理。我们都知道因为存储服务固有的“慢”,从数据访问到真正存储的介质之间塞进去各种虚拟、优化、缓存层,这些层次构成的复杂性实际上已经成为存储系统高可用的障碍,而存储虚拟化也被寄希望于解决这些问题:
- 单点失败问题: 无论是阵列,SAN或者是中间的网络设备都会成为问题
- QoS问题: 实际上维护和持久保证一个SAN或者存储系统的性能是非常困难的,而虚拟化提供了实时“管理”性能的可能性
- 在存储系统中的数据是任何用户业务的关键,任何数据的丢失或者一段时间不可用都是灾难性事件,虚拟化提供了可用性的方案而不是需要昂贵的高端存储
- 低效的空间利用: 实际上用户业务增加的数据往往需要新的存储设备提供,而旧设备往往在不断新设备的提供后慢慢降低了空间利用率,加上困难的数据管理操作,用户的存储系统很容易随着时间使得利用率大幅下降
存储虚拟化技术为了解决上述问题,需要显著减少存储系统的管理难度(通过将管理物理设备转换为管理虚拟设备),减少 down-time,增加新旧设备的空间利用和弹性使用,抽象存储设备的特性。这些能力使得虚拟化实现具备以下基本能力:
- 地址空间的重新映射
- IO 重定向
- 提供复制分发
- 磁盘资源和资源池元信息的管理
通常我们把这部分特性分为三个层次,分别是协议层,地址转换层和数据存储层。协议层提供网络路由的高可用,地址转换层保证存储资源的高可用,数据存储层保证存储资源的持久性。而数据存储层的抽象化往往会根据虚拟化实现本身会存在多个层次,如磁盘虚拟化,文件系统虚拟化,块设备虚拟化等等。
以开源的块存储解决方法 Ceph 为例,Ceph 的客户端依赖多个元信息服务器提供的智能理由能力,承担起地址转换的角色,根据请求的地址参数请求相应的后端 OSD,OSD 将块设备视为一个带权重和属性的存储对象来提供数据存储资源的持久性和均衡性,这个持久性可以是复制或者是擦除码分发。再比如一个 Strata 提供的高性能分布式存储,由 SDN 协议实现的到 Virtual NFS Server 的网络路由高可用,由改进的 NFS Server 提供数据的高可用。
此外,由于虚拟化本身的抽象存储能力,虚拟化实现本身可以看成是众多存储设备的大脑,往往基于一些用户输入和定义规则能扩展出更加诱人的特性,比如分层存储,快照,灾备。
总而言之,存储虚拟化是为了提高空间利用率,降低成本,提供理想化的资源(空间和IO能力)自由分配和组合的可能性,并且向用户呈现的是数据而不是它的物理存储位置及存储方式,同时减小了对存储硬件资源的绑定(增加了异构存储设备整合能力),将更多特性放在了虚拟化实现上。当然,与原生的设备访问相比,性能上损耗和保证能力的损失是存在的,这部分掌控取决于存储虚拟化的实现,同时存储虚拟化技术是否能发挥这些功效的程度取决于其完整性及在核心数据管理体系结构中的集成度。
软件定义存储
软件定义存储(Software defined Storage)实际上是另一个火热概念,通常情况下它与虚拟化密切联系并出现。但是软件定义存储实际上存在更大的适用范围,它的目标是从存储硬件中分离出存储功能和服务并提供编程接口,如 OpenStack Cinder, EMC ViPR, Nexenta 和 HP StoreVirtual 都是这个范畴。
再具体一点,软件定义存储是把存储硬件或软件提供的控制能力抽象出来,并与数据层面的能力(数据访问)分开,这些控制能力包括卷管理,RAID,QoS,数据复制,监控,快照和备份等等,这个举动意义在于这些控制能力抽象出来以后,任何厂商提供的存储能力控制都是接近的,避免对厂商的绑定。这些作用很容易与以前提到的 Storage Hypervisor 联系起来,只不过它们在不同时期的环境下提出和定义。然后它通过这些控制能力进一步为管理员提供自定义、基于策略的虚拟存储层,这些策略可以是基于空间、性能、费用等等因素。它的优势在于与存储虚拟化相比更加轻量,通常可以保留底层存储系统如SAN,阵列的特性并仍然发挥作用,而且部署和实现难度都大幅度下降,可以采用更小的代价实现管理存储基础设施的能力。
那么在这里更期望用一些例子来阐述存储虚拟化与软件定义存储的交集和联系。OpenStack Cinder 是一个典型的软件定义存储产品,它目前支持大量的存储厂商设备,它定义了一些卷管理,快照,备份,简单统计等特性,用户可以使用 Cinder 提供的接口来获得不同存储设备提供的相似能力。而 Ceph 可以看作一个典型的存储虚拟化产品,它将大量的通用存储设备联合起来提供一个存储池,并实现了一般存储厂商产品的能力。而 Ceph 的块存储能力使得它成为了 Cinder 的一个 Driver。同时,Cinder 通过了这些基本 API 进行扩展,可以定义出不同的存储池,智能化的存储区域等等。
但是 EMC 的 ViPR 作为一个典型的软件定义存储产品仍然提供了数据访问层的能力,它的 Object Data Service 可以支持对象存储接口(S3, Swift)和 HDFS 接口。
因此分割存储虚拟化与软件定义存储的关系是不现实的,在一般环境下,往往将软件定义存储视为偏管理数据的软件,将存储虚拟化视为处理数据访问的实现,两者往往会在自身基础上向对方的功能或者特性上发展。
参考
ViPR 软件定义的存储 – EMC(http://china.emc.com/data-center-management/vipr/index.htm)
HITACHI STORAGE VIRTUALIZATION(http://www.hds.com/solutions/it-strategies/storage-virtualization/)
Storage Virtualization: The SNIA Technical Tutorial(https://www.snia.org/education/storage_networking_primer/stor_virt)