三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

OpenStack Cinder 全解:块存储架构、调度过滤器与卷管理实战指南

OpenStack Cinder 全解:块存储架构、调度过滤器与卷管理实战指南

OpenStack管理

摘要

本文全面介绍了OpenStack块存储服务Cinder的核心概念与架构。Cinder作为OpenStack的块存储组件,在虚拟机与物理存储设备之间提供逻辑存储卷的抽象层,支持多种后端存储技术(如LVM、SAN、Ceph等)。文章详细解析了Cinder的架构组成,包括Cinder API、Scheduler、Volume和Backup等核心服务,并通过实际配置示例展示了AvailabilityZoneFilter、CapacityFilter、CapabilitiesFilter等调度过滤器的原理与应用。同时,文章还涵盖了Cinder的部署模式、存储类型、持久化存储机制以及卷挂载流程,为OpenStack存储管理提供了完整的实践指导。

OpenStack块存储管理-cinder

cinder的配置文件位置:/etc/cinder

cinder的日志文件位置:/var/log/cidner

openstack存储类型

OpenStack持久化存储简介

Cinder作用

Cinder在虚拟机与具体存储设备之间引入了一层“逻辑存储卷”的抽象,Cinder本身不是一种存储技术,并没有实现对块设备的实际管理和服务

Cinder只是提供了一个中间的抽象层,为后端不同的存储技术,提供了统一的接口

不同的块设备服务厂商在Cinder中以驱动的形式实现上述接口与OpenStack进行整合

Cinder架构

•Cinder Client封装Cinder提供的rest接口,以CLI形式供用户使用。

•Cinder API对外提供rest API,对操作需求进行解析,对API进行路由寻找相应的处理方法。包含卷的增删改查(包括从源卷、镜像、快照创建)、快照增删改查、备份、volume type管理、挂载/卸载(Nova调用)等。

•Cinder Scheduler负责收集backend上报的容量、能力信息,根据设定的算法完成卷到指定cinder-volume的调度。

•Cinder Volume多节点部署,使用不同的配置文件、接入不同的backend设备,由各存储厂商插入driver代码与设备交互完成设备容量和能力信息收集、卷操作。

•Cinder Backup实现将卷的数据备份到其他存储介质(目前SWIFT/Ceph/TSM提供了驱动)。

•SQL DB提供存储卷、快照、备份、service等数据,支持MySQL、PG、MSSQL等SQL数据库。

查看控制节点cinder进程:

[root@controller ~]# ps -e | grep cinder1746? 00:00:03 cinder-schedule1748? 00:00:04 cinder-api1772? 00:00:03 cinder-backup1791? 00:00:04 cinder-volume2812? 00:00:00 cinder-backup2931? 00:00:00 cinder-volume2959? 00:00:00 cinder-api2961? 00:00:00 cinder-api2964? 00:00:00 cinder-api2967? 00:00:00 cinder-api

查看cinder-volume默认支持的存储设备:

[root@controller ~]# cd /usr/lib/python3.6/site-packages/cinder/volume/drivers/[root@controller drivers]# lsdatera huawei lenovo nfs.py rbd.py storpool.py windows dell_emc ibm linstordrv.py nimble.py remotefs.py stx zadara.py fujitsu infinidat.py lvm.py prophetstor rsd.py synology fusionstorage infortrend macrosan pure.py san veritas_access hedvig __init__.py nec __pycache__ sandstone veritas_cnfs.py hitachi inspur netapp qnap.py solidfire.py vmware hpe kaminario nexenta quobyte.py spdk.py vzstorage.py

Cinder架构说明

•Cinder默认使用LVM(Logical Volume Manager)作为后端存储(Backend Storage),而LVM通过在操作系统与物理存储资源之间引入逻辑卷(Logical Volume)的抽象来解决传统磁盘分区管理工具的问题。

•LVM将众多不同的物理存储资源(物理卷、Physical Volume,如磁盘分区)组成卷组。LVM从卷组中创建一个逻辑卷,然后将ext3、ReiserFS等文件系统安装在这个逻辑卷上。

•除了LVM,目前Cinder已经以驱动的形式支持众多存储技术或存储厂商的设备作为后端存储,如SAN(Storage Area Network)、Ceph、Sheepdog,以及EMC、华为等厂商的设备。

实验环境后端存储就是LVM(安装时决定的):

[root@controller ~]# vim answers.txt536CONFIG_CINDER_BACKEND=lvm544CONFIG_CINDER_VOLUMES_CREATE=y547CONFIG_CINDER_VOLUME_NAME=cinder-volumes554CONFIG_CINDER_VOLUMES_SIZE=20G

实验环境查看:

[root@controller ~]# vgdisplay cinder-volumes--- Volume group --- VG Name cinder-volumes System ID Format lvm2 Metadata Areas1Metadata Sequence No8VG Access read/write VG Status resizable MAX LV0Cur LV1Open LV0Max PV0Cur PV1Act PV1VG Size<20.60GiB PE Size4.00MiB Total PE5273Alloc PE / Size5020/<19.61GiB Free PE / Size253/1012.00MiB VG UUID ODOHA8-u2MO-RAtc-y43r-1r1u-PIn8-XOFuhi

Cinder架构部署:以SAN存储为例

  • Cinder-api,Cinder-Scheduler,Cinder-Volume可以选择部署到一个节点上,也可以分别部署
  • API采用AA模式,HAproxy作为LB,分发请求到多个Cinder API
  • Scheduler也采用AA模式,由rabbitmq以负载均衡模式向3个节点分发任务,并同时从rabbitmq收取Cinder volume上报的能力信息,调度时,scheduler通过在DB中预留资源从而保证数据一致性
  • Cinder Volume也采用AA模式,同时上报同一个backend容量和能力信息,并同时接受请求进行处理
  • RabbitMQ,支持主备或集群
  • MySQL,支持主备或集群

Cinder-api

Cinder API

  • 检查参数合法性(用户输入,权限,资源是否存在等)
  • 准备创建的参数字典,预留和提交配额
  • 在数据库中创建对应的数据记录
  • 通过消息队列将请求和参数发送到Scheduler

查看cinder API服务状态:

[root@controller ~]# systemctl status openstack-cinder-api.service● openstack-cinder-api.service - OpenStack Cinder API Server Loaded: loaded(/usr/lib/systemd/system/openstack-cinder-api.service;enabled;vendor preset: disabled)Active: active(running)since Fri2024-09-27 09:44:47 CST;1h 7min ago Main PID:1748(cinder-api)Tasks:5(limit:100416)Memory:501.2M CGroup: /system.slice/openstack-cinder-api.service ├─1748 /usr/bin/python3 /usr/bin/cinder-api --config-file /usr/share/cinder/cinder-dist.conf --config-file /etc/cinder/cinder.conf--logfile/>├─2959 /usr/bin/python3 /usr/bin/cinder-api --config-file /usr/share/cinder/cinder-dist.conf --config-file /etc/cinder/cinder.conf--logfile/>├─2961 /usr/bin/python3 /usr/bin/cinder-api --config-file /usr/share/cinder/cinder-dist.conf --config-file /etc/cinder/cinder.conf--logfile/>├─2964 /usr/bin/python3 /usr/bin/cinder-api --config-file /usr/share/cinder/cinder-dist.conf --config-file /etc/cinder/cinder.conf--logfile/>└─2967 /usr/bin/python3 /usr/bin/cinder-api --config-file /usr/share/cinder/cinder-dist.conf --config-file /etc/cinder/cinder.conf--logfile/>Sep2709:44:47 controller systemd[1]: Started OpenStack Cinder API Server.

Cinder-scheduler

•和Nova Scheduler类似,Cinder Scheduler也是经过Filter筛选符合条件的后端,然后使用Weigher计算后端进行权重排序,最终选择出最合适的后端存储。

Cinder Scheduler服务

提取接收到的请求参数

通过配置的filter和输入参数对后端进行过滤

Availability_zone_filter

Capacity_filter

Capabilities_filter

Affinity_filter(SameBackendFilter/DifferentBackendFilter)

……

Weigher计算后端进行权重

CapacityWeigher/AllocatedCapacityWeigher

ChanceWeigher

GoodnessWeigher

……

选取最优的Backend并通过消息队列将请求发送到指定的后端

查看配置文件:

[root@controller ~]# cd /etc/cinder/[root@controller cinder]# lsapi-paste.ini cinder.conf resource_filters.json rootwrap.conf rootwrap.d volumes[root@controller cinder]# vim cinder.conf592#scheduler_default_filters = AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter593595#scheduler_default_weighers = CapacityWeigher596601# Default scheduler driver to use (string value)602#scheduler_driver = cinder.scheduler.filter_scheduler.FilterScheduler
AvailabilityZoneFilter

为提高容灾性和提供隔离服务,可以将存储节点和计算节点划分到不同的 Availability Zone 中。例如把一个机架上的机器划分在一个 Availability Zone 中。OpenStack 默认有一个命名为“nova”的 Availability Zone,所有的节点初始都是放在“nova”中。用户可以根据需要创建自己的 Availability Zone。

创建 Volume 时,用户会指定 Volume 的大小。CapacityFilter 的作用是将存储空间不能满足 Volume 创建需求的存储节点过滤掉。

配置cinder配置文件cinder.conf

[root@controller ~]# cd /etc/cinder/[root@controller cinder]# lsapi-paste.ini cinder.conf resource_filters.json rootwrap.conf rootwrap.d volumes[root@controller cinder]# vim cinder.conf592scheduler_default_filters=AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter#该配置文件的节点的AZ设置为az1395storage_availability_zone=az1#创建卷时,不指定az默认使用nova AZ401default_availability_zone=nova[root@controller cinder]# systemctl restart openstack-cinder*

验证AZ实验:

#cinder.conf配置文件配置401 default_availability_zone=nova,创建卷时不指定AZ则使用nova AZ,而该节点属于az1 AZ,创建失败[root@controller ~]# source keystonerc_admin[root@controller ~(keystone_admin)]# openstack volume create --size 1 volume1Availability zone'nova'is invalid.(HTTP400)(Request-ID: req-c4e2d4d1-d299-4267-b2a1-22fcd676a6ea)#cinder配置文件配置395 storage_availability_zone=az1,该节点属于AZ az1节点,创建AZ az2卷,被AvailabilityZoneFilter过滤[root@controller ~(keystone_admin)]# openstack volume create --size 1 --availability-zone az2 volume1Availability zone'az2'is invalid.(HTTP400)(Request-ID: req-749dad9d-d5fb-4122-95aa-ab03d0c5a955)#cinder配置文件配置395 storage_availability_zone=az1,该节点属于AZ az1节点,创建AZ az1卷,创建成功[root@controller ~(keystone_admin)]# openstack volume create --size 1 --availability-zone az1 volume1+---------------------+--------------------------------------+|Field|Value|+---------------------+--------------------------------------+|attachments|[]||availability_zone|az1||bootable|false||consistencygroup_id|None||created_at|2024-09-27T06:02:35.368543||description|None||encrypted|False||id|43746d03-a0c5-4232-8f1b-6023ffe83545||migration_status|None||multiattach|False||name|volume1||properties|||replication_status|None||size|1||snapshot_id|None||source_volid|None||status|creating||type|iscsi||updated_at|None||user_id|7ef9147a8abe485889ece90dce340ab1|+---------------------+--------------------------------------+
CapacityFilter

创建 Volume 时,用户会指定 Volume 的大小。CapacityFilter 的作用是将存储空间不能满足 Volume 创建需求的存储节点过滤掉。

CapabilitiesFilter

不同的 Volume Provider 有自己的特性(Capabilities),比如是否支持 thin provision 等。Cinder 允许用户创建 Volume 时通过 Volume Type 指定需要的 Capabilities。

创建卷的时候,卷类型指定为iscsi,那么后端使用的是LVM,为何?

由卷类型,扩展规格决定

接下来查看配置文件:

[root@controller ~(keystone_admin)]# vim /etc/cinder/cinder.conf5261[lvm]5262volume_backend_name=lvm5263volume_driver=cinder.volume.drivers.lvm.LVMVolumeDriver5264target_ip_address=192.168.108.105265target_helper=lioadm5266volume_group=cinder-volumes5267volumes_dir=/var/lib/cinder/volumes

Cinder-volume

Cinder Volume服务

  • 提取接收到的请求参数
  • 调用对应的Driver在后端创建实际的卷
  • 使用Driver返回的模型更新数据库中的记录
Cinder挂载流程

挂卷流程: 挂卷是通过Nova和Cinder的配合最终将远端的卷连接到虚拟机所在的Host节点上,并最终通过虚拟机管理程序映射到内部的虚拟机中

•Nova调用Cinder API创建卷,传递主机的信息,如hostname,iSCSI initiator name,FC WWPNs。

•Cinder API将该信息传递给Cinder Volume。

•Cinder Volume通过创建卷时保存的host信息找到对应的Cinder Driver。

•Cinder Driver通知存储允许该主机访问该卷,并返回该存储的连接信息(如iSCSI iqn,portal,FC Target WWPN,NFS path等)。

•Nova调用针对于不同存储类型进行主机识别磁盘的代码( Cinder 提供了brick模块用于参考)实现识别磁盘或者文件设备。

•Nova通知Cinder已经进行了挂载。

•Nova将主机的设备信息传递给hypervisor来实现虚拟机挂载磁盘。

← 返回列表