Cinder 是 OpenStack 的 块存储 (Block Storage) 服务,其核心功能是为虚拟机实例提供持久化的块存储设备(即云硬盘 Volume)。这些云硬盘可以被挂载到虚拟机实例上,就像给物理服务器插上一块新的硬盘一样,用于扩展实例的存储空间或持久化保存数据,即使实例本身被终止,数据也不会丢失。
1、架构
plaintext
+---------------------------------------+
| API 客户端 | (Horizon, Nova, CLI)
+-------------------+-------------------+
|
| REST API (cinder-api)
|
+-------------------v-------------------+
| cinder-api | (接收和路由API请求)
+-------------------+-------------------+
|
| AMQP (消息队列)
|
+-------------------+-------------------+
| cinder-scheduler | (卷创建调度决策)
+-------------------+-------------------+
|
| AMQP (消息队列)
|
+-------------------+-------------------+
| cinder-volume | (与存储后端交互)
+-------------------+-------------------+
|
| 驱动协议 (iSCSI, Fibre Channel, RBD, NFS, etc.)
|
+---------+---------+---------+---------+
| LVM | Ceph | NetApp | EMC | (多种存储后端)
| Driver | Driver | Driver | Driver |
+---------+---------+---------+---------+
2、核心组件/服务 (Services)
Cinder 也由多个协同工作的服务进程组成
2.1 cinder-api
API 端点和请求入口
- 接收和处理所有外部的 RESTful API 请求(例如来自 Horizon dashboard、CLI 工具 openstack volume、或 Nova 服务的请求)。
- 对用户请求进行认证、授权和参数验证。
- 将合法的请求通过消息队列(如 RabbitMQ)路由给相应的后台服务(主要是 cinder-volume)。
2.2 cinder-scheduler
决定卷创建请求应该由哪个后端的哪个存储节点来处理。
- 从消息队列中接收创建卷的请求。
- 根据请求中的属性(如卷类型
volume_type
、容量size
、可用域availability_zone
)和系统当前的状态,通过过滤器调度器(Filter Scheduler
) 机制,从所有可用的存储后端中筛选出最合适的一个。 - 其调度机制与 Nova Scheduler 非常相似,也使用过滤器(
Filters
) 和权重(Weighers
)。 - 常见过滤器:
CapacityFilter
(容量过滤),AvailabilityZoneFilter
(可用域过滤),CapabilitiesFilter
(根据卷类型中的额外规格 extra_specs 匹配后端的能力)。
配置示例cinder.conf
ini
[scheduler]
enabled_filters = CapacityFilter,AvailabilityZoneFilter,CapabilitiesFilter
enabled_weighters = CapacityWeigher
capacity_weight_multiplier = 1.0 # 容量权重乘数
2.3 cinder-volume
存储节点上的核心工作进程,一个存储节点上运行一个 cinder-volume
实例。
- 是真正与底层存储后端(如 LVM, Ceph, 商业阵列)交互、管理卷生命周期的组件。
- 接收来自消息队列的操作指令(如创建、删除、挂载卷)。
- 通过配置的 驱动程序(Driver) 调用底层存储系统的 API 或命令来执行具体操作。
- 向 cinder-scheduler 报告当前后端的状态和容量信息。
2.4 cinder-backup
备份服务。
- 负责将卷(Volume)备份到其他存储系统中(例如,将一个基于 LVM 的卷备份到 Ceph Object Storage 或 Swift 中)。
- 支持增量备份,可以有效节省备份空间和时间。