OpenStack Cinder块存储详解

发表于
更新于
6 12.6~16.2 分钟 5664

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_sectotal_bytes_secread_iops_secwrite_iops_sec 等限速参数。通过 Volume Type 关联到具体卷。


0
上一篇 免责声明
下一篇 OpenStack Horizon(Web控制面板)详解