OpenStack G版Cinder源码分析
Cinder项目主要是为openstack提供块存储的的功能。Openstack中的实例是不能持久化的,需要挂载volume,在volume中实现持久化。Cinder就是提供对volume实际需要的存储块单元(简单理解:存储空间)的实现管理功能。
Cinder的服务主要有cinder-volume,cinder-backup,cinder-scheduler,还有一个api服务,并且Cinder提供了一个控制台管理工具,提供命令行操作。cinder-backup提供cinder中的volume的备份管理功能,现在的实现是用swift作为存储后台,cinder-volume就是实现实际的块存储管理功能,cinder-scheduler实现调度功能。Cinder项目的程序整体结构是和nova很像的,如果理解了nova的体系结构,就会对他的体系结构很容易理解。理解cinder的难点其实在于对他它所用到的一些存储技术和概念的理解,要理解cinder就要如对于分布式存储,或者ISCSI协议都要有一定的了解。
Cinder对块数据实现了多种的存储管理方式。主要有LVM方式(通过LVM相关命令实现volume的创建,删除等相关操作),nfs方式(通过挂共享的方式实现volume),一种是ISCSI方式(通过ISCSI命令来实现相关的功能)。众多厂商(如华为,ibm等)根据自己的存储设备产品实现了自己的存储方式,还有一些开源的存储方案实现如rdb,sheepdog等(源码在Cinder/volume/drivers目录下)。这些存储方式是可以扩展的,要实现特定的存储方法只需要继承VolumeDriver基类,或者根据存储的类型继承他的相关子类如ISCSIDriver,实现相关的方法。
在nova的源代码libvirt目录下有一个volume.py实现对应cinder的,实现对于实际运行volume相关操作。针对cinder的不同存储类型,对应的有不同的Volume Driver类型,如LibvirtVolumeDriver,LibvirtNetVolumeDriver,LibvirtISCSIVolumeDriver,LibvirtNFSVolumeDriver等。这些类都继承于LibvirtBaseVolumeDriver这个基类,主要实现的功能其实就是构造libvirt 中attachDeviceFlags 函数需要的xml格式参数(挂载卷时attach_volume),或者构造实例xml时添加device,和实现一些功能的命令执行如LibvirtISCSIVolumeDriver中一些iscsi命令。