Nova AZ与Cinder AZ同步的问题

AlgoCraftsman
• 阅读 5099

1.背景

在使用OpenStack云平台时,有时因业务架构需要拆分不同的Availability Zone可用域,包括计算Nova和存储Cinder,并期望可以将两个AZ对应起来以便起到隔离的效果。目前多数OpenStack平台或多或少采用了Ceph作为Cinder存储后端(以及Glance、Swift),并在创建虚拟机时选择从镜像创建块存储。我们希望可以通过创建不同的Cinder AZ配置不同的Ceph pool,每个pool关联不同的osd,已便达到不同用户创建的虚拟机操作系统磁盘在Ceph集群中是完全隔离的。

2.问题

首先我们启动多个cinder-volume实例,配置不同的storage_availalibility_zone,期望效果是选择虚拟机的AZ时可以匹配Cinder里的AZ,例如:

storage_availability_zone=AZ1

然而实际情况并不理想,在创建虚拟机时,选择了Nova的AZ(比如AZ1),创建出来的卷却在Cinder的nova可用域里,因为Cinder的默认域是nova,最终结果并没有匹配上。实际上,nova在调用cinder的时候并未把虚拟机实例的availalibility_zone的值传过去。

3.解决

查看源码/usr/lib/python2.7/site-packages/nova/conf/cinder.py中的设定,发现一个关键参数cross_az_attach,默认值为True,这意味着虚拟机的磁盘可以跨域绑定。

cfg.BoolOpt('cross_az_attach',
            default=True,
            help="""
Allow attach between instance and volume in different availability zones.

If False, volumes attached to an instance must be in the same availability
zone in Cinder as the instance availability zone in Nova.
This also means care should be taken when booting an instance from a volume
where source is not "volume" because Nova will attempt to create a volume using
the same availability zone as what is assigned to the instance.
If that AZ is not in Cinder (or allow_availability_zone_fallback=False in
cinder.conf), the volume create request will fail and the instance will fail
the build request.
By default there is no availability zone restriction on volume attach.
"""),
]

顺藤摸瓜,继续查看/usr/lib/python2.7/site-packages/nova/virt/block_device.py,发现如果cross_az_attach为True,则传给Cinder的availability_zone为空!!!如果cross_az_attach为False,那么nova会给Cinder传递实例的availability_zone。

def _get_volume_create_az_value(instance):
    """Determine az to use when creating a volume

    Uses the cinder.cross_az_attach config option to determine the availability
    zone value to use when creating a volume.

    :param nova.objects.Instance instance: The instance for which the volume
        will be created and attached.
    :returns: The availability_zone value to pass to volume_api.create
    """
    # If we're allowed to attach a volume in any AZ to an instance in any AZ,
    # then we don't care what AZ the volume is in so don't specify anything.
    if CONF.cinder.cross_az_attach:
        return None
    # Else the volume has to be in the same AZ as the instance otherwise we
    # fail. If the AZ is not in Cinder the volume create will fail. But on the
    # other hand if the volume AZ and instance AZ don't match and
    # cross_az_attach is False, then volume_api.check_attach will fail too, so
    # we can't really win. :)
    # TODO(mriedem): It would be better from a UX perspective if we could do
    # some validation in the API layer such that if we know we're going to
    # specify the AZ when creating the volume and that AZ is not in Cinder, we
    # could fail the boot from volume request early with a 400 rather than
    # fail to build the instance on the compute node which results in a
    # NoValidHost error.
    return instance.availability_zone

一切都清楚了,接下来配置nova.conf文件,在Cinder部分添加参数

cross_az_attach = False

再次创建虚拟机,发现Nova的AZ和Cinder的AZ对应上啦,解决!

4.More..

在Cinder中还有个参数是allow_availability_zone_fallback,目的是为了防止创建虚拟机时的Nova AZ在Cinder中不存在时不报错,而是使用Cinder中default_availability_zone或者storage_availability_zone进行创建。代码在/usr/lib/python2.7/site-packages/cinder/volume/flows/api/create_volume.py中

if availability_zone not in self.availability_zones:
            if CONF.allow_availability_zone_fallback:
                original_az = availability_zone
                availability_zone = (
                    CONF.default_availability_zone or
                    CONF.storage_availability_zone)
                LOG.warning(_LW("Availability zone '%(s_az)s' "
                                "not found, falling back to "
                                "'%(s_fallback_az)s'."),
                            {'s_az': original_az,
                             's_fallback_az': availability_zone})
            else:
                msg = _("Availability zone '%(s_az)s' is invalid.")
                msg = msg % {'s_az': availability_zone}
                raise exception.InvalidInput(reason=msg)

但是目测这个参数和cross_az_attach有冲突,因为使用cross_az_attach的情况下选择一个Cinder里没有的但是Nova中含有的AZ,创建结果还是失败的,最终会以cross_az_attach作为判断。

5.参考文献

【1】https://www.mirantis.com/blog...
【2】https://wenku.baidu.com/view/...

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
4年前
java标识符命名规则,修饰符,关键字。
一,标识符1.标识符概念:用来表示类名,变量名,方法名,类型名,数组名,文件名的有效字符序列称为标识符。关于Java标识符,有以下几点需要注意:所有的标识符都应该以字母(AZ或者az),美元符($)、或者下划线(\_)开始首字符之后可以是字母(AZ或者az),美元符($)、下划线(
Stella981 Stella981
4年前
Azure Az
结合最近所做的模拟题,把一些容易考的知识和概念重新回顾记录一下。标红的字要注意一下,有可能这几个简单的字,就是最能概括这个概念的关键点,个人在回顾的时候把这些点红色标出来了,会在题干中以不同的案例形式来考察,但是这些考察的关键字还是能找到的!有条件的建议打印下来学习,我是官方文档一点一点总结的,考点非常全面,目前为止AZ900的路程就走完了,文章结尾附上证
Stella981 Stella981
4年前
OpenStack监控测量服务Ceilometer安装及 API说明
1.Ceilometer是做什么的Ceilometer是OpenStack中的一个子项目,它像一个漏斗一样,能把OpenStack内部发生的几乎所有的事件都收集起来,然后为计费和监控以及其它服务提供数据支撑。Ceilometer的核心架构图!(http://static.oschina.net/uploads/img/2015
Stella981 Stella981
4年前
MariaDB Galera Cluster 部署(如何快速部署MariaDB集群)
MariaDB作为Mysql的一个分支,在开源项目中已经广泛使用,例如大热的openstack,所以,为了保证服务的高可用性,同时提高系统的负载能力,集群部署是必不可少的。MariaDBGaleraCluster介绍MariaDB集群是MariaDB同步多主机集群。它仅支持XtraDB/InnoDB存储引擎(虽然有对MyISAM实验支持
Stella981 Stella981
4年前
OpenStack
1.OpenStack示例的架构介绍1.1各节点介绍(1)控制节点(controller)控制节点(controller)上运行身份服务,镜像服务,计算节点管理,网络管理,各种网络代理和仪表板。它还包括支持服务,如SQL数据库,消息队列和NTP。可选地,控制器节点运行块存储,对象存储,编排和遥测服务的部分。注:计算节点上需要至少配置两
Stella981 Stella981
4年前
OpenStack块存储nova
对swift对象存储的内部原理和相关技术可以查找对象存储、一致性哈希等文章,新浪有几篇技术分享介绍的很好,推荐看一看。一、相关概念LVM存储常用术语物理存储介质(PhysicalMedia):物理存储设备,如磁盘或者磁盘上的分区,是存储系统的最底层实体。物理卷(PV,PhysicalVolume):硬盘分区或从逻
Wesley13 Wesley13
4年前
CEPH总结
ceph简介Ceph是一个分布式存储系统,诞生于2004年,是最早致力于开发下一代高性能分布式文件系统的项目。随着云计算的发展,ceph乘上了OpenStack的春风,进而成为了开源社区受关注较高的项目之一。ceph基本结构!(http://uploadimages.jianshu.io/upload_images/4
Stella981 Stella981
4年前
OpenStack代码贡献初体验
 OpenStack如今已成为开源云平台中的明星项目,得到广泛关注。OpenStack的优秀出众依赖于众多开发者的努力,在享受其带来的便利与快捷的同时,为其做一份贡献也是一个开发者的义务。 在前段时间的OpenStack的测试过程中,我发现Nova项目中的一个Bug,于是向社区提交了Bug报告,并提交代码修复了该Bug,从提交报告到代码入库经历近一月,下面
Stella981 Stella981
4年前
OpenStack Train版 简单部署流程(2)
cindercontrollernode1.条件设置1.创库授权CREATEDATABASEcinder;GRANTALLPRIVILEGESONcinder.TO'cinder'@'localhost'IDENTIFIEDBY'CINDER_DBPASS';
浅谈OpenStack(一)
OpenStack刚开始只有nova(计算)和swift(存储)两个核心组件,尤其是nova,几乎负责了云主机生命周期的所有操作,包括cpu、内存、磁盘、网络等,后来随着功能越来越多,项目越来越庞大,社区才把镜像管理(novaimage)服务、存储管理(novavolume)服务、网络管理(novanetwork)服务等独立出来,于是有了glance、cinder、neutron等服务。在OpenStack里有两个概念:组件和服务。我们把每个完成独立功能的项目称为一个组件,比如nova、cinder、glance、neutron。每个组件里会细分很多个服务,用来承担不同的职责,比如nova里会有novaapi服务,负责api请求的处理;novascheduler服务负责宿主机的调度;novacompute服务负责与虚拟化软件进行交互,来操作云主机。
OpenStack基本介绍
OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单,可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。
AlgoCraftsman
AlgoCraftsman
Lv1
我也怕你会在我看不见的地方陪着别人.
文章
3
粉丝
0
获赞
0