Cinder前身是Nova中的nova-volume服务,在Folsom版本发布时,从Nova中剥离作为一个独立的Openstack项目存在。
与Nova利用主机本地存储为虚拟机提供的临时存储不同,Cinder则类似于Amazon的EBS(Elastic Block Storage),为虚拟机提供持久化的块存储能力,实现虚拟机存储卷(Volume)的创建,挂载卸载、快照(Snapshot)等生命周期管理。
不同于Swift在存储数据与具体存储设备和文件系统之间引入了“对象”的概念作为一层抽象,Cinder则是虚拟机与具体存储设备之间引入了一层“逻辑存储卷”的抽象,Cinder提供的RESTful API主要是针对逻辑存储卷的管理。
Cinder架构图如下:
目前Cinder主要是由cinder-api、cinder-scheduler、cinder-volume以及cinder-backup几个服务组成,它们之间通过AMQP消息队列进行通信。
cinder-api:是进入Cinder的HTTP接口。
cinder-volume:运行在存储节点上管理具体存储设备的存储空间,每个存储节点上都会运行一个cinder-volume服务,多个这样的节点便构成了一个存储资源池。
cinder-scheduler:会根据预定的策略(比如不同的调度算法)选择合适的cinder-volume节点来处理用户的请求。在用户的请求没有指定具体的存储节点时,会使用cinder-scheduler选择一个合适的节点,如果用户请求已经指定了具体的存储节点,则该节点上的cinder-volume会进行处理,并不需要cinder-scheduler的参与。
cinder-backup:用于提供存储卷的备份功能,支持将存储卷备份到Openstack对象存储,比如Swift、Ceph对象存储等。
Cinder在虚拟机和具体存储设备之间引入了“逻辑存储卷”的抽象,但Cinder本身并不是一种存储技术,并没有实现对块设备的实际管理和服务,它只是提供了一个中间的抽象层,为后端不同的存储技术,比如DAS、NAS、SAN、对象存储以及分布式文件系统等,提供了统一的接口,不同的块设备厂商在cinder中以驱动的形式实现这些接口来与Openstack进行整合。更细化的Cinder架构如下图:
Cinder默认使用LVM(Logical Volume Manager)作为后端存储(Backend Storage),它已实现在Linux 2.4内核。
通常我们在Linux系统里使用fdisk工具来分割并管理磁盘的分区,比如将磁盘/dev/sda分割为/dev/sda1与/dev/sda2两个分区满足不同的需要,但是这种手段非常生硬,比如需要我们重新引导系统来使分区生效。
而LVM通过在操作系统与物理存储资源之间引入逻辑卷(Logical Volume)的抽象来解决传统磁盘分区管理工具的问题。
LVM将众多不同的物理存储器资源(物理卷,比如磁盘分区)组成卷组,卷组可以理解为普通系统物理磁盘,但是在卷组上并不能安装文件系统,而是需要LVM从卷组中创建一个逻辑卷,然后将ext3、ReiserFS等文件系统安装在这个逻辑卷上,我们可以在不重新引导系统的前提下通过在卷组里划分额外的空间为这个逻辑卷动态扩容。
比如:由四个磁盘分区组成的LVM系统,LVM在由这四个磁盘分区组成的卷组上创建了多个逻辑卷作为逻辑分区,如果需要为一个逻辑分区扩充存储空间,只需要从剩余空间上分配一些给逻辑分区使用。
除了LVM,目前Cinder以驱动的形式已经支持众多存储技术或存储厂商的设备作为后端存储,比如SAN(Storage Area Network)、Sheepdog以及EMC等厂商的设备。
SAN采用了FC(Fibre Channel、光纤通道)技术,通过FC交换机连接存储阵列和服务器主机,建立专门用于数据存储的区域网络。但是FS设备价格比较昂贵,为了降低成本,SAN可以使用基于IP协议的iSCSI协议建立,并不受SCSI布局限制。SCSI通常要求设备互相靠近并且使用SCSI总线连接,而iSCSI可适用于服务器主机和存储设备在TCP/IP网络进行大量数据的可靠传输。
Sheepdog是一个类似于Ceph的分布式存储系统开源实现,由NTT的3名日本研究员开发,淘宝也是Sheepdog社区的主要贡献者。