OpenStack:Cinder组件介绍

来自CloudWiki
跳转至: 导航搜索

理解 Block Storage

操作系统获得存储空间的方式一般有两种:

  • 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区、格式化、创建文件系统;或者直接使用裸硬盘存储数据(数据库)
  • 通过 NFS、CIFS 等 协议,mount 远程的文件系统


第一种裸硬盘的方式叫做 Block Storage(块存储),每个裸硬盘通常也称作 Volume(卷) 第二种叫做文件系统存储。NAS 和 NFS 服务器,以及各种分布式文件系统提供的都是这种存储。

Openstack8-39.png

理解 Block Storage Service

Block Storage Servicet 提供对 volume 从创建到删除整个生命周期的管理。

从 instance 的角度看,挂载的每一个 Volume 都是一块硬盘。

OpenStack 提供 Block Storage Service 的是 Cinder,其具体功能是:

  • 提供 REST API 使用户能够查询和管理 volume、volume snapshot 以及 volume type
  • 提供 scheduler 调度 volume 创建请求,合理优化存储资源的分配
  • 通过 driver 架构支持多种 back-end(后端)存储方式,包括 LVM,NFS,Ceph 和其他诸如 EMC、IBM 等商业存储产品和方案

Openstack8-40.png

Cinder 架构

下图是 cinder 的逻辑架构图

Openstack8-38.png

Cinder 包含如下几个组件:

cinder-api

接收 API 请求,调用 cinder-volume 执行操作。

cinder-volume

管理 volume 的服务,与 volume provider 协调工作,管理 volume 的生命周期。运行 cinder-volume 服务的节点被称作为存储节点。

cinder-scheduler

scheduler 通过调度算法选择最合适的存储节点创建 volume。

volume provider

数据的存储设备,为 volume 提供物理存储空间。

cinder-volume 支持多种 volume provider,每种 volume provider 通过自己的 driver 与cinder-volume 协调工作。

Message Queue

Cinder 各个子服务通过消息队列实现进程间通信和相互协作。因为有了消息队列,子服务之间实现了解耦,这种松散的结构也是分布式系统的重要特征。

Database

Cinder 有一些数据需要存放到数据库中,一般使用 MySQL。数据库是安装在控制节点上的,比如在我们的实验环境中,可以访问名称为“cinder”的数据库。

Cinder常用操作

卷操作

创建卷

从已有卷创建卷 (克隆)

扩展卷

删除卷

卷-虚机操作

挂载卷到虚机

分离虚机卷

卷-快照操作

创建卷的快照

从已有卷快照创建卷

删除快照

卷-镜像操作

从镜像创建卷

从卷创建镜像

Cinder服务启动流程

Cinder的主要服务包括cinder-api、cinder-scheduler和cinder-volume等,这里介绍下cinder-api服务的启动流程,其它类似。

cinder-api服务启动流程

从/cmd/api.py的main函数中我们可以看到以下几行代码:


def main():
    objects.register_all()
    gmr_opts.set_defaults(CONF)
    CONF(sys.argv[1:], project='cinder',
         version=version.version_string())
    config.set_middleware_defaults()
    logging.setup(CONF, "cinder")
    python_logging.captureWarnings(True)
    utils.monkey_patch()

    gmr.TextGuruMeditation.setup_autorun(version, conf=CONF)

    rpc.init(CONF)
    launcher = service.process_launcher()
    server = service.WSGIService('osapi_volume')
    launcher.launch_service(server, workers=server.workers)
    launcher.wait()


(1)register_all函数是导入/cinder/object目录下的多个模块

(2)接着是加载配置文件、设置中间件和初始化日志模块

(3)初始化rpc模块,用于与其它服务进行通信

(4)启动wsgi服务,监听客户端发送的请求

参考文档:

[1] https://www.cnblogs.com/CloudMan6/p/5573159.html

[2] https://www.cnblogs.com/luohaixian/p/8134967.html

[3] https://www.cnblogs.com/sammyliu/p/4219974.html