类似Nova中虚拟机的生命周期管理由nova-compute服务来管理,Cinder中的Volume的生命周期则由cinder-volume服务来管理。
一 cinder-volume源码结构
cinder-volume服务代码位于cinder/volume
--api.py
--configuration.py
--driver.py
--flows
--iscsi.py
--manager.py
--qos_specs.py
--rpcapi.py
--targets
--utils.py
--volume_types.py
rpcapi.py文件定义了提供给RPC调用的接口VolumeAPI。
api.py文件中又对RPC的调用做了一层封装,其他模块需要导入的是api模块。
manager.py是cinder-volume最为核心的代码,其中VolumeManager类用于执行接收到的RPC请求,所有有关Volume生命周期管理的函数都涵盖在内。
不同的后端存储技术与存储厂商的设备以Driver的形式在Cinder中得以支持,driver.py文件定义了各种Driver的基类VolumeDriver,所有具体的Driver的实现都位于drivers子目录。
configuration.py文件则是为了所有Driver实现提供了一些配置相关的支持。
创建好的Volume一般通过iSCSI Target的方式展现给Nova,这样Nova可以通过iSCSI协议将其连接到计算节点上供虚拟机使用。Cinder支持多种提供iSCSI Target的方法,包括IET、ISER、LIO以及TGT等,相关实现位于targets目录,默认使用TGT(Linux SICI Target Framwork)。
Openstack于H版引入了QoS的特性,并在Cinder中提供了一个QoS Spec(Quality of service Specifications)框架,每个QoS Spec与Volume Type相联系,用户在创建一个卷时可以将该卷与一个Volume Type相联系,这样就间接使得该卷与特定的QoS Spec向联系。qos_specs.py中即是Qos Spec相关实现,Volume Type的实现位于volume_types.py文件。
Cinder大量使用了TaskFolw库来控制任务的执行,flows目录结构是相关的实现,其中实现的所有Task都需要继承类cinder.flow_utils.CinderTask。
二 ISCSI Target
基于iSCSI能够以较低的门槛实现SAN的应用,在OSI七层模型中,iSCSI属于传输层的协议,规定了iSCSI Target和iSCSI Initiator之间的通信机制。iSCSI Target通常是指存储设备,比如存放数据的硬盘或磁盘阵列,iSCSI Initiator则是指能够基于iSCSI协议访问Target的客户端软件。
Openstack中,Cinder创建好Volume之后通常以iSCSI Target方式提供给Nova,Nova通过iSCSI协议将该Volume连接到计算节点上供虚拟机使用。
三 后端存储Driver
为了支持不同的后端存储与技术,Cinder创建了一个Driver框架,将所有Driver需要实现的接口包含在cinder.volume.driver.VolumeDriver类中,我们可以在cinder配置文件中指定使用哪种后端存储的Drive,且以哪种方式提供iSCSI Target,cinder默认使用的是LVMISCSIDriver
volume_driver=cinder.volume.drivers.lvm.LVMISCSIDriver
iscsi_helper=tgtadm
cinder.volume.manager.VolumeManager类在初始化时会根据配置文件的设置初始化指定Driver,以默认的LVMISCSIDriver为例,VolumeManager、VolumeDriver与具体iSCSI Target提供方式的关系如下图
![](https://i-blog.csdnimg.cn/blog_migrate/dbad9a61387659e57511f206ef620db9.png)
四 Qos Spec
通常Qos是网络的一种安全机制,用于解决网络延迟和阻塞等问题,但是在Openstack中,这里的Qos不仅仅是指网络的服务质量,而是涵盖了Openstack所提供的所有资源,包括CPU、Memory、Disk IO等。
Cinder中与Qos相关的实现于Havana版本时被引入,并提供了一个QoS Spec框架,我们可以创建一个Qos Spec,它设定了一组描述存储后端服务质量的参数,比如total_bytes_sec
$cinder qos-create read_qos consumer=”front-end” read_iops_sec=1000
read_qos为该新建Qos Spec的名字,consumer指定这个Spec是面向前端(Hypervisor)还是存储后端。
Cinder中一个卷只能与Volume Type关联,而不能与Qos Spec关联,所以为了将卷与QoS关联,我们必须首先创建一个Volume Type,然后将其与Qos Spec进行关联
$cinder qos-associate [qos-spec-id] [type-id]
然后在创建一个卷时将该卷与这个Volume Type相关联,这样就间接使得该卷与特定的Qos Spec关联起来,此后在该卷附加(Attach)到一个虚拟机上,即可实现该虚拟机的限速,如果存储后端本身就支持Qos Spec中的设定,比如速度限制,那么就可以通过将consumer指定”back-end”来通过存储后端实现。