感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!
如果转载,请保留作者信息。
博客地址:http://blog.csdn.net/gaoxingnengjisuan
邮箱地址:dong.liu@siat.ac.cn
我将先在此篇博客中介绍nova-cell服务的架构和配置,在下一篇博客中,我将具体分析nova-cell的源码。
cell的功能允许我们以更加灵活的分布式的方式实现对OpenStack Compute云的缩放,而不需要更加复杂的技术,只需数据库和消息队列等。它的目的是支持更大规模的部署。
当启用了这个功能的时候,OpenStack Compute云中的主机会被分组,称作cell。cell的结构是树的形式。top-level级别的cell中的主机运行一个nova-api服务,但是可以没有nova-compute服务。每一个子cell应该运行常规OpenStack云计算中所有nova-*类型的服务,除了nova-api服务。我们可以把一个cell树结构看成一个正常的OpenStack Compute部署,因为在这个树中的每个cell中都有自己的数据库服务和消息队列服务。
nova-cells服务处理cell之间的通信,并选择一个cell用于建立新的实例。这个服务将会被每个cell所需要的。cell之间的通信是可插拔的,目前cell之间的通信只是通过RPC服务来实现的。
采用cell服务实现了cell的调度和主机节点的调度是相互分离的。nova-cells服务首先会选择一个cell(目前实现的是随机选择,将来会添加过滤/权重功能,还可以基于广播获取的capacity/capabilities等参数)。一旦合适的cell被选择,且建立新的实例的请求到达了这个cell的nova-cells服务之上,这个cell将会发送建立新的实例的请求到这个cell的主机调度器。
cell特征
1.目的是支持更大规模的部署;
2.cell的结构是树的形式;
3.top-level级别的cell(API cell)中的主机运行nova-api服务,可以没有nova-compute服务,不感知底层物理主机以及虚拟化;
4.子cell无nova-api服务;
5.每一个子cell应该运行常规OpenStack云计算中所有nova-*类型的服务,除了nova-api服务;
6.树中的每个cell中都有自己的数据库服务和消息队列服务;
7.从设计上来讲cell之间的通信是可插拔的,也就是未来会支持多种消息通信框架,目前cell之间的通信只是通过RPC服务来实现的;
8.采用cell服务实现了cell的调度和主机节点的调度是相互分离的;
9.在建立新的实例时,nova-cells服务选择cell,目前实现的是随机选择,将来会添加过滤/权重功能,还可以基于广播获取的capacity/capabilities等参数;
10.在默认的情况下cell功能是禁用的;
cell架构
在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以提供调度功能使用,同样ChildCell也要自己知道的资源信息上报给API Cell使用,这样,每层调度时只需拿自己掌握的资源信息即可,实现每层解耦。
cell的配置
cell配置选项
在默认的情况下cell功能是禁用的。
所有的cell相关的配置选项都是在配置文件nova.conf中[cells]部分之下的。下面的配置选项是当前支持的:
enable
TRUE----启动cell功能;(默认是关闭的;)
name
当前cell的名称,对于每个cell来讲,必须是唯一的;
capabilities
存储当前cell的capabilities信息的列表,它会发送给父cell,但是暂时不会用于调度器,直到将来支持过滤器/权重方案为止;
call_timeout
在cell之间等待call调用响应的时间;
API(顶层)cell的配置选项
compute API类不能是默认的,必须改变为nova.compute.cells_api.ComputeCellsAPI,才能通过nova-cells服务将请求发送到正确的cell之上。具体配置将会如下添加于nova.conf:
[DEFAULT]
compute_api_class=nova.compute.cells_api.ComputeCellsAPI
...
[cells]
enable=True
name=api
配置子cell
在子cell中的nova.conf中,将会进行如下配置:
[DEFAULT]
# Disable quota checking in child cells. Let API cell do it exclusively.
quota_driver=nova.quota.NoopQuotaDriver
[cells]
enable=True
name=cell1
在每个cell中配置数据库
在使用cell服务之前,每个cell中还需要对数据库进行配置。因为APIcell需要知道关于它直系孩子的信息,且子cell们需要知道关于它们父母cell的信息。
应用命令行nova-manage cell create来为每个cell添加相关信息到数据库之中。
$ nova-manage cell create -h
Options:
-h, --help show this help message and exit
--name=<name> Namefor the new cell
--cell_type=<parent|child> Whetherthe cell is a parent or child
--username=<username> Usernamefor the message broker in this cell
--password=<password> Passwordfor the message broker in this cell
--hostname=<hostname> Address ofthe message broker in this cell
--port=<number> Portnumber of the message broker in this cell
--virtual_host=<virtual_host> Thevirtual host of the message broker in this cell
--woffset=<float>
--wscale=<float>
举个例子,假如我们的API cell命名为api,一个子cell命名为cell1,则在这个api cell中,我们有如下的RabbitMQ服务信息:
rabbit_host=10.0.0.10
rabbit_port=5672
rabbit_username=api_user
rabbit_password=api_passwd
rabbit_virtual_host=api_vhost
在这个名字为cell1的子cell中,我们有如下的RabbitMQ服务信息:
rabbit_host=10.0.1.10
rabbit_port=5673
rabbit_username=cell1_user
rabbit_password=cell1_passwd
rabbit_virtual_host=cell1_vhost
我们应该以管理员的身份,在API 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
在API cell中,为API cell的所有子cell重复上述的命令;
在子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
cell配置文件配置选项的描述
call_timeout=60
(IntOpt)等待调用call返回响应的时间期限;
capabilities=['hypervisor=xenserver;kvm','os=linux;windows']
(ListOpt)表示cell的capabilities信息的Key/Multi-value列表;
driver=nova.virt.baremetal.pxe.PXE
(StrOpt)Baremetal driver back-end (pxeor tilera)
driver=nova.cells.rpc_driver.CellsRPCDriver
(StrOpt)用于cell通信的驱动;
enable=False
(BoolOpt)是否启用cell功能;
instance_update_num_instances=1
(IntOpt)周期性的运行更新实例的数目;
instance_updated_at_threshold=3600
(IntOpt)实例更新或删除之后继续更新cell的时间期限;
manager=nova.cells.manager.CellsManager
(StrOpt)cell管理类;
manager=nova.conductor.manager.ConductorManager
(StrOpt)cell管理conductor类的全名;
max_hop_count=10
(IntOpt)cell路由最大跳数;
name=nova
(StrOpt)本cell的名称;
reserve_percent=10.0
(FloatOpt)cell容量储备百分比,会影响内存和磁盘利用率;
scheduler=nova.cells.scheduler.CellsScheduler
(StrOpt)cell的调度器;
topic=cells
(StrOpt)监听的topic cell节点;
topic=conductor
(StrOpt)监听的topic conductor节点;