OpenStack Cinder块存储详解

OpenStack Cinder块存储详解

一、Cinder核心架构概览

Cinder是OpenStack的块存储核心组件,为虚拟机提供持久化、高性能的块级存储设备。通过与Nova协作,Cinder实现了计算与存储的解耦——虚拟机实例的磁盘数据独立于计算节点存在,即使虚拟机被删除,卷中的数据依然保留。🔲

架构全景图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
                  ┌──────────┐
│ 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) 存储卷、快照、备份等的状态元数据

架构设计哲学 — 控制与数据分离

1
2
3
4
5
6
7
8
9
10
11
块存储 = 控制平面 (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。

1
2
3
4
5
6
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 两阶段机制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
创建卷请求 → 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 是真正与存储硬件交互的服务,运行在存储节点上。它通过插件化驱动架构支持多种存储后端。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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 协调)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
卷挂载流程(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

卷状态机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
                ┌──────────┐
│ creating │ ── 正在创建
└────┬─────┘

┌────▼─────┐
┌──────────► available│ ── 可用,等待挂载
│ └────┬─────┘
│ │
┌────┴─────┐ ┌──────▼──────┐
│ attaching│ │ in-use │ ── 已挂载到虚拟机
└────┬─────┘ └──────┬──────┘
│ │
┌────▼─────┐ ┌──────▼──────┐
│detaching │ │ deleting │ ── 正在删除
└────┬─────┘ └──────┬──────┘
│ │
│ ┌────▼─────┐
│ │ deleted │ ── 已删除
│ └──────────┘

┌────┴───────────┐
│ error / │
│ error_deleting │
└────────────────┘

其他中间状态:

状态 说明
reserved 预留(正在创建时使用)
extending 正在扩容
backing-up 正在备份
restoring 正在从备份恢复
retyping 正在变更卷类型
maintenance 维护模式

常用管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# ─── 卷管理 ───

# 创建卷
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 自动路由到对应后端。

1
2
3
4
5
6
7
8
9
10
11
12
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 → 同步复制

多后端配置与管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建卷类型
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 多后端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[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) — 参考实现

1
2
3
4
5
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
target_protocol = iscsi
target_helper = lioadm

准备:

1
2
pvcreate /dev/sdb /dev/sdc
vgcreate cinder-volumes /dev/sdb /dev/sdc

命令行操作:

1
2
3
4
5
6
# 查看卷组
vgs
# 查看逻辑卷
lvs
# 手动创建 LVM 卷(Cinder 自动化此操作)
lvcreate -L 100G -N volume-<UUID> cinder-volumes

⚠️ 生产警告: LVMVolumeDriver 是官方参考实现,不推荐用于生产。LVM 为单机解决方案,无高可用。服务器不可用时所有托管卷不可用。内核/iSCSI 升级会导致存储连接中断。

Ceph RBD — 生产首选

1
2
3
4
5
6
7
8
9
10
[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
2
3
4
5
6
7
8
9
10
11
12
# 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 — 共享场景

1
2
3
4
5
6
7
[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):

1
2
192.168.1.100:/export/cinder
192.168.1.101:/export/cinder

注意: 必须使用 NFS v4 及以上版本,不要使用 NFS v3。需注意 SELinux 上下文配置。

iSCSI (外部 SAN) — 企业集成

1
2
3
4
5
6
7
8
9
10
[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

多路径配置(生产必需):

1
2
3
4
5
6
7
8
9
10
11
# 安装 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)技术,创建时间恒定在秒级:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
快照创建前:
┌─────────────────────────────────┐
│ 原始卷 (Volume) │
│ ┌───┬───┬───┬───┬───┬───┬───┐ │
│ │ A │ B │ C │ D │ E │ F │ G │ │
│ └───┴───┴───┴───┴───┴───┴───┘ │
└─────────────────────────────────┘

快照创建后(COW):
┌─────────────────────────────────┐
│ 原始卷: 新写入 → 新分配块 │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ 快照: 冻结在某个时间点的数据状态 │
│ ┌───┬───┬───┬───┬───┬───┬───┐ │
│ │ A │ B │ C │ D │ E │ F │ G │ │ ← 原始数据不变
│ └───┴───┴───┴───┴───┴───┴───┘ │
└─────────────────────────────────┘

快照操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建快照
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)

保证多个卷的原子性快照,适用于数据库等跨多卷的一致性敏感场景:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建一致性组
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 克隆深度

1
2
3
4
5
6
7
8
9
10
11
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(默认最大嵌套深度)

配置控制:

1
2
3
4
5
6
rbd_flatten_volume_from_snapshot = false
# false: COW 模式,创建快照体积小但性能略降
# true: 创建时 flatten(解除依赖),性能恢复但占用全量空间

rbd_max_clone_depth = 5
# 限制克隆嵌套深度,避免过长的 COW 链降低性能

七、备份与恢复 💾

快照 vs 备份

特性 快照 (Snapshot) 备份 (Backup)
存储位置 与卷在同一后端 独立的备份后端
依赖关系 依赖原始卷 独立存在
恢复能力 可恢复,需原始卷 可恢复,独立
跨站点 ❌ 不能 ✅ 支持
增量 ✅ COW ✅ 增量备份
删除原始卷 快照失效 备份依然有效

备份操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建备份(默认增量)
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>

增量备份策略

1
2
3
4
5
6
7
8
9
备份策略示例(每周循环):

周一 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 卷直接启动虚拟机,实现计算与状态完全分离

1
2
3
4
5
6
7
8
9
10
# 从镜像创建可启动卷
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 删除即销毁 持久保存
性能 计算节点本地盘,延迟最低 网络存储,有网络延迟
迁移 不支持实时迁移 支持
备份 需镜像备份 快照+备份
适用场景 无状态应用、缓存 数据库、有状态应用

卷迁移

1
2
3
4
5
6
7
8
9
10
11
# 在线迁移卷(不同后端之间)
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 支持卷级别的数据加密,确保静态数据安全:

1
2
3
4
5
6
7
8
9
# 创建加密卷类型
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 规格管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建 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 卷、过期快照、未使用备份

配额管理

1
2
3
4
5
6
7
8
9
10
11
12
# 查看项目配额
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_sectotal_bytes_secread_iops_secwrite_iops_sec 等限速参数。通过 Volume Type 关联到具体卷。