首页 / 资讯中心 / 文章详情

OpenStack 块存储管理:Cinder 是怎么把一块卷交给虚拟机的?

OpenStack 块存储管理:Cinder 是怎么把一块卷交给虚拟机的? ★ FEATURED ARTICLE
给虚拟机加一块「永不丢数据」的盘靠的是 Cinder。这篇按一条主线走存储类型怎么分 → Cinder 到底是什么 → 五个组件怎么分工 → 一块卷从创建到挂进虚拟机经过哪几站 → 实验环境的 LVM 后端长什么样。全部内容对着一套192.168.108.10controller compute的 packstack 环境核实过配置行、报错、卷组名都能直接对号入座。文中命令名均标注英文全称完整清单见文末《附命令英文全称速查表》。本文概要项目内容文章主题Cinder 的定位、五组件架构、创建卷与挂卷全流程、LVM 后端落地所属类别云计算 → 私有云平台 → OpenStack 块存储管理知识关键字Cinder·cinder-api·cinder-scheduler·cinder-volume·Filter/Weigher·cinder-volumes·LVM·iSCSI主线的因果只有一条Cinder 自己不是存储它只是「逻辑存储卷」这一层抽象真正存数据的永远是它身后的 LVM、Ceph、SAN 这些后端。所以先把「谁管哪类存储」摆正再看组件怎么分工最后跟着一块卷走完创建和挂载的全程。一、先摆正存储类型临时存储与持久存储从数据保存时间的角度OpenStack 的存储分两类类型谁提供数据命运典型例子临时存储 EphemeralNova实例关机、重启、删除后数据即丢失实例里第一块 10 GB 系统盘持久存储 PersistentCinder / Manila / Swift生命周期独立于实例实例终止数据还在云硬盘、镜像、备份三个关键点只部署 Nova 时默认分配给虚拟机的磁盘就是临时的——虚拟机终止存储空间跟着释放临时存储默认以文件形式放在计算节点的本地磁盘上持久存储三兄弟按「速度 / 容量」背口径块存储Cinder快而小、文件存储Manila中等、对象存储Swift慢而海量——对应跑车、卡车、货轮。文件存储的访问协议是NFS / CIFS对象存储直接用REST API访问对象名就是一个域名地址。⚠️注意三种存储的归属是高频考点——块存储是 Cinder不是 Swift文件存储是 Manila别答成 Swift。Swift 存的是对象虚拟机镜像、图片、备份归档这类静态数据。二、Cinder 的定位抽象层不是存储技术Cinder 首次出现在 OpenStack 的Folsom版本依赖Keystone认证服务。它的定位三句话在虚拟机与具体存储设备之间引入了一层「逻辑存储卷」的抽象——Cinder 本身不是一种存储技术并没有实现对块设备的实际管理和服务它只提供中间抽象层为后端不同的存储技术提供统一的接口不同的块设备厂商华为、EMC、NetApp、Ceph……在 Cinder 中以驱动driver的形式实现这套接口从而被 OpenStack 整合管理。和其他服务的交互关系也很简单Nova创建虚拟机时Cinder 给实例提供持久化块存储Cinder 创建的卷备份可以存到Swift所有操作都先过Keystone认证。三、架构五组件谁收请求、谁挑后端、谁真正落盘组件一句话职责展开说cinder-api对外提供 REST API解析操作需求卷的增删改查含从源卷、镜像、快照创建、快照增删改查、备份、volume type 管理、挂载/卸载由 Nova 调用cinder-scheduler收集后端上报的容量与能力信息完成卷到 cinder-volume 的调度与 nova-scheduler 同款思路Filter 筛选 Weigher 权重cinder-volume多节点部署调 Driver 在后端真正执行卷操作使用不同配置文件接入不同后端用 Driver 返回的模型更新数据库cinder-backup把卷的数据备份到其他存储介质目前Swift / Ceph / TSM提供了驱动SQL DB存卷、快照、备份、service 等数据支持 MySQL、PG、MSSQL 等配置文件与日志的位置也要记[rootcontroller ~]# ls /etc/cinder # cinder 的配置文件目录api-paste.ini cinder.conf resource_filters.json rootwrap.conf rootwrap.d volumes[rootcontroller ~]# systemctl status openstack-cinder-api.service● openstack-cinder-api.service - OpenStack Cinder API Server Active: active(running)...# 中文服务运行中[rootcontroller ~]# ps -e | grep cinder # 中文列出进程并过滤 cinder1746? 00:00:03 cinder-schedule1748? 00:00:04 cinder-api1772? 00:00:03 cinder-backup1791? 00:00:04 cinder-volume控制节点上 api、scheduler、volume、backup 四个进程同时在跑排查问题先看/var/log/cinder/下对应组件的日志。四、创建卷全流程api 查参数 → scheduler 挑后端 → volume 落盘4.1 cinder-api四件事检查参数合法性——用户输入、权限、资源是否存在准备创建的参数字典预留和提交配额在数据库中创建对应的数据记录通过消息队列把请求和参数发给 Scheduler。4.2 cinder-schedulerfilter 过滤 weigher 权重调度分两步和 nova-scheduler 一脉相承Filter过滤干什么AvailabilityZoneFilter不属于指定可用分区AZ的后端直接刷掉CapacityFilter存储空间满足不了卷大小的后端刷掉CapabilitiesFilter不支持卷类型所需特性如 thin provision的后端刷掉Affinity_filter同后端亲和SameBackendFilter/ 反亲和DifferentBackendFilterWeigher权重干什么CapacityWeigher/AllocatedCapacityWeigher按容量/已分配容量打分默认ChanceWeigher随机打分GoodnessWeigher按优良度打分默认配置/etc/cinder/cinder.conf里这三行就是开关#scheduler_default_filters AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter # 默认启用的过滤器注释状态 #scheduler_default_weighers CapacityWeigher # 默认权重算法注释状态 #scheduler_driver cinder.scheduler.filter_scheduler.FilterScheduler # 默认调度器注释状态选中最优后端后Scheduler 再经消息队列把请求发给对应的 cinder-volume。4.3 cinder-volume三件事 一件长期任务提取接收到的请求参数调用对应的 Driver 在后端创建实际的卷使用 Driver 返回的模型更新数据库中的记录。长期任务是第 4 件定期收集后端的容量、能力信息上报让 Scheduler 内存里的 Backend 信息保持新鲜——这是后面所有调度判断的数据来源。4.4 AZ 实验一条报错看懂 AvailabilityZoneFilter把存储节点的 AZ 改成az1后建卷三种写法三种命[rootcontroller ~(keystone_admin)]# openstack volume create --size 1 volume1Availability zonenovais invalid.(HTTP400)# 中文可用域 nova 无效——cinder.conf 里 default_availability_zonenova# 建卷不指定 AZ 就落到 nova而节点在 az1被 AvailabilityZoneFilter 拦下[rootcontroller ~(keystone_admin)]# openstack volume create --size 1 --availability-zone az2 volume1Availability zoneaz2is invalid.(HTTP400)# 中文可用域 az2 无效——没有任何后端在 az2同样被过滤[rootcontroller ~(keystone_admin)]# openstack volume create --size 1 --availability-zone az1 volume1---------------------------------------------------------|Field|Value|---------------------------------------------------------|availability_zone|az1||size|1||status|creating||type|iscsi|---------------------------------------------------------# 中文指定 az1 才创建成功type 显示 iscsi 是由卷类型的扩展规格决定的相关配置两行storage_availability_zoneaz1 # 该存储节点所属的 AZ default_availability_zonenova # 建卷不指定 AZ 时默认落到的 AZ改完记得systemctl restart openstack-cinder*重启生效。五、挂卷流程Nova 和 Cinder 打配合挂卷的本质把远端的卷连接到虚拟机所在的 Host 节点再由虚拟机管理程序映射进虚拟机。六步Nova 调用 Cinder APIattach传递主机信息——hostname、iSCSI initiator name、FC WWPNsCinder API 把信息传给Cinder VolumeCinder Volume 按建卷时保存的 host 信息找到对应的 Cinder DriverCinder Driver 通知存储放行该主机访问该卷并返回连接信息——如 iSCSI iqn、portalFC Target WWPNNFS pathNova 调用识别磁盘的代码Cinder 提供 brick 模块作参考在主机上识别出磁盘或文件设备Nova 通知 Cinder 已挂载再把主机设备信息交给hypervisor映射进虚拟机——虚拟机里出现/dev/vdb这样的块设备状态从 available 变in-use。以 iSCSI 为例串一遍底层视角计算节点是iSCSI initiator发起端存储端是iSCSI target目标端卷数据经 Storage Controller 交给 KVM。Cinder 支持 FC、NFS 等多种协议流程骨架不变。六、实验环境的后端LVM 与 cinder-volumes 卷组Cinder 默认使用LVMLogical Volume Manager逻辑卷管理作为后端存储。LVM 的思路是把物理卷PV如磁盘分区组成卷组VG再从卷组里切出**逻辑卷LV**挂文件系统——这正是「逻辑存储卷」抽象的最朴素实现。除 LVM 外Cinder 已以驱动形式支持 SAN、Ceph、Sheepdog 及华为、EMC 等厂商设备。实验环境的后端是安装时定死的answers.txt里留了案底CONFIG_CINDER_BACKENDlvm # 后端选了 lvm CONFIG_CINDER_VOLUMES_CREATEy # 安装时自动创建卷组 CONFIG_CINDER_VOLUME_NAMEcinder-volumes # 卷组名 CONFIG_CINDER_VOLUMES_SIZE20G # 卷组大小验收就一条命令[rootcontroller ~]# vgdisplay cinder-volumes # 中文查看卷组 cinder-volumes 的信息--- Volume group --- VG Name cinder-volumes VG Size20.60GiB Alloc PE / Size5020/19.61GiB Free PE / Size253/1012.00MiB而[lvm]段的完整定义在/etc/cinder/cinder.conf尾部[lvm] volume_backend_namelvm # 后端名字卷类型靠它认后端 volume_drivercinder.volume.drivers.lvm.LVMVolumeDriver # 驱动类 target_ip_address192.168.108.10 # iSCSI target 地址 target_helperlioadm # target 管理工具 volume_groupcinder-volumes # 用的卷组 volumes_dir/var/lib/cinder/volumes # 卷信息目录⚠️注意卷类型volume type与后端的绑定靠扩展规格里的volume_backend_name——建卷时指定卷类型 iscsi实际落到的就是volume_backend_namelvm的这个后端。「卷类型指定 iscsi 为什么用的是 LVM」的答案就这一句由卷类型的扩展规格决定。多后端比如再加 NFS的接法见姊妹篇《OpenStack 存储管理实操卷类型 QoS、卷全生命周期与 NFS 第二后端》。附命令英文全称速查表命令英文全称含义cinderCinder块存储服务名本文主角openstack volume createvolume / create卷 / 创建--sizesize卷大小GiB--availability-zoneavailability zone可用分区ps -eprocess status / every进程状态 / 所有进程grepglobal regular expression print全局正则匹配过滤systemctl statussystem control / status系统服务管理 / 查看状态vgdisplayvolume group display显示 LVM 卷组信息LVMLogical Volume Manager逻辑卷管理PV / VG / LVPhysical / Volume Group / Logical Volume物理卷 / 卷组 / 逻辑卷iSCSIInternet Small Computer System Interface基于 IP 的 SCSI 传输协议initiator / target发起端 / 目标端iSCSI 两端角色RESTRepresentational State Transfer表述性状态转移API 风格MQMessage Queue消息队列
阅读完成 · 觉得有帮助?
咨询建站