欢迎光临
我们一直在努力

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 四大核心组件

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

  • 用户提交创建卷请求给 cinder‑api;
  • api 校验配额、参数,数据库写入卷记录,RPC 调用 scheduler;
  • scheduler 过滤、权重计算,挑选后端;
  • 消息队列下发任务到对应 cinder‑volume;
  • 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

  • Account:租户账号;
  • Container:容器,类似文件夹;
  • Object:实际存储的文件对象。
  • API 访问格式:/v1/{account}/{container}/{object},全部基于 HTTP RESTful 接口。

    3.2 关键技术

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

  • Glance 可以把虚拟机镜像存放在 Swift;
  • Cinder 卷备份可以直接备份到 Swift 对象存储;
  • Keystone 负责 Swift 的身份认证。
  • ❗Swift 不能直接挂载给虚拟机作为磁盘,不能做操作系统盘。

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

    在这里插入图片描述

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

    4.1 卷类型与 QoS 管理

  • 管理员 → 卷 → 卷类型 → 创建卷类型:VolumeType_web,勾选公有。
  • 创建 QoS 规格:名称QoS_web,消费者:后端(back‑end)。
  • 卷类型操作:管理 QoS 规格关联,绑定QoS_web。
  • 4.2 卷生命周期全套操作

    ① 创建卷

    项目 → 卷 → 创建卷

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

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

  • 卷操作:管理连接,选择实例连接;卷状态变为in‑use(已挂载)。
  • 管理连接,执行分离卷;卷回到 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。用于底层存储故障,人工标记故障卷。

    ⑨ 删除卷(高频踩坑)

    删除卷两大硬性限制:

  • 如果卷存在快照,不能直接删除卷;必须先全部删除快照,再删卷。
  • 如果卷状态in‑use正在挂载:普通数据卷可以先分离;系统启动盘不支持分离,必须删除虚拟机实例,卷释放为 available 后,才可以删除。
  • 实验现象:直接删除有快照的卷,页面报错;删除系统盘卷提示失败;删除关联虚拟机之后卷才能正常删除。

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

    在这里插入图片描述

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

    NFS 存储节点(IP:192.168.108.12)

    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 节点配置

    mkdir -p /mnt/nfs_share
    chown -R cinder:cinder /mnt/nfs_share

    编辑/etc/cinder/cinder.conf

    enabled_backends = lvm,nfs

    编辑/etc/cinder/nfs_shares

    192.168.108.12:/nfs_share

    重启服务

    systemctl restart openstack-cinder-volume

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

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

    先加载 admin 环境变量

    source keystonerc_admin

    5.1 卷类型 & QoS

    在这里插入图片描述

    # 创建公有卷类型
    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 卷全生命周期命令

    #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

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

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

  • 卷在已挂载的状态下,是否支持创建卷快照?会有什么影响?
  • 支持;但虚拟机业务正在读写磁盘,快照捕获的是磁盘瞬间状态,可能出现文件系统不一致,业务建议停机后创建快照。

  • 是否所有状态 “可用” 的卷都可以用来发放虚拟机实例?
  • 不是;卷必须开启bootable(可启动)属性,才能作为系统盘启动虚拟机;仅状态 available 不够。

    赞(0)
    未经允许不得转载:171主机测评 » OpenStack 存储深度解析|Cinder 块存储 + Swift 对象存储原理与完整实操(Yoga)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址