1 目标

1. 为了增加横向扩展以及分布式,大规模(地理位置级别)部署能力,但又不增加数据库和消息中间件的复杂度
2. 将cell调度和主机调度隔离

2 简介

我们都熟悉Amazon EC2,他有一些基本概念:

》一个地理区域(Region)包含多个可用区域(Availability Zone)
 》Availability Zone相互之间物理隔离,一个Availability Zone的故障不会影响其他的使用
 》客户端连接Region
 》创建VM时,如果没有指定Availability Zone,调度算法会从Region中选择一个
 》相反,如果指定了Availability Zone,则在其上创建VM

 OpenStack从B版就基于Amazon的这种概念实现了Availability Zone。然后,又出现了Zone的概念:
 》一个Zone就是一套独立的Nova部署环境
 》Zone之间无共享,相互隔离
 在D版,当出现Keystone之后,Zone的概念就被废弃掉了

 而在G版,重新提出了”Cell”的概念,Cell之间的通信的可信的,基于AMQP协议。概括如下:
 》每一个Cell中拥有独立的DB和AMQP broker
 》引入新的nova-cell服务
 -消息路由
 -调度(与主机调度不同,子Cell通过定时刷新将自己能力和资源上报给父Cell)
 》cell之间通信通过RPC
 》cells之间是树状结构
 -顶层是API cell,不感知底层物理主机以及虚拟化
 -子cell无nova-api服务
 -子cell无quota概念(NoopQuota)

3 服务部署



在API cell节点要部署nova-api对外提供统一服务,nova-cell负责与子cell之间通信;子cell节点统一要部署nova-cell,如果子cell直接接入虚拟化层,则还要部署nova-scheduler,nova-compute。消息通信如下:


上图是三个cell级联的情况,其中API Cell收到请求后,通过nova-cell提供的调度算法,通过消息队列将消息转发到Child Cell节点,在Child Cell节点做与API Cell同样的工作,选择一个Grandchild Cell并继续转发,在Grandchild节点上做真正的主机调度工作,选择主机创建虚拟机。


上面的情况下,Grandchild Cell需要将自己连接的资源信息定时上报给Child Cell以提供调度功能使用,同样Child Cell也要自己知道的资源信息上报给API Cell使用,这样,每层调度时只需拿自己掌握的资源信息即可,实现每层解耦。

4 配置

从目前的实现来看,在nova.conf中要提供几个配置项:
enable:是否启用cell功能
name:当前节点的cell名称
capabilities:自定义的键值对信息(目前尚未使用)
此外,要配置每个cell节点的compute_api_class和quota_driver,例如在API Cell节点需要配置:

compute_api_class=nova.compute.cells_api.ComputeCellsAPI
 [cells]
 name=api
 enable=true
 而在child cell节点,需要配置(compute_api_class默认配置为nova.compute.api.API):
 quota_driver=nova.quota.NoopQuotaDriver
 [cells]
 enable=true
 name=cell1

 在使用前,还需要配置一些信息以便让cell之间相互识别并规定各自的角色,谁是谁的parent,谁是谁的child。因为cell之间通过AMQP协议通信,因此只需配置相互的AMQP信息即可。假如我们有三个cell,其中一个为parent cell(名称为api),其他两个为child cell(名称分别为cell1和cell2)。则在parent cell节点上执行:
 > nova-manage cell create --name=cell1 --cell_type=child --username=cell1_user --password=cell1_passwd --hostname=10.0.1.10 --port=5673 --virtual_host=cell1_vhost --woffset=1.0 --wscale=1.0
 > nova-manage cell create --name=cell2 --cell_type=child --username=cell2_user --password=cell2_passwd --hostname=10.0.2.10 --port=5673 --virtual_host=cell2_vhost --woffset=1.0 --wscale=1.0
 而在两个child cell节点上,分别执行:
 > nova-manage cell create --name=api --cell_type=parent --username=api1_user --password=api1_passwd --hostname=10.0.0.10 --port=5672 --virtual_host=api_vhost --woffset=1.0 --wscale=1.0