OpenStack 块存储与对象存储:Cinder 与 Swift 篇
OpenStack 存储概述
在 OpenStack 云平台中,存储是基础设施的核心组成部分之一,主要分为块存储 和对象存储 两种类型,分别由 Cinder 和 Swift 两个项目提供支持。
块存储适用于需要高性能、低延迟的存储场景,如虚拟机硬盘、数据库存储等;对象存储则适用于海量非结构化数据的长期存储,如图片、视频、备份文件等。
本文将分别介绍 Cinder 和 Swift 的架构、工作原理与实验配置。
OpenStack 块存储:Cinder
Cinder 的作用与定位
Cinder 为虚拟机提供块存储服务,它在虚拟机与具体存储设备之间引入了一层"逻辑存储卷"的抽象。Cinder 本身并不直接管理物理存储设备,而是通过统一的接口与后端存储技术进行对接。不同的存储厂商可以通过驱动(Driver)的形式与 Cinder 集成,实现存储资源的统一管理。
Cinder 架构
Cinder 采用模块化设计,主要包括以下组件:
- Cinder Client:提供命令行接口,封装 Cinder REST API。
- Cinder API:接收并解析用户请求,进行权限校验和资源管理。
- Cinder Scheduler:根据后端存储的容量和能力信息,调度卷的创建请求。
- Cinder Volume:实际执行卷操作的组件,通过驱动与后端存储交互。
- Cinder Backup:提供卷备份功能,支持备份到 Swift、Ceph 等存储。
- SQL Database :存储卷、快照、备份等元数据。

查看 Cinder 进程:
bash
[root@controller ~]# ps -e | grep cinder
1746 ? 00:00:03 cinder-schedule
1748 ? 00:00:04 cinder-api
1772 ? 00:00:03 cinder-backup
1791 ? 00:00:04 cinder-volume
查看支持的存储驱动:
bash
[root@controller drivers]# ls /usr/lib/python3.6/site-packages/cinder/volume/drivers
datera huawei lenovo nfs.py rbd.py storpool.py windows
dell_emc ibm linstordrv.py nimble.py remotefs.py stx zadara.py
...
后端存储与 LVM
Cinder 默认使用 LVM 作为后端存储。LVM 将物理存储资源组织为卷组(Volume Group),并在其上创建逻辑卷(Logical Volume),供虚拟机使用。
除了 LVM,Cinder 还支持 SAN、Ceph、NFS 以及多家厂商的存储设备。
实验环境中 LVM 配置示例:
bash
[root@controller ~]# vgdisplay cinder-volumes
VG Name cinder-volumes
VG Size <20.60 GiB
Free PE / Size 253 / 1012.00 MiB
Cinder 调度机制
Cinder Scheduler 使用过滤器(Filter)和权重计算器(Weigher)来选择最合适的后端存储节点。
常用过滤器包括:
- AvailabilityZoneFilter:按可用区筛选。
- CapacityFilter:按剩余容量筛选。
- CapabilitiesFilter:按存储特性筛选。
配置示例:
bash
[root@controller cinder]# vim cinder.conf
scheduler_default_filters = AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter
可用区实验验证:
bash
# 创建卷时指定可用区
[root@controller ~(keystone_admin)]# openstack volume create --size 1 --availability-zone az1 volume1
卷挂载流程
Cinder 与 Nova 协同完成卷的挂载:
- Nova 调用 Cinder API 创建卷,并传递主机信息。
- Cinder Volume 通过驱动通知存储设备允许主机访问卷。
- Nova 识别存储设备并将其映射到虚拟机。

OpenStack 对象存储:Swift
Swift 的作用与特点
Swift 是 OpenStack 的对象存储服务,适用于存储静态、非结构化的海量数据,如镜像、文档、备份等。Swift 采用分布式架构,无中心节点,具备高扩展性、高可靠性和数据持久性。

Swift 架构与 Ring 机制
Swift 使用 Ring 机制来管理数据的分布与冗余。Ring 是一个虚拟的哈希环,将数据对象映射到物理存储设备上。Swift 包含三种 Ring:
- Account Ring:管理账户信息。
- Container Ring:管理容器信息。
- Object Ring:管理对象信息。
Swift 实验部署
以下是在控制节点上部署 Swift 的基本步骤:
准备存储设备
添加新磁盘并分区:
bash
[root@controller ~]# fdisk /dev/sdb
[root@controller ~]# mkfs.xfs /dev/sdb1
[root@controller ~]# mkfs.xfs /dev/sdb2
配置挂载点
bash
[root@controller ~]# mkdir /srv/node/obs1 /srv/node/obs2
[root@controller ~]# vim /etc/fstab
/dev/sdb1 /srv/node/obs1 xfs defaults 0 0
/dev/sdb2 /srv/node/obs2 xfs defaults 0 0
[root@controller ~]# mount -a
创建 Swift Ring
bash
[root@controller swift]# swift-ring-builder account.builder create 12 2 1
[root@controller swift]# swift-ring-builder container.builder create 12 2 1
[root@controller swift]# swift-ring-builder object.builder create 12 2 1
添加设备到 Ring
bash
[root@controller swift]# swift-ring-builder account.builder add z1-192.168.108.10:6002/obs1 100
[root@controller swift]# swift-ring-builder account.builder add z2-192.168.108.10:6002/obs2 100
重平衡 Ring
bash
[root@controller swift]# swift-ring-builder account.builder rebalance
测试 Swift 存储




上传成功

上传文件到 Swift 容器后,可在两个存储目录中查看副本:
bash
[root@controller ~]# find /srv/node -name *.data
/srv/node/obs1/objects/317/0fe/.../1727591964.07735.data
/srv/node/obs2/objects/317/0fe/.../1727591964.07735.data
小结
Cinder 和 Swift 分别代表了 OpenStack 在块存储和对象存储方面的成熟解决方案。Cinder 通过统一的接口整合多种后端存储,为虚拟机提供灵活、高效的块设备服务;Swift 则以分布式、无中心的设计,实现了海量数据的高可靠存储。
在实际部署中,可根据业务需求选择合适的存储后端,并结合可用区、卷类型、副本策略等进行优化配置,以提升存储性能与可靠性。