2021SC@SDUSC
Cinder 组件
一. Cinder 简介
cinder 是OpenStack 块存储的服务,为Nova虚拟机,容器等提供volume。
cinder的目的:
- 以组件为基础的架构:快速添加新行为
- 高可用性:大负载规模
- 容错性:将进程隔离以防止错误剧增
- 可恢复性:错误更容易被发现和纠正
- 开放标准:成为社区驱动api的一个实现
块存储:
- 操作系统获得存储空间的方式一般有两种:
1. 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区、格式化、创建文件系统;或者直接使用裸硬盘存储数据(数据库)。
2. 通过 NFS、CIFS 等 协议,mount 远程的文件系统。
2. 第一种裸硬盘的方式叫做 Block Storage(块存储),每个裸硬盘通常也称作 Volume(卷) 第二种叫做文件系统存储。NAS 和 NFS 服务器,以及各种分布式文件系统提供的都是这种存储。
块存储服务提供对 volume 从创建到删除整个生命周期的管理。从 instance 的角度看,挂载的每一个 Volume 都是一块硬盘。OpenStack 提供 Block Storage Service 的是 Cinder,其具体功能是:
1. 提供 REST API 使用户能够查询和管理 volume、volume snapshot 以及 volume type。
2. 提供 scheduler 调度 volume 创建请求,合理优化存储资源的分配
3. 通过 driver 架构支持多种 back-end(后端)存储方式,包括 LVM,NFS,Ceph 和其他诸如 EMC、IBM 等商业存储产品和方案
二 .架构简图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jPD394sG-1635174897985)(C:\Users\Jeremiah\AppData\Roaming\Typora\typora-user-images\image-20211025213146992.png)]
cinder-api :
-
控制卷的创建,删除,保存(从卷,镜像和快照中创建)
2. 快照的创建,删除和保存 3. volume attach and detach (call by nova) 4. 管理卷的种类,配额和备份
cinder-volume:
主要组件:
-
API:cinder-api与cinder-volume的交互
-
manager:真正实现api的组件
-
driver:manager 组件调用,包含与多种存储类型交流的后端专用代码。
注:
- admin 控制多个cinder-volume 的实例 (每个实例拥有其配置文件和存储后端)
- 一个cinder-volume实例管理多个后端
- 每个后端驱动与一个存储池相交互
cinder - scheduler:
-
选择哪个后端用于放置新的volume
-
设置scheduler的插件 (Filter scheduler has plugins for filters and weights)
filter scheduler
流程:
- 查看所有后端
- 按照要求过滤(如:driver要求的容量和状态,admin 创建volumn时的具体要求和user可能指定的volumn_type)
- 按照权重排序(如:可用空间)
- 返回最佳可用卷
volume-provider:
数据的存储设备,为volume提供存储空间,每个provider通过自己的driver与cinder-volume相协作。
三.Nova与Cinder的控制流
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJN2nQyw-1635174897988)(C:\Users\Jeremiah\AppData\Roaming\Typora\typora-user-images\image-20211025214907243.png)]
- Nova 通过 cinder的api调用cinder,传递连接信息
- cinder-api向cinder-volume传递信息
- manager执行最初的错误检查并调用volume-driver
- volume-driver 为接下来的连接执行必要准备
- volume-driver返回连接信息,返回给Nova
- Nova用返回的信息建立与存储的连接
- Nova将volume 设备/文件 返回给虚拟机
四.创建卷的流程
一 cinder api
-
调用cinder 提供api (api有v2和v3两个版本,v2已经被移除,现在默认使用v3版本,v3会进行更多的检查)即:v3/volume
api对请求做了name,description,image_id,type,metadata,snapshot等做了检查
之后调用volume_api的create方法
try:
new_volume = self.volume_api.create(
context, size, volume.get(</