zoukankan      html  css  js  c++  java
  • 5 openstack -- cinder

    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

      

    四、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。

        

    七、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 结束

        

      

    insist on yourself ; never initate , every great man is unique .
  • 相关阅读:
    真香!PySpark整合Apache Hudi实战
    Apache Hudi又双叕被国内顶级云服务提供商集成了!
    Apache Hudi集成Apache Zeppelin实战
    实战 | 将Apache Hudi数据集写入阿里云OSS
    实战|使用Spark Structured Streaming写入Hudi
    Apache Hudi 设计与架构最强解读
    【Flink】Flink作业调度流程分析
    【Flink】深入理解Flink-On-Yarn模式
    【Flink】Flink 底层RPC框架分析
    【MyBatis】MyBatis自动生成代码之查询爬坑记
  • 原文地址:https://www.cnblogs.com/-cjzsr-/p/7648966.html
Copyright © 2011-2022 走看看