openstack -- cinder

一、understand block storage

  1、How the operation system get its storage

    # 裸硬盘存储

      也叫做 block storage

      每个裸硬盘通常也称作 Volume(卷)

    # 文件系统存储

      通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区、格式化、创建文件系统

      NAS 和 NFS 服务器,以及各种分布式文件系统提供的都是这种存储

    # 通过 NFS、CIFS 等 协议,mount 远程的文件系统

二、understand block storage service

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

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

  3、OpenStack 提供 Block Storage Service 的是 Cinder

三、cider framework

  

介绍openstack中的cinder组件 openstack cinder driver_大数据

四、cinder module function

  -- cinder API

    提供 REST API 使用户能够查询和管理 volume、volume snapshot 以及 volume type

  -- 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 deploy

六、summarize create volume

    1)、客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(cinder-api)发送请求:“帮我创建一个 volume”

    2)、API 对请求做一些必要处理后,向 Messaging(RabbitMQ)发送了一条消息:“让 Scheduler 创建一个 volume”。

    3)、cheduler(cinder-scheduler)从 Messaging 获取到 API 发给它的消息,然后执行调度算法,从若干计存储点中选出节点 A

    4)、Scheduler 向 Messaging 发送了一条消息:“让存储节点 A 创建这个 volume”。

    5)、存储节点 A 的 Volume(cinder-volume)从 Messaging 中获取到 Scheduler 发给它的消息,然后通过 driver 在 volume provider 上创建 volume。

    

介绍openstack中的cinder组件 openstack cinder driver_python_02

七、step explain in detail --- CREATE

  1)、cinder IPA 的处理过程

    Part 1

# GUI 上操作的菜单为 Project -> Compute -> Volumes -> Create Volume
       设置 volume 的名称,volume type,capacity,Availability Zone 等基本信息。
    # 点击“Create Volume” 按钮,cinder-api 将接收到创建 volume 的请求。
     查看 cinder-api 日志 /opt/stack/logs/c-api.log
    # 日志显示 cinder-api 接收到一个 POST 类型的 REST API
     分析 HTTP body ,明确该请求
    Part 2
    # 紧接着,cinder-api 启动了一个 Flow(工作流)volume_create_api
     Flow 的执行状态依次为 PENDING, RUNNING 和 SUCCESS
     volume_create_api 当前的状态由 PENDING 变为 RUNNING
    # volume_create_api 工作流包含若干 Task,每个 Task 完成特定的任务。
     这些任务依次为 ExtractVolumeRequestTask, QuotaReserveTask, EntryCreateTask, QuotaCommitTask, VolumeCastTask
    #  ExtractVolumeRequestTask 获取 request 信息
     QuotaReserveTask 预留配额
     EntryCreateTask 在数据库中创建 volume 条目
     QuotaCommitTask 确认配额
     VolumeCastTask 是向 cinder-sheduler 发送消息,开始调度工作
    # Flow volume_create_api 已经完成,状态由 RUNNING 变为 SUCCESS,volume 创建成功
    # 注意
     “volume 创建成功”只是指 cinder-api 已经成功处理了 volume create 请求,将消息发给了 cinder-scheduler,
     但并不意味 volume 在存储节点上已经成功创建,这一点是容易引起误解的。
     我们可以通过 cinder-volume 创建 volume 日志的时间戳验证
   Part 3
    # cinder-api 向 RabbitMQ 发送了一条消息:“让cinder-scheduler 创建一个 volume”
    # 这是由 VolumeCastTask 发出的,但是它没有打印相关的日志
    # 所以我们只能通过源代码查看 /opt/stack/cinder/cinder/volume/flows/api/create_volume.py ,方法为create_volume
  2)、cinder-scheduler 的处理过程
   Part 1
    # cinder scheduler 执行调度算法,通过 filter 和 weight 挑选最优的存储节点日志为/opt/stack/logs/c-sch.log
    # cinder scheduler 通过 flow volume_create_scheduler 执行调度工作
    # 该 Flow 依次执行 ExtractSchedulerSpecTask 和 ScheduleCreateVolumeTask
    # 主要的 filter 和 weighting 工作由 ScheduleCreateVolumeTask 完成。
    # 经过 AvailabilityZoneFilter, CapacityFilter, CapabilitiesFilter 和 CapacityWeigher 的层层筛选
     最终选择了存储节点 (假设:devstack-controller@lvmdriver-1#lvmdriver-1)
    # Flow volume_create_scheduler 完成调度,状态变为 SUCCESS
   Part 2
    # cinder-scheduler 发送消息给 cinder-volume
    # 让其创建 volume 源码 /opt/stack/cinder/cinder/scheduler/filter_scheduler.py,方法为 schedule_create_volume
   3)、cinder volume 处理过程
   Part 1
    # cinder volume 通过 driver 创建 volume,日志为 /opt/stack/c-vol.log
    # cinder-volume 也启动了一个 Flow 来完成 volume 创建工作,Flow 的名称为 volume_create_manager
    # volume_create_manager 首先执行 ExtractVolumeRefTask, OnFailureRescheduleTask, ExtractVolumeSpecTask, NotifyVolumeActionTask 为 volume 创建做准备
   Part 2
    # 接下来 CreateVolumeFromSpecTask 执行 volume 创建任务
    # 因为 volume provider 为 LVM, CreateVolumeFromSpecTask 通过 lvcreate 命令在 VG stack-volumes-lvmdriver-1 中创建了一个 1G(假设) 的 LV,cinder-volume 将这个 LV 作为volume
     新创建的 LV 命名为“volume-1e7f6bd7-ce11-4a73-b95e-aabd65a5b188”(假设),其格式为“volume-<volume ID>”
   Part 3
    # 最后,CreateVolumeOnFinishTask 完成扫尾工作
    # 至此,volume 成功创建,Flow volume_create_manager 结束