理解块存储
操作系统获得存储空间的方式一般有两种:
通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区、格式化、创建文件系统;或者直接使用裸硬盘存储数据(数据库)。
通过 NFS、CIFS 等协议,mount 远程的文件系统。
第一种裸硬盘的方式叫做 Block Storage(块存储)
,每个裸硬盘通常也称作 Volume(卷)
。
第二种叫做文件系统存储。NAS
和 NFS
服务器,以及各种分布式文件系统提供的都是这种存储。
理解 Cinder
Block Storage Servicet 提供对 volume 从创建到删除整个生命周期的管理。从实例的角度看,挂载的每一个 Volume 都是一块硬盘。
OpenStack 提供 Block Storage Service 的就是 Cinder
。
Cinder功能
- 提供 REST API 使用户能够查询和管理
volume
、volume snapshot
以及volume type
。 - 提供 scheduler 调度 volume 创建请求,合理优化存储资源的分配。
- 通过 driver 架构支持多种 back-end(后端)存储方式,包括 LVM,NFS,Ceph 和其他诸如 EMC、IBM 等商业存储产品和方案。
OpenStack中的存储
临时存储(Ephemeral Storage)
- 如果只部署了Nova服务,则默认分配给虚拟机的磁盘是临时的,当虚拟机终止后,存储空间也会被释放。
- 默认情况下,临时存储以文件形式放置在计算节点的本地磁盘上。
持久性存储(Persistent Storage)
- 持久化存储设备的生命周期独立于任何其他系统设备或资源,存储的数据一直可用,无论虚拟机是否运行。
- 当虚拟机终止后,持久性存储上的数据仍然可用。
- 目前OpenStack支持的三种类型的持久性存储:
块存储
、对象存储
、文件系统
。
Cinder架构
- Cinder Client封装Cinder提供的rest接口,以CLI形式供用户使用。
- Cinder API对外提供rest API,对操作需求进行解析,对API进行路由寻找相应的处理方法。包含卷的增删改查(包括从源卷、镜像、快照创建)、快照增删改查、备份、volume type管理、挂载/卸载(Nova调用)等。
- Cinder Scheduler负责收集backend上报的容量、能力信息,根设定的算法完成卷到指定cinder-volume的调度。
- Cinder Volume多节点部署,使用不同的配置文件、接入不同的backend设备,由各存储厂商插入driver代码与设备交互完成设备容量和能力信息收集、卷操作。
- Cinder Backup实现将卷的数据备份到其他存储介质(目前SWIFT/Ceph/TSM提供了驱动)
- SQL DB提供存储卷、快照、备份、service等数据,支持Mysql、PG、MSSQL等SQL数据库。
Cinder架构说明
Cinder架构部署:以SAN存储为例
- Cinder-api,Cinder-Scheduler,Cinder-Volume可以选择部署到一个节点上,也可以分别部署。
- API采用AA模式,Haproxy作为LB,分发请求到多个Cinder API。
- Scheduler也采用AA模式,有rabbitmq以负载均衡模式向3个节点发放任务,并同时从rabbitmq收取Cinder volume上报的能力信息,调度时,Scheduler通过在DB中预留资源从而保证数据一致性。
- Cinder Volume也采用AA模式,同时上报一个backend容量和能力信息,并同时接受请求进行处理。
- RabbitMQ,支持主备或集群。
- MySQL,支持主备或集群。
- Cinder可以避免单点故障。
Cinder组件详细讲解
API
Cinder API对外提供REST API,对操作需求进行解析,并调用处理方法:
- 卷create/delete/list/show
- 快照create/delete/list/show
- 卷attach/detach(Nova调用)
- 其他:
- Volume types
- Quotas
- Backups
Scheduler
Cinder scheduler负责收集后端上报的容量、能力信息,根据设定的算法完成卷到制定cinder-volume的调度。
通过过滤和称权,筛选出合适的后端:
- 列出所有后端
- 根据后端的能力进行筛选
- 根据权重给后端排序
- 返回最合适的后端
根据预定的策略(比如不同的调度算法)选择合适的cinder-volume节点来处理用户的请求:
- Drivers定期报告后端的能力和状态
- 管理员创建的卷类型(Volume type)
- 创建卷时,用户指定卷类型
Volume
Cinder Vlomue多节点部署,使用不同的配置文件、接入不同的后端设备,由各存储厂商插入Driver代码与设备交互,完成设备容量和能力信息收集、卷操作等。
Cinder默认的后端驱动是LVM。
Cinder典型工作流程
Cinder创建卷流程
创建卷类型的目的是为了筛选不同的后端存储,例如SSD、SATA、高性能、低性能等,通过创建不同的自定义卷类型,创建卷时自动筛选出合适的后端存储。
Cinder API
- 检查参数合法性(用户输入,权限,资源是否存在等)。
- 准备创建的参数字典,预留和提交配额。
- 在数据库中创建对应的数据记录。
- 通过消息队列将请求和参数发送到Scheduler。
Cinder Scheduler
- 提取接收到的请求参数
- 通过配置的filter和输入参数对后端进行过滤
- Availability_zone_filter
- Capacity_filter
- Capabilities_filter
- Affinity_filter(SameBackendFilter/DifferentBackendFilter)
- ……
- Weigher计算后端进行权重
- CapacityWeigher/AllocatedCapacityWeigher
- ChanceWeigher
- GoodnessWeigher
- ……
- 选取最优的Backend并通过消息队列将请求发送到指定的后端。
Cinder Volume
- 提取接收到的请求参数
- 调用对应的Driver在后端创建实际的卷
- 使用Driver返回的模型更新数据库中的记录
Cinder挂载卷流程
挂载流程:挂卷是通过Nova和Cinder的配合最终将远端的卷连接到虚拟机所在的Host节点上,并最终通过虚拟机管理程序映射到内部的虚拟机中。
- Cinder调用Cinder API创建卷,传递主机的信息,如hostname,iSCSI initiator name,FC WWPNs
- Cinder API将该信息传递给Cinder Volume
- Cinder Volume通过创建卷时保存的host信息找到对应的Cinder Driver
- Cinder Driver通知存储允许该主机访问该卷,并返回该存储的连接信息(如iSCSI iqn,portal,FC target WWPN,NFS path等)
- Nova调用针对于不同存储类型进行主机识别磁盘的代码(Cinder提供了brick模块用于参考)实现识别磁盘或文件设备。
- Nova通知Cinder已经进行了挂载。
- Nova将主机的设备信息传递给hypervisor来实现虚拟机挂载磁盘。
总结
OpenStack Cinder是一个开源的块存储服务,为OpenStack云平台提供可扩展的、可靠的存储服务。
Cinder的主要功能包括:
- 创建、删除和管理块存储卷;
- 管理块存储卷的快照;
- 卷的扩容和缩小;
- 卷的迁移和复制等。
Cinder通过可插拔的存储后端驱动支持多种存储设备,包括:
- 本地存储(例如LVM、Ceph等);
- 网络存储(例如iSCSI、FC等)。
Cinder的架构由三个主要组件组成:
- API:接收来自用户和其他OpenStack服务的请求,并将它们发送给调度程序。
- 调度程序:选择最适合的存储后端来处理请求,并将它们发送给相应的卷管理器。
- 卷管理器:与存储后端交互来执行请求操作。
Cinder还提供了一些高级功能,例如:
- 卷类型:定义卷的特定功能和限制,例如QoS、多路径和快照支持。
- 卷加密:提供数据加密保护。
- 卷共享:允许多个虚拟机共享同一个卷。
总的来说,Cinder提供了一种可靠、灵活和可扩展的块存储服务,为OpenStack云平台中的各种应用程序和服务提供了强大的存储支持。