【精品分享】OpenStack Cinder mutliattach技术探秘

简介:

OpenStack 作为开放的 Infrastracture as a Service云操作系统,支持业界各种优秀的技术,这些技术可能是开源免费的,也可能是商业收费的。 这种开放的架构使得 OpenStack 保持技术上的先进性,具有很强的竞争力,同时又不会造成厂商锁定(Lock-in)。 那 OpenStack 的这种开放性体现在哪里呢?一个重要的方面就是采用基于 Driver 的框架。

Cinder组件,存储节点支持多种 volume provider,包括 LVM, NFS, Ceph, GlusterFS,以及EMC, IBM等商业存储系统。cinder-volume为这些volume provider定义了统一的driver接口,volume provider只需要实现这些接口,就可以driver的形式即插即用到 OpenStack 中。

目前,Cinder只允许将卷连接到单个主机或实例。但是有时用户可能希望能够将相同的卷附加到多个实例。在多年的上游社区的努力后,终于在Queens版本发布了这个期待已久的功能。

案例需求

能够使同一块卷提供给不同的用户使用,卷本身可以是read-only的也可以是read/write。

场景

1fc9a370d9e7251b5e9516d0e84d1da894b6fdb3

云平台中的应用可能由多个虚拟机组成集群的方式提供,其中一台是active,一台是passive状态,若通过Cinder mutliattach方式连接卷,那么在active虚拟机宕机情况下,passive虚拟机可以直接变为active,由于两台虚拟机同时attach同一个Cinder卷,因此不需要进行数据同步,这样对于集群应用有很大的便利性。

如果没有mutliattach功能,那么用户就需要克隆原始卷并将克隆卷attach到第二个实例。这样做的缺点是操作复杂,而且对原始卷的更改都不会显示在克隆卷中。

问题描述

Cinder-client目前在detach()方法中只要求传入单个volume参数,这样从client端限制了主机可attach卷的数量,在外部的UI和内部组件的API上,也并没有支持multi-attach。

Nova组件在代码层面上限制主机attach的数量,在attach动作发生时,Nova会去检查改卷的状态,如果卷已经attach主机,那么就不能再attach其他主机。代码在nova/volume/cinder.py: check_attach()。

RO/RW情况分类

mutliattach RO:

能够以正常方式连接卷(读/写),然后以只读模式将该卷附加到另一台主机/服务器。问题在于,要求使用者(即Nova / KVM)知道如何在附加卷上设置只读模式和强制执行只读模式。

mutliattach RW:

能够像通常那样附加卷(读写访问权限),然后将该卷附加到另一个主机/服务器。 在这种情况下,多个attachment之间没有区别。它们都被视为独立项目,并且都是读写卷。

目前,所有后端卷都将以读写(RW)模式attach,包括boot from volume模式。用户可以使用两个新的Cinder策略打开或关闭该功能:

volume:multiattach

volume:multiattach_bootable_volume

实现方式

OpenStack’s multiattach Feature允许一个volume经iscsi/FC被attached到多个VM:

1、要启用将卷附加到多个主机或实例的功能,需要一个新的volume_attachment表来跟踪Cinder卷的每个attachment。 将从volume表(attached_host,instance_uuid,mountpoint,attach_time,attach_mode)迁移现有列到新的表。 volume_attachment表将具有一个id(称为attachment_id),用于跟踪每个卷的各个attachment。 调用Cinder API可返回的现有卷具有的attachment列表。 此attachment列表包含每个attachment的attachment_id。

2、attachment_id是Nova在发生detach动作时API传递给Cinder,因此Cinder知道要detach哪个attachment。 Cinder API将支持默认attachment_id为None,如果只有一个attachment,它将尝试分离。

3、执行分离(detach)动作时,如果Cinder没有获得attachment_id,并且该卷只有1个attachment,那么分离该attachment的动作成功。 如果该卷有多个attachment,则Cinder将返回Nova一个错误消息,指出该卷有多个attachment并需要attachment_id。

4.卷表将被更新为包含一个名为'multiattach的新列,该列是一个布尔标志,用于指示Cinder该卷可以/不能连接多于一次。Cinder API和Cinderclient将支持在卷附加时设置该布尔标志。

Nova组件

在Queens版本前,Nova尚未准备将单个Cinder卷附加到多个VM实例,即使卷本身允许该操作。默认情况下,libvirt假定所有磁盘都由一个guest虚拟机专用。如果要在实例之间共享磁盘,则需要在为该磁盘配置guest虚拟机XML时,通过设置磁盘的“可共享”标志来告诉libvirt。这样虚拟机管理程序不会尝试对磁盘进行独占锁定,并禁用所有I / O缓存,并且任何SELinux标签都允许所有域使用。

如果hypervisor层本身不支持mutliattach,Nova应该拒绝attach请求,但是使用当前的API是不可能做到对hypervisor支持性的检查。但是这可以通过用户配置策略规则来解决。 例如,运行的云平台不支持multiattach,假设hypervisor层是vmware,那么用户可以配置策略来禁用Cinder端的multiattach卷。

如果是混合云,用户在尝试将卷附加到多个实例时,如果该compute节点的virt驱动程序不支持multiattach的计算机上的实例,那么attach请求将失败,并且nova-compute调用attachment_delete将删除通过nova-api创建的attachment。

如果nova-api可以检查后端存储是否具备了mutliattach功能,那么用户可以通过API直接调用获取,但是Nova还没有该API,所以只能通过手动配置Cinder和尝试attach这两种方式。

9eaf889ec30cd876ed4123b6c7e72102a07278a9

配置命令

为了能够将卷附加到多个实例,需要在配置文件中将'multiattach'标志设置为'True'。

$ cinder type-create multiattach

$ cinder type-key multiattach set multiattach="<is> True"

要创建卷,需要使用之前创建的卷类型,如下所示:

$ cinder create <volume_size> --name <volume_name> --volume-type <volume_type_uuid>

详细配置可参考文档[3]

注意点

1、在Queens版本中,mutliattach实现了三种Driver:LVM,NetApp / SolidFire和Oracle ZFSSA。 可以查看驱动程序支持列表[4],了解其他驱动程序何时添加支持的更新。另外支持mutliattach的卷不支持加密。

2、mutliattach功能在 cinder microversion >= 3.50 版本可用,查看 stable/queens 的Cinder版本。

性能/安全性影响

1、可能的性能损失是在卷读取数据库对volume_attachment表的额外提取。 这是一个简单的外键表连接,并且是索引的。

2、在libvirt驱动程序中,磁盘被赋予一个共享的SELinux标签,因此磁盘不再具有sVirt SELinux隔离。

Horizon的更改

Horizon组件为了支持mutliattach所需的更改是:

1、当卷连接到多个主机时,改进Volumes表中Attached To列的格式。目前,该字段被设置为1,并且在连接多主机时不会缩放。

2、在卷创建对话框中添加一个新复选框,将卷标记为可共享多个实例。

3、修改“编辑卷attachment”对话框以允许将可共享卷附加到多个实例。

OpenStack基金会表示,新的SDS功能是云环境中最受欢迎的功能之一,该功能提供存储冗余。如果一个节点发生故障,另一个节点可接管并允许访问该卷。通常,有多台前端服务器连接到一台后端的高端服务器上,当一台前端服务器 down 掉,仍可以通过其他的前端服务器访问后端高端服务器。通过 Cinder的新功能,可以利用虚拟存储提供相同级别的高可用性,而不依赖昂贵的光纤通道存储阵列(共享存储)。


原文发布时间为:2018-09-5

本文作者:九小云

本文来自云栖社区合作伙伴“Linux宝库”,了解相关信息可以关注“Linux宝库”。

相关文章
|
7月前
|
存储 消息中间件 数据库
云计算|OpenStack|社区版OpenStack安装部署文档(八--- 存储服务cinder的安装部署---Rocky版)
云计算|OpenStack|社区版OpenStack安装部署文档(八--- 存储服务cinder的安装部署---Rocky版)
313 0
|
存储 Linux API
后端技术杂谈8:OpenStack架构设计
OpenStack 是开源云计算平台,支持多种虚拟化环境,并且其服务组件都提供了 API接口 便于二次开发。 OpenStack通过各种补充服务提供基础设施即服务 Infrastructure-as-a-Service (IaaS)的解决方案。
|
4月前
|
存储 Linux 调度
OpenStack如何支持虚拟化技术?
【8月更文挑战第21天】
266 0
|
3月前
|
存储 消息中间件 算法
深入解析OpenStack Cinder:块存储服务详解
本文介绍了OpenStack及其块存储服务Cinder。OpenStack是一个开源云计算管理平台,提供基础设施即服务(IaaS),核心服务包括计算、网络、存储等。Cinder主要用于为虚拟机提供持久性块存储,具备多种功能,如卷操作、备份、快照及与实例的交互等。此外,还详细介绍了Cinder的工作流程、命令行操作及不同存储插件的使用。
560 8
|
4月前
|
存储 固态存储 网络性能优化
OpenStack的块存储(Cinder)
【8月更文挑战第24天】
178 2
|
4月前
|
存储 API 调度
OpenStack核心组件Cinder
【8月更文挑战第4天】
211 9
|
7月前
|
存储 运维 Swift
openstack cinder、swift运维命令
Cinder是OpenStack的块存储服务,提供虚拟机块设备功能,包括卷的创建、挂载等。它由cinder-api、cinder-scheduler和cinder-volume三个组件构成,前者处理请求,中间者负责调度,后者执行卷管理。Swift是OpenStack的分布式对象存储服务,高可用、持久性,适用于大文件存储。Swift架构对称,无单点故障,提供类似文件系统的简单逻辑和高效读写。Cinder关注虚拟机层面的块存储,而Swift则提供对象存储服务。命令示例展示了如何使用cinder和openstack命令操作云硬盘和Swift容器。
174 0
|
存储 API 数据库
(八)Open Stack(M)---Cinder安装和配置
(八)Open Stack(M)---Cinder安装和配置
124 0
|
块存储
【Openstack】排错:Cinder创建云硬盘状态错误解决
Cinder创建云硬盘状态错误,配置服务器时钟同步
4508 0
【Openstack】排错:Cinder创建云硬盘状态错误解决
Openstack架构构建及详解(7)--Cinder组件
Openstack架构构建及详解(7)--Cinder组件
132 0