前面已经学习了 Cinder 的架构和相关组件,从本节我们开始详细分析 Cinder 的各种操作,首先讨论 Cinder 如何创建 volume。

Create 操作流程如下:

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

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

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

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

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

因为 Create Volume 操作比较复杂,我们将分三次讨论:
今天是第一部分,讨论 cinder-api 的处理过程;
第二部分讨论 cinder-scheduler;
第三部分讨论 cinder-volume 的操作。

向 cinder-api 发送请求

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

GUI 上操作的菜单为 Project -> Compute -> Volumes -> Create Volume

设置 volume 的名称,volume type,大小,Availability Zone 等基本信息。

这里我们没有设置 Volume Source,这样会创建一个空白的 volume。

点击“Create Volume” 按钮,cinder-api 将接收到创建 volume 的请求。
查看 cinder-api 日志 /opt/stack/logs/c-api.log。

日志显示 cinder-api 接收到一个 POST 类型的 REST API,经过对 HTTP body 的分析,该请求是:创建一个 1GB 的 volume。

紧接着,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。
Task 的执行状态也会经历 PENDING, RUNNING 和 SUCCESS 三个阶段。

Task 的名称基本上说明了任务的工作内容,前面几个 Task 主要是做一些创建 volume 的准备工作,比如:

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 日志的时间戳验证。

cinder-api 发送消息

cinder-api 向 RabbitMQ 发送了一条消息:“让cinder-scheduler 创建一个 volume”
前面我们提到消息是由 VolumeCastTask 发出的,因为 VolumeCastTask 没有打印相关日志,我们只能通过源代码查看
/opt/stack/cinder/cinder/volume/flows/api/create_volume.py ,方法为 create_volume。

下一节我们讨论 Create Volume 的第二部分: cinder-scheduler 的处理过程。

Create Volume 操作(Part I) - 每天5分钟玩转 OpenStack(50)的更多相关文章

  1. Nova Suspend/Rescue 操作详解 - 每天5分钟玩转 OpenStack(35)

    本节我们讨论 Suspend/Resume 和 Rescue/Unrescue 这两组操作. Suspend/Resume 有时需要长时间暂停 instance,可以通过 Suspend 操作将 in ...

  2. Launch和Shut Off操作详解 - 每天5分钟玩转 OpenStack(30)

    本节详细分析 instance launch 和 shut off 操作,以及如何在日志中快速定位有用信息的技巧. Launch Launch instance 应该算 Nova 最重要的操作. 仔细 ...

  3. Start Instance 操作详解 - 每天5分钟玩转 OpenStack(31)

    本节通过日志文件详细分析 instance start 操作. 下面是 start instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-compute 执 ...

  4. Terminate Instance 操作详解 - 每天5分钟玩转 OpenStack(33)

    本节通过日志详细分析 Nova Terminate 操作. Terminate 操作就是删除 instance,下面是 terminate instance 的流程图 向 nova-api 发送请求 ...

  5. Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34)

    本节通过日志详细分析 Nova Pause/Resume 操作. 有时需要短时间暂停 instance,可以通过 Pause 操作将 instance 的状态保存到宿主机的内存中.当需要恢复的时候,执 ...

  6. Snapshot Instance 操作详解 - 每天5分钟玩转 OpenStack(36)

    本节我们通过日志详细讨论 instance 的 snapshot 操作. 有时候操作系统损坏得很严重,通过 Rescue 操作无法修复,那么我们就得考虑通过备份恢复了.当然前提是我们之前对instan ...

  7. Rebuild Instance 操作详解 - 每天5分钟玩转 OpenStack(37)

    上一节我们讨论了 snapshot,snapshot 的一个重要作用是对 instance 做备份. 如果 instance 损坏了,可以通过 snapshot 恢复,这个恢复的操作就是 Rebuil ...

  8. Shelve Instance 操作详解 - 每天5分钟玩转 OpenStack(38)

    Instance 被 Suspend 后虽然处于 Shut Down 状态,但 Hypervisor 依然在宿主机上为其预留了资源,以便在以后能够成功 Resume. 如果希望释放这些预留资源,可以使 ...

  9. Unshelve Instance 操作详解 - 每天5分钟玩转 OpenStack(39)

    上一节我们 shelve instance 到 Glance,本节讨论如何通过 unshelve 操作恢复该 instance. 因为 Glance 中保存了 instance 的 image,uns ...

  10. Migrate Instance 操作详解 - 每天5分钟玩转 OpenStack(40)

    Migrate 操作的作用是将 instance 从当前的计算节点迁移到其他节点上. Migrate 不要求源和目标节点必须共享存储,当然共享存储也是可以的. Migrate 前必须满足一个条件:计算 ...

随机推荐

  1. View 与 Controller 之间的delegate(代理)传值

    这个代理传值是经常使用的一种传值方式,下面介绍一种View 和 Controller 之间的代理传值方法. 先建立一个View视图 如 LoginView 是继承于一个UIView 在LoginVie ...

  2. Python框架之Tornado(二)请求阶段

    概述 上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分: 启动程序阶段,又称为待请求阶段(上图1.2所有系列和3.0) 接收并处理客户端请求阶段(上图3系列) ...

  3. Linux 升级glibc-2.14 失败 我遇到的问题

    直接说步骤和流程: 1.到http://www.gnu.org/software/libc/下载最新版本,我这里下载了glibc-2.14.tar.gz 这个版本,解压到任意目录准备编译(/usr/l ...

  4. 2.5美元每月的VPS, host1plus

    国内用的比较多的国外VPS应该算的上是Linode和DigitalOcean了,和他们相比Host1plus在价格上更有优势,最低每月2.5刀,也就相当于每月30多块的话费,而且Host1Plus支持 ...

  5. 解决Ionic的ion-slide-box 2条数据渲染问题

    当slider数据列表是动态获取时,如果数据结果只有2条数据时,slider列表会多复制俩个,通过下面的slideChange方法做个判断可以解决这个bug 第一步:添加slideChande方法 & ...

  6. qemu ubuntu for zynq(armhf)

    apt-get install qemu-user-static qemu-system mkdir qemu-ubuntu qemu-debootstrap --arch=armhf trusty ...

  7. JSP内置对象及常用方法

    jsp九大内置对象及四个作用域: 何为作用域 先让我们看看效果: 大概流程是这样的,我们访问index.jsp的时候,分别对pageContext, request, session,applicat ...

  8. JSP页面以及JSP九大隐式对象

    €JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. €JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比 ...

  9. 方维 o2o app源码出售

    方维 o2o app源码出售 方维o2oapp源码出售 1.本人官方5万购买,现把方维o2o app 源码低价出售: 2.包括网站源码本地搭建包成功提供指导 3.包括网站说明文档,不包含app说明文档 ...

  10. TCP和UDP的区别

    (1)TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务:(2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序:UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等 ...