Cinder核心

  • OpenStack 存储调度管理基础设施 Cinder 组件介绍
  • Cinder 核心流程和实现方式
  • Cinder 高可用架构实现方式

文章目录

      • Cinder
        • 主要模块
          • cinder-api
            • 核心思想
            • 核心流程
            • 细节
            • CRUD of Cinder Volumn
            • CRUD of Cinder Volumn metadata
            • Volume manage extension (manageable_volumes)¶
            • Volume transfer
            • Services (os-services)¶
            • Volume actions (volumes, action)¶
            • Generic volume groups
          • cinder-scheduler
          • cinder-volume
            • cinder-volumn Driver
          • cinder-volumn Plugin
          • cinder-backup
        • Cinder HA (Cinder 高可用)
        • Cinder的分布式锁
          • 本地锁
          • Tooz
        • 参考链接

Cinder

  • Cinder在OpenStack中为虚拟机实例提供volume的块存储服务,可将卷挂载到实例上,作为虚拟机实例的本地磁盘使用。
    • 组件化:便于添加新功能
    • 高可用:能承受高负载
    • 容错:隔离机制避免级联故障
    • 可恢复:简便及时的故障检测与恢复
    • 开放标准:提供标准实现,为社区提供参考

主要模块

Cinder核心_第1张图片

                                                 /- ( LDAP )
                             [ Auth Manager ] ---
                                    |            \- ( DB )
                                    |
                                    |
                   cinderclient     |
                  /             \   |                   /- [ scheduler ] -- [ volume ] -- ( iSCSI )
[ Web Dashboard ]-               -[ api ] -- < AMQP > --
                  \             /   |                   \- [ backup ]
                   novaclient       |
                                    |
                                    |
                                    |
                                 < REST >
cinder-api
  • 对外提供稳定而统一的北向 RESTful API,cinder-api service 服务进程通常运行在控制节点,支持多 Workers 进程(通过配置项 osapivolumeworkers 设定)。接收到的合法请求会经由 MQ 传递到 cinder-volume 执行。Cinder API 现存 v2(DEPRECATED)、v3(CURRENT) 两个版本,可以通过配置文件来启用。
  • 官方API介绍:https://developer.openstack.org/api-ref/block-storage/
核心思想
  • TaskFlow : TaskFlow 能够控制应用程序中的长流程业务逻辑任务的暂停、重启、恢复以及回滚, 主要用于保证长流程任务执行的可靠性和一致性。应用场景主要为 面向任务 的工作场景。
    • Atom: Atom 是 TaskFlow 的最小单位, 其他的所有类, 包括 Task 类都是 Atom 类的子类.
    • Task: 拥有执行和回滚功能额最小工作单元. 在 Task 类中开发者能够自定义 execute(执行) 和 revert(回滚) method。
    • Flow:在 TaskFlow 中使用 flow(流) 来关联各个 Task, 并且规定这些 Task 之间的执行和回滚顺序. flow 中不仅能够包含 task 还能够嵌套 flow. 常见类型有以下几种:
      • Linear(linear_flow.Flow): 线性流, 该类型 flow 中的 task/flow 按照加入的顺序来依次执行, 按照加入的倒序依次回滚.
      • Unordered(unordered_flow.Flow): 无序流, 该类型 flow 中的 task/flow 可能按照任意的顺序来执行和回滚.
      • Graph(graph_flow.Flow): 图流, 该类型 flow 中的 task/flow 按照显式指定的依赖关系或通过其间的 provides/requires 属性的隐含依赖关系来执行和回滚.
    • Retry:一个控制当错误发生时, 如何进行重试的特殊工作单元, 而且当你需要的时候还能够以其他参数来重试执行别的 Atom 子类. 常见类型:
      • AlwaysRevert: 错误发生时, 回滚子流
      • AlwaysRevertAll: 错误发生时, 回滚所有流
      • Times: 错误发生时, 重试子流
      • ForEach: 错误发生时, 为子流中的 Atom 提供一个新的值, 然后重试, 直到成功或 retry 中定义的值用完为止.
      • ParameterizedForEach: 错误发生时, 从后台存储(由 store 参数提供)中获取重试的值, 然后重试, 直到成功或后台存储中的值用完为止.
    • Engine: Engines 才是真正运行 Atoms 的对象, 用于 load(载入) 一个 flow, 然后驱动这个 flow 中的 task/flow 开始运行. 我们可以通过 engine_conf 参数来指定不同的 engine 类型. 常见的 engine 类型如下:
      • serial: 所有的 task 都在调用了 engine.run 的线程中运行.
      • parallel: task 可以被调度到不同的线程中运行.
      • worker-based: task 可以被调度到不同的 woker 中运行.
核心流程
  • 创建 Volume 的流程:
    • cinder-api 创建 volume_create_api 工作流(flow)
      • ExtractVolumeRequestTask:获取(Extract)、验证(Validates)create volume 在 cinder-api 阶段相关的信息
      • QuotaReserverTask:预留配额
      • EntryCreateTask:在数据库中创建 Volumn 条目
      • QuotaCommitTask:确认配额
      • VolumeCastTask:发出一个 Cast 异步请求,将创建请求丢到 MQ,最终被 cinder-scheduler service 接收
    • cinder-scheduler 启动一个 volume_create_scheduler flow
      • ExtractSchedulerSpecTask:将 request body 转换成为 Scheduler Filter 中通用的 RequestSpec 数据结构(实例对象)。
      • SchedulerCreateVolumeTask:完成 Filter 和 Weight 的调度算法。
    • RPC 请求发送到 cinder-volume service 接收
    • cinder-volume 启动工作流 volume_create_manager:
      • ExtractVolumeRefTask : 解析请求体
      • OnFailureRescheduleTask:
      • ExtractVolumeSpecTask:将 request body 转换成为 Volume 模块中通用的 RequestSpec 数据结构(实例对象)
      • NotifyVolumeActionTask:当对已有的卷采取措施的时候发送相应的通知
      • CreateVolumeFromSpecTask:创建对应的卷
      • CreateVolumeFromSpecTask:执行创建成功之后的后续操作
  • 创建 Volume 的方式
    • 建立raw格式的新卷
    • 从快照建立新卷
    • 从已有卷建立新卷
    • 从副本建立新卷
    • 从镜像建立新卷
细节

根据现在最新的 V3 版本的 API总结如下:

  • Github: Volume 资源模型
  • Volumn Type 主要是针对多后端存储进行卷类型的管理
  • Cinder核心_第2张图片
  • Volumes 针对 卷 来进行管理。其中一个卷(Volume)类似于一个如USB硬盘的可插拔的块存储设备,每一次可以将卷对应的挂载到实例上。
    • 对 Volumes 设备进行 CRUD 时,对应的会有很多种状态,可以参考对应官方文档中的状态表。
    • CRUD of Cinder Volumn
CRUD of Cinder Volumn
  • POST /v3/{project_id}/volumes Request Body
{
    "volume": {
        "size": 10,      //int The size of the volume, in gibibytes (GiB).
        "availability_zone": null, //The name of the availability zone.
        "source_volid": null, //The UUID of the source volume.
        "description": null, //The volume description.
        "multiattach": false, //To enable this volume to attach to more than one server, set this value to true. Default is false.
        "snapshot_id": null, //The UUID of the volume snapshot
        "backup_id": null, //The UUID of the backup.
        "name": null, //The volume name.
        "imageRef": null, //The UUID of the image from which you want to create the volume. 
        
                    

你可能感兴趣的:(云计算)