OpenStack 存储深度解析|Cinder 块存储 + Swift 对象存储原理与完整实操(Yoga)

OpenStack 存储深度解析|Cinder 块存储 + Swift 对象存储原理与完整实操(Yoga)

摘要:OpenStack 云计算平台包含多种存储形态,很多初学者容易混淆临时存储、块存储 Cinder、对象存储 Swift、文件存储 Manila。本文结合理论 PPT 知识 + Dashboard/CLI 双模式完整实验,讲解存储架构原理、组件交互、卷全生命周期管理,同时演示 NFS 存储后端接入,梳理大量生产踩坑点,适合运维、云计算学习者阅读。

一、OpenStack 存储基础概念

OpenStack 存储分为临时存储(非持久存储)与持久存储两大类OpenStack ...。

1.1 临时存储(Ephemeral Storage)

由 Nova 计算服务提供,是虚拟机本地磁盘。

  • 特点:虚拟机关机、重启、删除,数据直接丢失;磁盘存放在计算节点本地硬盘。
  • 场景:虚拟机操作系统盘(flavor 规格定义磁盘大小),不能存放业务重要数据。

⚠️注意:仅部署 Nova 的时候,虚拟机全部使用临时存储,数据不持久。

1.2 持久存储三大服务

表格

服务名称 中文 访问方式 典型业务场景
Cinder 块存储 块设备 /dev/vdX,格式化挂载 数据库、业务数据盘、虚拟机系统盘,可挂载卸载迁移
Swift 对象存储 REST HTTP API 访问对象 镜像备份、海量静态文件、归档备份,不支持直接挂载到虚拟机
Manila 共享文件存储 NFS/CIFS 文件共享 多虚拟机同时读写共享目录(本章节不重点展开)

简单区分:

  • 块存储 Cinder:就像给虚拟机插一块移动硬盘,可以格式化分区,随虚拟机挂载 / 卸载,数据独立虚拟机生命周期。
  • 对象存储 Swift:没有磁盘、没有文件系统,通过 URL 访问文件对象,适合海量静态文件存储,Glance 镜像、Cinder 卷备份可以存放在 Swift 中Red Hat。

二、Cinder 块存储核心原理

Cinder 是 OpenStack 块存储服务,Folsom 版本正式加入。Cinder 本身不实现底层存储,它是抽象中间层,通过驱动对接各种后端存储(LVM、NFS、Ceph、华为 / 浪潮 SAN 存储),对外提供统一 REST API。

2.1 Cinder 四大核心组件

  1. cinder‑api:接收用户 REST 请求(Dashboard/CLI),校验参数,写入数据库,通过消息队列下发任务。
  2. cinder‑scheduler :调度器,收集各个存储后端容量能力,通过过滤器 filter + 权重 weigher,选出最合适的存储后端节点来创建卷。
  3. cinder‑volume:真正和存储后端打交道,调用对应存储驱动完成卷创建、快照、扩容、删除。支持多后端,一套平台对接 LVM/NFS/Ceph/SAN 阵列。
  4. cinder‑backup:卷备份组件,可以把卷备份数据存放到 Swift 对象存储。

交互流程(创建卷)

  1. 用户提交创建卷请求给 cinder‑api;
  2. api 校验配额、参数,数据库写入卷记录,RPC 调用 scheduler;
  3. scheduler 过滤、权重计算,挑选后端;
  4. 消息队列下发任务到对应 cinder‑volume;
  5. cinder‑volume 调用后端驱动,真实创建块设备,更新数据库状态。

生产提示:LVM 后端(cinder‑volumes 卷组)仅适合测试环境,无高可用;生产建议 Ceph RBD 或者企业 SAN 存储OpenStack ...。

2.2 卷类型 Volume Type & QoS 规格

  • 卷类型:用于区分不同存储后端(高性能 SSD、普通 SATA、NFS 存储池),创建卷的时候指定 type,调度器就会落到对应后端存储池。
  • QoS 规格 :对 IOPS、带宽做限速;消费者分为front‑end(虚拟机侧)、back‑end(存储设备侧);QoS 需要关联卷类型才会生效。

三、Swift 对象存储核心原理

Swift 是 OpenStack 分布式对象存储,Austin 版本引入;无中心主节点,全部组件水平扩展,提供最终一致性,适合海量非结构化数据存储。

3.1 Swift 三层数据模型 Account / Container / Object

  1. Account:租户账号;
  2. Container:容器,类似文件夹;
  3. Object:实际存储的文件对象。

API 访问格式:/v1/{account}/{container}/{object},全部基于 HTTP RESTful 接口。

3.2 关键技术

  1. 一致性哈希 Ring 环:把对象映射物理存储节点;增加删除节点时,最小化数据迁移量。
  2. 多副本机制:一份对象保存多份副本,放置不同 Zone(物理隔离机房 / 机柜),硬件损坏不丢数据。
  3. 最终一致性:不保证写完成立刻所有副本一致;后台 Replicator、Auditor、Updater 进程异步修复副本差异,换取高可用和无限扩展能力。

3.3 Swift 和其他组件交互

  1. Glance 可以把虚拟机镜像存放在 Swift;
  2. Cinder 卷备份可以直接备份到 Swift 对象存储;
  3. Keystone 负责 Swift 的身份认证。

❗Swift 不能直接挂载给虚拟机作为磁盘,不能做操作系统盘。

四、Cinder 完整实操:Dashboard 图形界面

实验环境 OpenStack Yoga,admin 管理员账号,同时具备项目普通权限。

4.1 卷类型与 QoS 管理

  1. 管理员 → 卷 → 卷类型 → 创建卷类型:VolumeType_web,勾选公有。
  2. 创建 QoS 规格:名称QoS_web,消费者:后端(back‑end)。
  3. 卷类型操作:管理 QoS 规格关联,绑定QoS_web。

4.2 卷生命周期全套操作

① 创建卷

项目 → 卷 → 创建卷

  • 名称:Volume_web_01;来源镜像 Img_web;类型 VolumeType_web;大小 1G;可用分区 nova。 创建完成状态:available可用。
② 挂载 / 卸载卷

前提:已经存在测试虚拟机 Instance_web_01

  1. 卷操作:管理连接,选择实例连接;卷状态变为in‑use(已挂载)。
  2. 管理连接,执行分离卷;卷回到 available。

原理:Cinder 通知 Nova,compute 节点通过 iSCSI/Fc 协议连接存储,把块设备给到虚拟机。

③ 上传卷为镜像

卷操作 → 上传镜像;镜像名 Volume_Img_web,磁盘格式 qcow2;到【计算‑镜像】列表查看生成镜像。

④ 创建卷快照

卷操作 → 创建快照,名称 Volume_Snap_web。

✍思考:in‑use 已挂载卷允许创建快照,但此时虚拟机正在读写磁盘,快照可能数据不一致,业务重要数据建议停机后打快照。快照是时间点副本,可以用来恢复数据。

⑤ 卷扩容

操作 → 扩展卷,新大小设置 2GiB。

重要知识点:Cinder 扩容只扩大后端块设备容量,虚拟机内部操作系统文件系统不会自动扩容,需要登录虚拟机手动 resize 文件系统。

⑥ 基于快照创建卷

卷‑快照列表,快照操作【创建卷】,生成 Volume_web_02;该卷数据等于快照时间点。

⑦ 基于卷启动虚拟机

Volume_web_02 操作→创建实例;

关键点:只有bootable(可启动)=True的卷,才可以作为系统盘启动虚拟机。 测试验证:编辑卷,取消勾选 "可启动";此时该卷不再支持创建实例。

⑧ 更新卷状态(管理员)

管理员 →卷 →更新卷状态,设置状态为 error。用于底层存储故障,人工标记故障卷。

⑨ 删除卷(高频踩坑)

删除卷两大硬性限制:

  1. 如果卷存在快照,不能直接删除卷;必须先全部删除快照,再删卷。
  2. 如果卷状态in‑use正在挂载:普通数据卷可以先分离;系统启动盘不支持分离,必须删除虚拟机实例,卷释放为 available 后,才可以删除。

实验现象:直接删除有快照的卷,页面报错;删除系统盘卷提示失败;删除关联虚拟机之后卷才能正常删除。

4.3 拓展:Cinder 对接 NFS 存储后端实操

NFS 可以作为 Cinder 块存储后端,底层实际是 NFS 上生成虚拟文件,模拟块设备。

NFS 存储节点(IP:192.168.108.12)

bash 复制代码
mkdir /nfs_share
chmod -R 777 /nfs_share
yum -y install nfs-utils
echo "/nfs_share *(rw,sync,no_root_squash)" > /etc/exports
systemctl stop firewalld.service
systemctl restart nfs-server
systemctl enable nfs-server

Controller/cinder‑volume 节点配置

bash 复制代码
mkdir -p /mnt/nfs_share
chown -R cinder:cinder /mnt/nfs_share

编辑/etc/cinder/cinder.conf

bash 复制代码
enabled_backends = lvm,nfs

编辑/etc/cinder/nfs_shares

bash 复制代码
192.168.108.12:/nfs_share

重启服务

bash 复制代码
systemctl restart openstack-cinder-volume

后续:新建对应 NFS 后端的卷类型,创建卷选择该类型,卷就落到 NFS 存储池。

五、Cinder 完整实操:OpenStack CLI 命令行

先加载 admin 环境变量

bash 复制代码
source keystonerc_admin

5.1 卷类型 & QoS

bash 复制代码
# 创建公有卷类型
openstack volume type create --public VolumeType_cli
openstack volume type list

# 创建QoS,消费者后端
openstack volume qos create --consumer back-end QoS_cli
openstack volume qos list

# QoS关联卷类型
openstack volume qos associate QoS_cli VolumeType_cli
openstack volume qos show QoS_cli

5.2 卷全生命周期命令

bash 复制代码
#1. 创建可启动卷,从镜像
openstack volume create --image Img_cli --type VolumeType_cli --size 1 --availability-zone nova --bootable Volume_cli_01
openstack volume list

#2. 创建测试虚拟机
openstack server create --availability-zone nova --image Img_cli --flavor Flavor_cli --network shared --key-name KeyPair_cli Instance_cli_01

#挂载卷
openstack server add volume Instance_cli_01 Volume_cli_01
openstack volume list
#卸载卷
openstack server remove volume Instance_cli_01 Volume_cli_01

#3.卷上传镜像
openstack image create --volume Volume_cli_01 --disk-format qcow2 Volume_Img_cli
openstack image list

#4.创建快照
openstack volume snapshot create --volume Volume_cli_01 Volume_Snap_cli
openstack volume snapshot list

#5.卷扩容到2G
openstack volume set --size 2 Volume_cli_01
openstack volume show Volume_cli_01

#6.快照创建卷
openstack volume create --snapshot Volume_Snap_cli Volume_cli_02
openstack volume list

#7.卷启动虚拟机
openstack server create --volume Volume_cli_02 --flavor Flavor_cli --network shared Instance_cli_02
openstack server list

#设置为非启动卷,再次创建实例直接失败
openstack volume set --non-bootable Volume_cli_02

#8.修改卷状态为error
openstack volume set --state error Volume_cli_01

#9.删除卷
#存在快照,直接删除报错,先删快照
openstack volume snapshot delete Volume_Snap_cli
openstack volume delete Volume_cli_01

#系统盘in‑use,不能直接删除;删除实例后卷释放
openstack server delete Instance_cli_02
openstack volume delete Volume_cli_02
openstack volume list

六、重点踩坑总结(面试 & 排错高频)

  1. 临时存储 Nova 本地盘:虚拟机删除数据消失;重要业务数据必须用 Cinder 持久卷。
  2. Cinder LVM 后端cinder‑volumesVG,适合学习测试,无 HA,存储节点宕机全部卷不可用,禁止生产直接使用。
  3. 删除卷两个拦路虎:快照未清理、卷处于 in‑use 挂载;系统启动盘不能 detach,只能删虚拟机。
  4. 快照:挂载状态可以打快照,但是存在数据不一致风险,生产业务尽量停机快照。
  5. 卷扩容:Cinder 只是扩大块设备,虚拟机操作系统内部文件系统必须手动扩容。
  6. bootable属性:只有可启动卷,才能作为系统盘创建虚拟机;普通数据盘不需要该标记。
  7. Swift 对象存储:不能挂载为虚拟机磁盘,适合静态文件、镜像、备份;依靠多副本 + Ring 一致性哈希实现高可用,是最终一致性模型。
  8. 卷类型 + QoS:QoS 不绑定卷类型不会生效;卷类型用来调度区分不同存储后端池。

七、思考题参考答案

  1. 卷在已挂载的状态下,是否支持创建卷快照?会有什么影响?

支持;但虚拟机业务正在读写磁盘,快照捕获的是磁盘瞬间状态,可能出现文件系统不一致,业务建议停机后创建快照。

  1. 是否所有状态 "可用" 的卷都可以用来发放虚拟机实例?

不是;卷必须开启bootable(可启动)属性,才能作为系统盘启动虚拟机;仅状态 available 不够。

相关推荐
汤姆宝库1 小时前
具身智能深拆:VLA、世界模型与数据飞轮
开发语言·人工智能·php
云和数据.ChenGuang1 小时前
深入剖析 Python 的 MRO 规则:从 C3 线性化到实战踩坑
开发语言·python·1024程序员节
123_不打狼1 小时前
Squidiff:基于条件扩散模型预测细胞发育与扰动响应
开发语言·python·squidiff
瑞got2 小时前
java使用CountDownLatch做并行查询
java·开发语言
H.莓飛2 小时前
【数据结构】排序总结与规模实测
linux·服务器·开发语言·数据结构·visual studio·1024程序员节
2501_915106322 小时前
Windows 上开发 Unity iOS,使用 KXBuild 进行真机调试、性能采样与打包 ipa
windows·vscode·unity·ios·个人开发·swift·敏捷流程
会编程的吕洞宾3 小时前
RAG检索质量怎么评估?3个指标+LLM裁判实战
java·开发语言·人工智能·后端
FLJwu3 小时前
运动相机采购实战|第四篇(终章):一张清单走完选型全流程,把风险拦在源头
c语言·开发语言·数码相机·运动相机·oem 量产