您当前的位置: 首页 > 

凌云时刻

暂无认证

  • 0浏览

    0关注

    1437博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

凌云时刻 发布时间:2018-09-05 11:52:14 ,浏览量:0

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。

场景

云平台中的应用可能由多个虚拟机组成集群的方式提供,其中一台是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这两种方式。

配置命令

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

$ cinder type-create multiattach

$ cinder type-key multiattach set multiattach=" True"

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

$ cinder create --name --volume-type

详细配置可参考文档[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的新功能,可以利用虚拟存储提供相同级别的高可用性,而不依赖昂贵的光纤通道存储阵列(共享存储)。

参考文献

[1],https://specs.openstack.org/openstack/nova-specs/specs/queens/implemented/multi-attach-volume.html

[2],https://wiki.openstack.org/wiki/Cinder/blueprints/multi-attach-volume

[3],https://www.sunmite.com/openstack/cinder-multi-attch.html

[4],https://wiki.openstack.org/wiki/CinderSupportMatrix

>>  关于作者:九州云(99Cloud.Inc)成立于2012年,是中国早期从事OpenStack和相关开源服务的专业公司。公司成立六年,秉承“开源 · 赋能变革”的理念,已经从单一的OpenStack产品提供商,发展成为涵盖云核心、云运营、云运维和云安全等多个领域的开源软件和服务提供商。九州云已支持了国家电网、中国人民银行、中国银联、中国移动、中国电信、中国联通、中国资源卫星、中航信(航旅纵横)、eBay、国际陆港集团、中国人寿、万达信息、东风汽车、诺基亚等重量级客户。

> >  关于『 Linux宝库 』:欢迎关注『Linux宝库』微信公众号,这里每天发布最新的开源人物和开源事件。谨以此号记录Linux和开源业界的点点滴滴,为开源爱好者和从业者点亮人生。

- END -

- 责任编辑:RAY MAN -

为开源爱好者和从业者点亮人生!

长按二维码关注我们

关注
打赏
1663816507
查看更多评论
立即登录/注册

微信扫码登录

0.2284s