OpenStack Cinder块存储详解
OpenStack Cinder块存储详解
一、Cinder核心架构概览
Cinder 是 OpenStack 的块存储核心组件,为虚拟机提供持久化、高性能的块级存储设备。通过与 Nova 协作,Cinder 实现了计算与存储的解耦——虚拟机实例的磁盘数据独立于计算节点存在,即使虚拟机被删除,卷中的数据依然保留。🔲
架构全景图
┌──────────┐
│ Keystone │
└────┬─────┘
│ AUTH
┌────▼─────┐
USER ──REST API──► CINDER-API│
└────┬─────┘
│
┌─────▼──────┐
│ Message │
│ Queue │ ◄── RabbitMQ(异步解耦)
└─────┬──────┘
│
┌──────────┼──────────┐
▼ ▼ ▼
CINDER- CINDER- CINDER-
SCHEDULER VOLUME BACKUP
│ │ │
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│ DB │ │ 存储 │ │ 备份 │
│ MySQL │ │ 后端 │ │ 后端 │
└────────┘ └────────┘ └────────┘
│
┌────────────────┼────────────────┐
▼ ▼ ▼
LVM/iSCSI Ceph RBD NFS/FC
(本地存储) (分布式存储) (网络存储)
核心组件一览表
| 组件 | 职责 | 说明 |
|---|---|---|
| cinder-api | RESTful API入口 | 处理所有卷操作请求,验证身份权限,转发至消息队列 |
| cinder-scheduler | 调度器 | 基于 Filter + Weight 算法,智能选择最优存储后端节点 |
| cinder-volume | 卷管理器 | 直接与底层存储交互,通过驱动管理卷的完整生命周期 |
| cinder-backup | 备份服务 | 将卷备份到其他存储系统(Ceph/Swift/TSM等),支持恢复 |
| Message Queue | 消息队列(RabbitMQ) | 各服务间异步通信,实现解耦与高可用 |
| Database | 数据库(MySQL) | 存储卷、快照、备份等的状态元数据 |
架构设计哲学 — 控制与数据分离
块存储 = 控制平面 (Control Plane) + 数据平面 (Data Plane)
控制平面 → cinder-api + cinder-scheduler + 消息队列
├── 请求路由与调度
├── 权限验证与配额管理
└── 元数据持久化 (MySQL)
数据平面 → cinder-volume + 存储后端驱动
├── 实际执行 I/O 操作
├── 通过驱动层屏蔽后端差异
└── 数据路径不经过控制平面
关键设计理念: cinder-api 和 cinder-scheduler 仅负责请求调度,实际的 I/O 由 cinder-volume 通过后端驱动完成。当卷挂载到虚拟机后,数据传输直接在 Nova 计算节点与存储后端之间完成,不经过 cinder-volume 中转。🚀
二、四大核心组件深度解析 🧩
1️⃣ cinder-api — 请求入口
cinder-api 是用户与 Cinder 交互的唯一入口,对外提供 RESTful API。
cinder-api 工作流程:
1. 接收 HTTP 请求 (POST/GET/PUT/DELETE)
2. Keystone 身份验证(校验 TOKEN)
3. 请求参数校验与反序列化
4. 将 API 调用转换为消息发布到消息队列
5. 异步等待执行结果并返回响应
核心 API 端点:
| API | 方法 | 功能 |
|---|---|---|
/v3/{PROJECT_ID}/volumes |
POST | 创建卷 |
/v3/{PROJECT_ID}/volumes/{VOLUME_ID} |
GET | 查询卷详情 |
/v3/{PROJECT_ID}/volumes/{VOLUME_ID}/action |
POST | 挂载/卸载/扩展等操作 |
/v3/{PROJECT_ID}/snapshots |
POST | 创建快照 |
/v3/{PROJECT_ID}/backups |
POST | 创建备份 |
2️⃣ cinder-scheduler — 调度引擎
调度器负责为每个卷创建请求选择最优的存储节点,采用 Filter + Weight 两阶段机制:
创建卷请求 → cinder-scheduler
│
┌───────▼────────┐
│ Phase 1: Filter │
│ 过滤掉不满足条件 │
│ 的存储节点 │
└───────┬────────┘
│
┌───────▼────────┐
│ Phase 2: Weight │
│ 对剩余节点进行 │
│ 权重计算排序 │
└───────┬────────┘
│
┌───────▼────────┐
│ 选择最优节点 │
│ → cinder-volume │
└────────────────┘
内置 Filter 列表:
| Filter | 功能 |
|---|---|
| CapacityFilter | 过滤剩余容量不足的节点 |
| CapabilitiesFilter | 按卷类型特性匹配(如 SSD/HDD) |
| AvailabilityZoneFilter | 按可用域过滤 |
| DriverFilter | 检查驱动是否支持请求的操作 |
| InstanceLocalityFilter | 优先选择与目标虚拟机在同一节点的存储 |
| DifferentBackendFilter | 确保卷分布在不同的后端 |
Weighter(权重计算器):
| Weighter | 说明 |
|---|---|
| CapacityWeigher | 剩余容量越大权重越高(默认) |
| ChanceWeigher | 随机权重(均匀分布) |
| GoodnessWeigher | 基于用户自定义的 goodness 函数 |
3️⃣ cinder-volume — 卷管理核心
cinder-volume 是真正与存储硬件交互的服务,运行在存储节点上。它通过插件化驱动架构支持多种存储后端。
cinder-volume 内部架构:
┌────────────────────────────────────────┐
│ cinder-volume 服务 │
├────────────────────────────────────────┤
│ Manager(协调层) │
│ ├── RPC 消息处理 │
│ ├── 任务队列管理 │
│ └── 状态上报 │
├────────────────────────────────────────┤
│ 驱动抽象层(Volume Driver API) │
│ ├── create_volume() │
│ ├── delete_volume() │
│ ├── attach_volume() / detach_volume() │
│ ├── create_snapshot() │
│ ├── create_volume_from_snapshot() │
│ └── extend_volume() │
├────────────────────────────────────────┤
│ 具体驱动实现 │
│ ┌──────┬──────┬──────┬──────┬──────┐ │
│ │ LVM │ Ceph │ NFS │ FC │其他 │ │
│ │ iSCSI│ RBD │ │ SAN │厂商 │ │
│ └──────┴──────┴──────┴──────┴──────┘ │
└────────────────────────────────────────┘
4️⃣ cinder-backup — 备份服务
提供卷的跨区域备份与恢复能力,支持多种备份后端:
| 备份后端 | 说明 |
|---|---|
| Ceph (RBD) | 直接利用 Ceph 池差异备份 |
| Swift | 备份到 OpenStack 对象存储 |
| NFS | 备份到 NFS 共享目录 |
| Google Cloud Storage | 云存储备份 |
| IBM Tivoli Storage Manager | 企业级备份集成 |
三、Cinder 卷生命周期管理 📋
创建卷的完整流程
1. 用户执行:
openstack volume create --SIZE 100 --TYPE ssd my-volume
2. cinder-api:
├── 校验用户 TOKEN(调用 Keystone)
├── 校验请求参数(SIZE、TYPE 等)
├── 创建数据库中初始记录(STATUS=CREATING)
└── 发送 "volume.create" 消息到消息队列
3. cinder-scheduler:
├── 消费消息队列中的创建请求
├── Filter 阶段:
│ ├── CapacityFilter → 检查可用容量
│ ├── CapabilitiesFilter → 匹配 volume type
│ └── AvailabilityZoneFilter → 可用域匹配
├── Weight 阶段:
│ └── CapacityWeigher → 按剩余容量排序
└── 发送 "volume.create_on_backend" 到选定节点
4. cinder-volume (选定节点):
├── 接收消息
├── 调用对应驱动的 create_volume() 方法
├── LVM: lvcreate / Ceph: rbd create
├── 更新数据库状态为 available
└── 返回成功响应
挂载卷到虚拟机(Nova 协调)
卷挂载流程(Cinder ↔ Nova 协作):
1. 用户请求挂载:
openstack server add volume <SERVER> <VOLUME>
2. Nova 调用 Cinder 的 os-attach API:
├── Cinder 将卷状态置为 attaching
└── Cinder 返回连接信息(connector)
3. Nova 根据 connector 信息连接存储后端:
├── iSCSI: 发现 iSCSI target → 登录 → 挂载本地设备
├── Ceph: 通过 RBD map 或 librbd 直接访问
└── NFS: mount NFS 共享目录
4. Nova 将设备附加到虚拟机:
├── libvirt 定义 disk 设备
└── 卷以 /dev/vdb, /dev/vdc 等出现在 VM 内
5. Cinder 更新状态为 in-use
卷状态机
┌──────────┐
│ creating │ ── 正在创建
└────┬─────┘
│
┌────▼─────┐
┌──────────► available│ ── 可用,等待挂载
│ └────┬─────┘
│ │
┌────┴─────┐ ┌──────▼──────┐
│ attaching│ │ in-use │ ── 已挂载到虚拟机
└────┬─────┘ └──────┬──────┘
│ │
┌────▼─────┐ ┌──────▼──────┐
│detaching │ │ deleting │ ── 正在删除
└────┬─────┘ └──────┬──────┘
│ │
│ ┌────▼─────┐
│ │ deleted │ ── 已删除
│ └──────────┘
│
┌────┴───────────┐
│ error / │
│ error_deleting │
└────────────────┘
其他中间状态:
| 状态 | 说明 |
|---|---|
| reserved | 预留(正在创建时使用) |
| extending | 正在扩容 |
| backing-up | 正在备份 |
| restoring | 正在从备份恢复 |
| retyping | 正在变更卷类型 |
| maintenance | 维护模式 |
常用管理命令
# ─── 卷管理 ───
# 创建卷
openstack volume create --SIZE 100 --TYPE ssd my-volume
# ├── --SIZE 卷容量(GB)
# ├── --TYPE 卷类型(关联后端存储)
# ├── --AVAILABILITY-ZONE 指定可用域
# ├── --BOOTABLE 标记为可启动卷
# └── --PROPERTY 自定义元数据
# 列出卷
openstack volume list
# ├── --ALL-PROJECTS(管理员)查看所有项目
# ├── --NAME 按名称筛选
# └── --STATUS 按状态筛选(available/in-use)
# 查看卷详情
openstack volume show <VOLUME_ID_OR_NAME>
# └── 显示 ID、大小、状态、挂载点、卷类型等
# 删除卷
openstack volume delete <VOLUME_ID_OR_NAME>
# └── 仅 available 状态的卷可删除
# 扩展卷
openstack volume set --SIZE <NEW_SIZE> <VOLUME_ID_OR_NAME>
# └── 支持在线扩展(in-use 状态也可)
# 重命名/更新卷属性
openstack volume set --NAME new-name --property key=value <VOLUME_ID>
# ─── 挂载与卸载 ───
# 挂载卷到虚拟机
openstack server add volume <SERVER> <VOLUME>
# └── Nova 自动完成 iSCSI/Ceph 连接和 libvirt 配置
# 从虚拟机卸载卷
openstack server remove volume <SERVER> <VOLUME>
# └── 先卸载卷,再断开后端连接
# ─── 快照管理 ───
# 创建快照
openstack volume snapshot create --VOLUME <VOLUME> <SNAPSHOT_NAME>
# ├── --NAME 快照名称
# └── --FORCE 强制创建(in-use 状态)
# 从快照创建新卷
openstack volume create --SNAPSHOT <SNAPSHOT> --SIZE <SIZE> <VOLUME_NAME>
# └── 快照的写时复制机制,秒级创建
# ─── 备份管理 ───
# 创建备份
openstack volume backup create --VOLUME <VOLUME_ID> --NAME <BACKUP_NAME>
# └── 支持增量备份
# 从备份恢复
openstack volume backup restore <BACKUP_ID> <VOLUME_ID>
# └── 恢复到已有卷或创建新卷
四、卷类型与多后端存储 🔌
Volume Type 体系
Cinder 通过 ** 卷类型(Volume Type)** 实现存储策略的抽象,用户创建卷时选择类型,Cinder 自动路由到对应后端。
Volume Type = 名称 + 元数据(key-value)
内置元数据:
├── volume_backend_name → 关联存储后端(核心关联字段)
├── capabilities:SSD → 性能标签
└── capabilities:replication → 复制能力
可扩展元数据(Extra Specs):
├── qos:total_iops_sec → QoS IOPS 上限
├── qos:total_bytes_sec → QoS 带宽上限
├── compression:gzip → 压缩策略
└── replication_type:sync → 同步复制
多后端配置与管理
# 创建卷类型
openstack volume type create --property volume_backend_name=LVM lvm-type
# └── lvm-type 将自动路由到 LVM 后端
openstack volume type create --property volume_backend_name=RBD ceph-type
openstack volume type create --property volume_backend_name=FC_SAN fc-type
# 创建 QoS 规格
openstack volume qos create --consumer front-end high-iops \
--property total_iops_sec=5000
# 将 QoS 关联到卷类型
openstack volume type set --qos high-iops ceph-type
# 使用指定类型创建卷
openstack volume create --TYPE ceph-type --SIZE 100 my-db-volume
cinder.conf 多后端配置
[DEFAULT]
# 启用多个后端(用逗号分隔)
enabled_backends = lvm,ceph,nfs,fc
# ─── LVM 后端(开发测试) ───
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
volume_backend_name = LVM
target_protocol = iscsi
target_helper = lioadm
# ─── Ceph RBD 后端(生产推荐) ───
[ceph]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = 457eb76a-9e0d-4a8a-9b0d-9d3a8c9e1b2f
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
volume_backend_name = RBD
# ─── NFS 后端 ───
[nfs]
volume_driver = cinder.volume.drivers.nfs.NfsDriver
nfs_shares_config = /etc/cinder/nfs_shares
nfs_qcow2_volumes = true
nfs_mount_options = rw,sync,noatime,nolock
volume_backend_name = NFS
# ─── FC SAN 后端 ───
[fc]
volume_driver = cinder.volume.drivers.fibrechan.FibreChannelDriver
volume_backend_name = FC_SAN
use_multipath_for_image_xfer = true
五、后端存储深度对比 💾
总览对比表
| 特性 | LVM (iSCSI) | Ceph RBD | NFS | FC SAN |
|---|---|---|---|---|
| 访问粒度 | 块级 | 块级 | 文件级 | 块级 |
| HA高可用 | ❌ 单点 | ✅ 多副本 | ⚠️ 依赖服务 | ✅ 多路径 |
| 横向扩展 | ❌ 单机 | ✅ PB级 | ⚠️ 有限 | ✅ 依赖SAN |
| 数据冗余 | ❌ 无 | ✅ CRUSH复制 | ❌ 无 | ✅ SAN复制 |
| 克隆/快照 | ✅ LVM快照 | ✅ RBD快照 | ❌ 有限 | ✅ SAN快照 |
| 性能 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 运维复杂度 | ⭐简单 | ⭐⭐⭐中等 | ⭐⭐ | ⭐⭐⭐⭐高 |
| 成本 | 低 | 中 | 低 | 高 |
| 典型场景 | 开发测试 | 生产环境 | 轻量共享 | 企业已投建 |
LVM (iSCSI) — 参考实现
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
target_protocol = iscsi
target_helper = lioadm
准备:
pvcreate /dev/sdb /dev/sdc
vgcreate cinder-volumes /dev/sdb /dev/sdc
命令行操作:
# 查看卷组
vgs
# 查看逻辑卷
lvs
# 手动创建 LVM 卷(Cinder 自动化此操作)
lvcreate -L 100G -N volume-<UUID> cinder-volumes
⚠️ 生产警告: LVMVolumeDriver 是官方参考实现,不推荐用于生产。LVM 为单机解决方案,无高可用。服务器不可用时所有托管卷不可用。内核 /iSCSI 升级会导致存储连接中断。
Ceph RBD — 生产首选
[ceph]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = 457eb76a-9e0d-4a8a-9b0d-9d3a8c9e1b2f
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
Ceph 端准备:
# 1. 创建存储池
ceph osd pool create volumes 128
ceph osd pool application enable volumes rbd
# 2. 创建 Cinder 用户并授权
ceph auth get-or-create client.cinder \
mon 'profile rbd' \
osd 'profile rbd pool=volumes, profile rbd pool=vms' \
-o /etc/ceph/ceph.client.cinder.keyring
# 3. 获取 secret UUID(用于 Nova 配置)
ceph auth get-key client.cinder
核心优势:
- 弹性扩展: 支持 PB 级存储池,单集群承载数千虚拟机
- 数据冗余: CRUSH 算法跨节点复制(默认 3 副本)
- 写时复制: RBD 克隆秒级创建新卷
- 零额外路径: Nova 通过 librbd 直接读写 Ceph 集群
NFS — 共享场景
[nfs]
volume_driver = cinder.volume.drivers.nfs.NfsDriver
nfs_shares_config = /etc/cinder/nfs_shares
nfs_qcow2_volumes = true
nfs_mount_options = rw,sync,noatime,nolock
nfs_snapshot_support = true
nas_secure_file_operations = false
NFS 共享文件 (/etc/cinder/nfs_shares):
192.168.1.100:/export/cinder
192.168.1.101:/export/cinder
注意: 必须使用 NFS v4 及以上版本,不要使用 NFS v3。需注意 SELinux 上下文配置。
iSCSI (外部 SAN) — 企业集成
[iscsi]
volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver
# 或对应厂商驱动(NetApp/Dell EMC/HPE 等)
volume_backend_name = ISCSI_BACKEND
target_protocol = iscsi
target_helper = lioadm
san_ip = 192.168.1.100
san_login = admin
san_password = password
use_multipath_for_image_xfer = true
多路径配置(生产必需):
# 安装 multipath-tools
apt-get install multipath-tools
# 配置 multipath.conf
echo 'defaults {
user_friendly_names yes
find_multipaths yes
}' > /etc/multipath.conf
systemctl enable multipathd
systemctl start multipathd
六、快照与克隆 📸
快照机制
Cinder 快照基于 ** 写时复制(Copy-on-Write)** 技术,创建时间恒定在秒级:
快照创建前:
┌─────────────────────────────────┐
│ 原始卷 (Volume) │
│ ┌───┬───┬───┬───┬───┬───┬───┐ │
│ │ A │ B │ C │ D │ E │ F │ G │ │
│ └───┴───┴───┴───┴───┴───┴───┘ │
└─────────────────────────────────┘
快照创建后(COW):
┌─────────────────────────────────┐
│ 原始卷: 新写入 → 新分配块 │
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ 快照: 冻结在某个时间点的数据状态 │
│ ┌───┬───┬───┬───┬───┬───┬───┐ │
│ │ A │ B │ C │ D │ E │ F │ G │ │ ← 原始数据不变
│ └───┴───┴───┴───┴───┴───┴───┘ │
└─────────────────────────────────┘
快照操作
# 创建快照
openstack volume snapshot create --VOLUME my-volume my-snap
# └── 秒级完成,不中断 I/O
# 强制快照(in-use 状态)
openstack volume snapshot create --VOLUME my-volume --FORCE my-snap
# ⚠️ --FORCE 可能产生不一致快照
# 建议配合应用层面的一致性检查
# 列出快照
openstack volume snapshot list
# 查看快照详情
openstack volume snapshot show <SNAPSHOT_ID>
# 从快照创建新卷
openstack volume create --SNAPSHOT my-snap --SIZE 100 restored-volume
# └── RBD 后端利用 COW,不拷贝数据
# 删除快照
openstack volume snapshot delete <SNAPSHOT_ID>
一致性组 (Consistency Group)
保证多个卷的原子性快照,适用于数据库等跨多卷的一致性敏感场景:
# 创建一致性组
openstack volume group create --NAME db-consistency-group \
--VOLUME-TYPE ceph-type
# 添加卷到组
openstack volume group add volume <GROUP_ID> <VOLUME1> <VOLUME2>
# 创建一致性组快照(原子操作)
openstack volume group snapshot create --GROUP <GROUP_ID> cg-snap
# └── 所有卷在同一个时间点被快照
# 从一致性组快照批量恢复
openstack volume group create --NAME restored-group \
--GROUP-SNAPSHOT <CG_SNAPSHOT_ID>
Ceph RBD 克隆深度
Template Volume (golden image)
│
├── Snapshot (base snap)
│ │
│ ├── Clone VM-1 (COW from snapshot)
│ ├── Clone VM-2 (COW from snapshot)
│ └── Clone VM-3 (COW from snapshot)
│ │
│ └── Snapshot of VM-3 → Clone VM-3-1 (嵌套克隆)
│
└── rbd_max_clone_depth = 5(默认最大嵌套深度)
配置控制:
rbd_flatten_volume_from_snapshot = false
# false: COW 模式,创建快照体积小但性能略降
# true: 创建时 flatten(解除依赖),性能恢复但占用全量空间
rbd_max_clone_depth = 5
# 限制克隆嵌套深度,避免过长的 COW 链降低性能
七、备份与恢复 💾
快照 vs 备份
| 特性 | 快照 (Snapshot) | 备份 (Backup) |
|---|---|---|
| 存储位置 | 与卷在同一后端 | 独立的备份后端 |
| 依赖关系 | 依赖原始卷 | 独立存在 |
| 恢复能力 | 可恢复,需原始卷 | 可恢复,独立 |
| 跨站点 | ❌ 不能 | ✅ 支持 |
| 增量 | ✅ COW | ✅ 增量备份 |
| 删除原始卷 | 快照失效 | 备份依然有效 |
备份操作
# 创建备份(默认增量)
openstack volume backup create --NAME db-backup --VOLUME my-volume
# ├── --INCREMENTAL 增量备份(仅传变更数据)
# └── --FORCE 强制备份(in-use 状态)
# 列出备份
openstack volume backup list
# 查看备份详情
openstack volume backup show <BACKUP_ID>
# 从备份恢复到已有卷
openstack volume backup restore <BACKUP_ID> <VOLUME_ID>
# 删除备份
openstack volume backup delete <BACKUP_ID>
# 导出备份信息(用于跨区域迁移)
openstack volume backup record export <BACKUP_ID>
增量备份策略
备份策略示例(每周循环):
周一 22:00: 全量备份 (full) → 10GB
周二 22:00: 增量备份 (incr-1) → 200MB(仅当日变更)
周三 22:00: 增量备份 (incr-2) → 150MB
周四 22:00: 增量备份 (incr-3) → 300MB
周五 22:00: 增量备份 (incr-4) → 100MB
─────────────────────────────────────
总占用: ~10.75GB (vs 全量×4=40GB)
恢复时 Cinder 自动按时间线回放增量链。
八、Cinder 与 Nova 的深度协作 🔗
启动卷(Boot from Volume)
Nova 支持从 Cinder 卷直接启动虚拟机,实现计算与状态完全分离:
# 从镜像创建可启动卷
openstack volume create --IMAGE ubuntu-22.04 --SIZE 50 --BOOTABLE boot-volume
# 从可启动卷创建虚拟机
openstack server create --VOLUME boot-volume --FLAVOR m1.medium my-server
# └── VM 状态完全保存在 Cinder 卷中
# 一步到位:从镜像创建 VM + 自动创建可启动卷
openstack server create --IMAGE ubuntu-22.04 --FLAVOR m1.medium \
--BOOT-FROM-VOLUME 50 my-server
启动卷优势:
- 计算节点故障时,卷可立即挂载到其他 VM
- 支持实时迁移(Live Migration)无需共享存储
- VM 删除后数据保留
临时盘 vs 持久卷
| 特性 | 临时盘 (Ephemeral) | Cinder 持久卷 |
|---|---|---|
| 生命周期 | 跟随虚拟机 | 独立于虚拟机 |
| 数据持久性 | VM 删除即销毁 | 持久保存 |
| 性能 | 计算节点本地盘,延迟最低 | 网络存储,有网络延迟 |
| 迁移 | 不支持实时迁移 | 支持 |
| 备份 | 需镜像备份 | 快照+备份 |
| 适用场景 | 无状态应用、缓存 | 数据库、有状态应用 |
卷迁移
# 在线迁移卷(不同后端之间)
openstack volume migrate --HOST <TARGET_HOST@BACKEND> <VOLUME_ID>
# └── 在 cinder-volume 之间迁移数据
# Nova 冷迁移(迁移到不同计算节点)
openstack server migrate <SERVER_ID>
# └── 卷作为独立资源自动跟随,无需重新挂载
# Nova 实时迁移
openstack server live-migration <SERVER_ID>
# └── 需使用共享存储或 Ceph RBD
九、加密卷 🔒
Cinder 加密支持
Cinder 支持卷级别的数据加密,确保静态数据安全:
# 创建加密卷类型
openstack volume type create encrypted-type \
--encryption-provider luks \
--encryption-cipher aes-xts-plain64 \
--encryption-key-size 256 \
--encryption-control-location front-end
# 使用加密类型创建卷(数据自动加密)
openstack volume create --TYPE encrypted-type --SIZE 100 secure-volume
加密方式对比:
| 方式 | 说明 | 管理方 |
|---|---|---|
| 前端加密 | Nova 计算节点进行加密/解密 | 密钥通过 Barbican 管理 |
| 后端加密 | 存储后端原生加密(如 Ceph OSD 加密) | 存储运维方 |
| LUKS | Linux Unified Key Setup,磁盘级加密 | Cinder + Barbican |
十、QoS 质量保障 ⚡
QoS 规格管理
# 创建 QoS 规格
openstack volume qos create --consumer front-end high-iops \
--property total_iops_sec=5000 \
--property total_bytes_sec=104857600
# 参数说明:
# ├── total_iops_sec → IOPS 上限(每秒 I/O 次数)
# ├── read_iops_sec → 读 IOPS 上限
# ├── write_iops_sec → 写 IOPS 上限
# ├── total_bytes_sec → 带宽上限(字节/秒)
# ├── read_bytes_sec → 读带宽上限
# └── write_bytes_sec → 写带宽上限
# consumer 类型:
# ├── front-end → Nova/libvirt 层限速(推荐)
# ├── back-end → 存储后端驱动限速
# └── both → 两端同时限速
# 关联 QoS 到卷类型
openstack volume type set --qos high-iops premium-storage
# 查看 QoS
openstack volume qos show high-iops
# 解除关联
openstack volume type unset --qos premium-storage
十一、生产部署最佳实践 ✅
| 实践 | 说明 |
|---|---|
| 生产用 Ceph RBD | 高可用、分布式、COW 克隆秒级创建,避免单点故障 |
| 控制与存储分离 | cinder-api/scheduler 部署在控制节点,cinder-volume 部署在存储节点 |
| 多后端策略 | 高频盘用全闪存 Ceph,归档盘用 HDD/NFS,按 Volume Type 隔离 |
| 专用存储网络 | 分离管理网与存储网(iSCSI 专用 VLAN / Ceph 公共网络) |
| 启用多路径 | iSCSI/FC 后端必须配置 multipathd,防止单路径故障 |
| 使用一致性组 | 数据库等跨多卷应用保证快照原子性 |
| 定期快照策略 | 依据 RPO 设定快照频率(如每小时),配合 cinder-backup 长期归档 |
| QoS 隔离租户 | 关键业务设定高 IOPS QoS,防止 “噪声邻居” 问题 |
| 卷配额管理 | 按项目设置配额(卷数量 + 总容量 + 快照数量) |
| 定期 cleanup | 清理 orphan 卷、过期快照、未使用备份 |
配额管理
# 查看项目配额
openstack quota show <PROJECT_ID>
# 设置项目配额(管理员)
openstack quota set --volumes 100 --gigabytes 1000 --snapshots 50 <PROJECT_ID>
# ├── --VOLUMES 最大卷数量
# ├── --GIGABYTES 最大总容量(GB)
# ├── --SNAPSHOTS 最大快照数量
# └── --BACKUPS 最大备份数量
# 查看 Cinder 后端当前的容量使用
cinder get-pools --detail
十二、版本演进趋势 🚀
| 版本 | 核心变化 |
|---|---|
| Grizzly | Cinder 从 Nova-volume 独立为独立项目 |
| Havana | 引入 cinder-backup,支持多种备份后端 |
| Juno | 引入一致性组(Consistency Group) |
| Kilo | 支持卷加密(LUKS + Barbican) |
| Liberty | QoS Specs 标准化,replication v2 API |
| Newton | Ceph RBD 驱动大幅优化,NFS 驱动增强 |
| Ocata | 引入 image-volume 缓存,提升从镜像创建卷性能 |
| Pike | 引入卷迁移 API,多后端调度优化 |
| Queens | 加密卷增强,备份增量支持 |
| Stein | 卷类型 extra specs 增强,支持 provider_id |
| Train | 支持 DP 设备,iSCSI 多路径增强 |
| Wallaby | 一致性组重构,备份性能优化 |
| Xena | 弃用 Legacy RBD driver,统一为 RBDDriver |
| Yoga | NVMe/TCP 驱动引入 |
| 2024.2 Dalmatian | 存储策略引擎增强,QoS 细粒度控制 |
| 2025.1 Epoxy | Ceph Quincy 兼容,NFS v4 支持增强 |
| 2026.1 Gazpacho | 持续优化 NVMe-oF 与 RDMA 集成,AI 存储场景增强 |
💡 技术解析
-
术语: Filter Scheduler — Cinder 的调度算法,分为两阶段:Filter(过滤阶段)排除不满足条件的后端,Weighter(权重阶段)对剩余后端打分排序。通过可插拔的 Filter/Weighter 链实现灵活调度策略,如 CapacityFilter 排除容量不足节点、CapabilitiesFilter 匹配卷类型特性、AvailabilityZoneFilter 确保可用域亲和性。
-
术语: Volume Type — Cinder 的存储策略抽象机制,通过 Extra Specs(键值对元数据)关联 QoS 策略、后端名称、复制策略等。用户创建卷时指定类型,Cinder 自动调度到对应的存储后端。核心关联字段为
volume_backend_name。 -
术语: Copy-on-Write (COW) — 写时复制技术,Cinder 快照和 RBD 克隆的基础。创建快照时不拷贝数据,仅当原始卷有数据写入时,才将旧数据复制到快照预留区域。秒级创建快照,显著节省存储空间。
-
术语: RBD Clone — Ceph RBD 的快照克隆技术,基于 COW 从快照直接创生新卷。支持嵌套克隆,受
rbd_max_clone_depth限制(默认 5 层)。可选项rbd_flatten_volume_from_snapshot=true解除 COW 依赖以恢复全性能。 -
术语: Consistency Group(一致性组) — 将多个卷组织为一个逻辑组,保证组内所有卷快照的原子性。解决数据库等多卷应用的时间点一致性问题,确保恢复时所有卷处于同一个一致的业务状态。
-
术语: Multipath I/O — 多路径 I/O 技术,通过多条物理路径访问同一存储设备,提供路径冗余和负载均衡。在 Cinder 中通过
device-mapper-multipath实现,生产环境 iSCSI/FC 后端的必选项。 -
术语: Cinder Driver — Cinder 的存储后端插件化驱动接口,核心抽象包括
create_volume()、delete_volume()、extend_volume()、create_snapshot()、create_volume_from_snapshot()等方法。OpenStack 社区维护 30+ 种驱动,商业存储厂商提供各自的认证驱动。 -
术语: Boot from Volume — Nova 从 Cinder 卷启动虚拟机的模式,根磁盘位于 Cinder 卷而非计算节点的临时盘上。实现计算与状态完全分离,支持在线迁移、卷快照备份、故障恢复。
-
命令:
openstack volume create— 创建 Cinder 卷,--SIZE指定容量(GB),--TYPE指定卷类型关联后端,--IMAGE从镜像创建可启动卷,--SNAPSHOT从快照创建,--BOOTABLE标记为可启动,--AVAILABILITY-ZONE指定可用域,--PROPERTY添加自定义元数据。 -
命令:
openstack server add volume— 将 Cinder 卷挂载到 Nova 虚拟机,内部流程涉及 Nova 调用 Cinder os-attach API → Cinder 返回连接信息 → Nova 执行 iSCSI 登录 /RBD map/NFS mount → libvirt 定义 disk 设备。挂载后卷以/dev/vdX出现在虚拟机内部。 -
命令:
openstack volume snapshot create— 创建卷快照,--VOLUME指定源卷,--FORCE允许 in-use 状态强制快照(谨慎使用,可能数据不一致)。快照基于 COW 技术秒级完成。 -
命令:
openstack volume qos create— 创建 QoS 规格,--CONSUMER指定限速层级(front-end Nova 层 /back-end 存储层 /both),--PROPERTY设置total_iops_sec、total_bytes_sec、read_iops_sec、write_iops_sec等限速参数。通过 Volume Type 关联到具体卷。
0