内容


OpenStack 中的 Nova Cell

Comments

Nova Cell 模块简介

Nova Cell 模块是 OpenStack 在 G Release 中提出的一个新的模块,允许用户在不影响现有 OpenStack 云环境的前提下,增强横向扩展、大规模部署能力。当 Nova Cell 模块启用后,OpenStack 云环境被分成多个子 Cell,并且是以在原 OpenStack 云环境中添加子 Cell 的方式,拓展云环境,以减少对原云环境的影响。 每个 Cell 都运行着 nova-cells 服务,用于与其他 Cell 通信。目前为止,Cells 之间的通信只支持 RPC 服务。Nova Cell 模块中 Cells 的调度与 Compute Host 节点的调度是相互分离的。nova-cells 负责为特定操作选取合适的 Cell,并将 request 发送至此 Cell 的 nova-cells 服务进行处理,Target Child Cell 会对请求进行处理,并发送至 Cell 的 Compute Host 调度进行处理。

Nova Cell 模块基础架构

Nova Cell 模块被设计成树型结构,基础架构如图 1 所示:

图 1.Nova Cell 模块基础架构
Nova Cell 模块基础架构
Nova Cell 模块基础架构

结构中主要分为 API Cell(Parent Cell)以及 Child Cell 两种形式,其中,API Cell 主要包含的服务如下:

AMQP Broker

Database

nova-cells

nova-api

Keystone

Child Cell 包含服务如下:

AMQP Broker

Database

nova-cells

nova-scheduler

nova-network

nova-compute

Keystone

每一个 Cell 包含独立的 Message Broker 以及 Database,其中 API Cell 主要包含 nova-api 服务,用于接收用户请求,并将用户请求通过 message 的形式发送至指定的 Cell;Child Cell 包含除 nova-api 之外的所有 nova-*服务,实现具体的 Nova Compute 节点服务;API Cell 与 Child Cell 共享 Glance 服务,且各 Cells 之间的通信均通过 nova cells 服务进行。

Cell 调度独立于与 host 调度,在创建新的实例时,首先由 nova-cells 选择一个 Cell。当 Cell 确定后,实例创建请求会被送达目标 Cell 的 nova-cells 服务,随后该请求会被交给本 Cell 的主机调度机制处理,此时主机调度机制会像未配置 Cell 的环境一样处理该请求。

Nova Cell 模块中主要组件介绍

Nova Cell 数据库表结构

目前,Nova Cell 模块隶属于 Opnstack Nova 项目,默认配置下,Nova Cell 不被激活。在 OpenStack Compute 服务安装后,进行相应数据库创建的过程中,会在数据库"nova"中创建对应的表项"cells",里面包含 Cell 模块需要存储在数据库中的信息,表结构如图 2 所示:

图 2.Nova Cell 模块数据库表结构
Nova Cell 模块数据库表结构
Nova Cell 模块数据库表结构

其中 transport_url 字段存储 Neighbor Cell 的 rabbitmq 的相关信息,用于 Cells 之间通信,"transport_url"字段的格式如下:

scheme://username:password@hostname:port/virtual_host

Cells 之间的通信主要通过传递 message 实现的,Parent Cell 会将用户的请求合成一个含有指定 Child Cell 的 message。含有请求的 message 会在 Children Cells 中间进行路由,直至指定的 Cell 节点进行处理。目前 Nova Cell 使用 RabbitMQ 作为 Message Broker,消息队列可以通过 /etc/nova/nova.conf 中的字段 rpc_driver_queue_base 进行配置,默认为"cells.intercell"。

Message 主要包含三种类型:TargetedMessage、BroadcastMessage、ResponseMessage,分别用于对不同类型的 message 进行创建、转发及处理。

在 nova-cells 模块中,_BaseMessage 作为所有消息的基类,定义了 message 的基本数据结构,并包含处理消息所用到的基本方法。MessageRunner 主要完成消息创建以及消息处理的逻辑实现。

当 nova-cells 服务启动时,会启动三个 RPC Consumers,用于处理不同种类的 messages,每一个 message 中会含有一个 unique ID 以及此 message 的全部路由信息,Message 会根据路由信息以及 message 所包含的 topic 决定是否处理此 message 还是路由出去。Topic 的格式如下:

rpc_driver_queue_base.msg_type

Nova Cell 模块中各主要类的功能介绍

CellStateManager 类主要用于管理一个具体 Cell 的信息,用于获取或更新 Cell 的相关信息,每一个 Cell 均拥有一个 CellState 实例用于保存 Cell 的信息;

CellsManager 类主要定义了 RPC 的各类方法供本地 Cell 进行调用,本地 Cell 可以通过调用 CellsManager 中提供的方法,借助 MessageRunner 将请求送至其他 Cells;

BaseCellsDriver 类主要用于各 Cells 间的通信,合成并发送一个 message 到其他 Cell,以及启动 Consumers 线程,完成对不同 messages 的处理;

CellsScheduler 类主要用于将不同的用户请求调度至指定的 Cell;当用于需要创建一个 VM,CellsScheduler 会调用_schedule_build_to_cells(),选择一个合适的 cell 来运行创建命令;

Nova Cell 环境配置与搭建

Nova Cell 模块配置

本文环境是基于 Ubuntu 12.04.4,通过 DevStack 完成 OpenStack 环境的搭建。

Nova Cell 模块的所有配置信息都包含在配置文件"nova.conf"中,可以通过更改"[cells]"部分下面的属性信息进行配置,默认情况下,Nova Cell 功能是被禁止的。

Cells 主要配置项如下:

[cells]
	enable :是否启用 nova cell 模块,默认是 False
	name : Cell 的名称,用于识别每个 Cell,必须保证此命名的唯一性
	driver : 用于 Cells 之间的通信,默认是 nova.cells.rpc_driver.CellsRPCDriver
	scheduler : Cells 的调度服务,默认是 nova.cells.scheduler.CellsScheduler
	topic : Cells 节点监听的 Topic,默认是 cells
	manager : Cells 节点的 Manager,默认是 nova.cells.manager.CellsManager	 
	cell_type : 当前 Cell 的类型,分为 api 或者 compute
	rpc_driver_queue_base : Cells 默认的 Queue,默认是 cells.intercell
	capabilities : 用于定义 Cell 的 capabilities,以 Key/Value 的形式存储
	instance_update_num_instance : 每个同步周期能够同步的 instance 的数目
	instance_updated_at_threshold : 同步 Parent Cell 与 Child Cell 之间 instance 信息的周期时间
	max_hop_count : Message 在 Cells 之间路由的最大数目,默认是 10

Parent Cell 配置实例如下:

	[DEFAULT]
    compute_api_class = nova.compute.cells_api.ComputeCellsAPI
	
    [cells]
    enable = True
    name = $parent_cell_name
    driver=nova.cells.rpc_driver.CellsRPCDriver
    scheduler=nova.cells.scheduler.CellsScheduler
    topic=cells
    manager=nova.cells.manager.CellsManager
    cell_type = api
    rpc_driver_queue_base=cells.intercell
    scheduler_weight_classes=nova.cells.weights.all_weighers

Child Cell 配置实例如下:

	[DEFAULT]
	quota_driver = nova.quota.NoopQuotaDriver
	[cells]
	enable = True
	name = $child_test1_name
	driver=nova.cells.rpc_driver.CellsRPCDriver
	scheduler=nova.cells.scheduler.CellsScheduler
	topic=cells
	manager=nova.cells.manager.CellsManager
	cell_type = compute
	rpc_driver_queue_base=cells.intercell
	scheduler_weight_classes=nova.cells.weights.all_weighers

环境配置完成后,启动 Nova Cell 服务及 Nova 相关服务;Nova Cell 的启动命令如下:

python $bin_path/nova-cells --config-file /etc/nova/nova.conf 
服务启动后,可通过命令"nova service-list"查看 Nova Cell 服务是否正常启动,正常状态下如图 3 所示:
图 3.启动 Nova Cell 模块成功
启动 Nova Cell 模块成功
启动 Nova Cell 模块成功

在 Nova Cell 服务启动后,需要对每个 Cell 进行配置,将父节点及子节点的信息注册到相应的 Cell 中,确保父节点可以知道自己的直接子节点,子节点可以知道自己的父节点,便于双方的通信。注册在数据库中的信息主要是 Message Broker(这里为 RabbitMQ)的相关链接信息,主要参数如下:

	--name=<name>    注册 Cell 的名称  
	--cell_type=<parent|child>   注册 Cell 是 API Cell 还是 Child Cell
    --username=<username>    注册 Cell 的 RabbitMQ 的用户名
    --password=<password>    注册 Cell 的 RabbitMQ 的密码
    --hostname=<hostname>    注册 Cell 的 RabbitMQ 的 Host 地址
    --port=<number>    注册 Cell 的 RabbitMQ 的端口号码
	--virtual_host=<virtual_host>    注册 Cell 的 RabbitMQ 的 Virtual-Host 的路径

Parent Cell 中运行命令实例如下:

nova-manage cell create --name=$child_cell_name --cell_type=child --username=$child_cell_rabbitmq_user
 --password=$child_cell_rabbitmq_pass --hostname=$child_cell_rabbitmq_host 
--port=$child_cell_rabbitmq_port --virtual_host=$child_cell_rabbitmq_virtualhost 
--woffset=1.0 --wscale=1.0

Child Cell 中运行命令实例如下:

nova-manage cell create --name=$parent_cell_name --cell_type=parent --username=$parent_cell_rabbitmq_user
 --password=$parent_cell_rabbitmq_pass --hostname=$parent_cell_rabbitmq_host 
--port=$parent_cell_rabbitmq_port --virtual_host=$parent_cell_rabbitmq_virtualhost 
--woffset=1.0 --wscale=1.0

注册成功后,可以分别在 Cell 端运行命令,查看注册信息,运行命令如下:

nova-manage cell list
图 4.Parent Cell 中已注册的 Child Cell 节点信息
Parent Cell 中已注册的 Child Cell 节点信息
Parent Cell 中已注册的 Child Cell 节点信息

验证 Cell 组件是否正常启动,可以通过在 Parent Cell 中运行如下命令:

nova service-list

结果如图 5 所示:

图 5.Parent Cell 端所有服务信息
图 5.Parent Cell 端所有服务信息
图 5.Parent Cell 端所有服务信息

正常运行时,API Cell 端的服务列表中,会包含所有 Child Cell 的服务信息。当所有 Cell 服务正常运行后,便可以进行创建 instance 等一系列操作,API Cell 负责执行用户指令,并将指令路由到指定的 Child Cell 进行处理。

Nova 通信过程举例

Parent Cell 更新 Child Cells 的信息

以更新 Child Cell 的 capability 为例,在 Parent Cell 启动时,会通过 CellManager 去更新 Child Cells 的 capability 信息,在 Parent Cell 运行期间,Parent Cell 会定期更新 Child Cells 的信息,具体间隔时间可以参照配置文件"/etc/nova/nova.conf"中的属性"instance_updated_at_threshold"。更新 Child Cells 的流程图如图 6 所示:

图 6.Parent Cell 更新 Child Cells 流程图
Parent Cell 更新 Child Cells 流程图
Parent Cell 更新 Child Cells 流程图

Parent Cell 在启动过程中会调用 CellDriver 启动不同类型 Message 的 Consumers,用于处理不同 Message 的信息,更新 capability 信息主要调用"ask_children_for_capabilites()",通过"get_children_cells()"获取所有 Children Cells 的信息,调用 MessageRunner,针对每一个 Child Cell 合成一个 TargetedMessage 并发送 ,里面含有指定 Cell 的信息,指定 Cell 需要调用的方法名称;当 Cell 接收到 Message,并利用对应的 Consumer 进行处理,创建 Response Queue,并将 Response Queue 中一系列消息合成为一个 ResponseMessage,返回给 Parent Cell。

Parent Cell 关闭 Child Cell 上创建的 Instance

当用户希望关闭某一创建的 Instance 时,用户将请求发送个 Top Cell,Top Cell 中的 nova-api 服务接受请求,并通过 Message 将请求路由给指定的 Child Cell,调用 Child Cell 的 compute api 进行处理,如图 7 所示:

图 7.关闭 Instance 的流程图
关闭 Instance 的流程图
关闭 Instance 的流程图

API Cell 会根据指定的 Instance,方法名称,创建一个 TargetedMessage,并将 message 发送至指定的 Cell,Cell 的 TargetedMessage Consumer 接收消息后进行处理,根据 message 中的方法名称,调用 nova compute api,完成对 instance 的操作,并更新 Child Cell 与 Parent Cell 中此 Instance 的状态。

结束语

Nova Cell 提供了更加弹性化的云环境,方便用户横向扩展现有云环境能力,更好的支持大规模部署,并且提供一种管理 OpenStack 云环境的模式,通过 Nova Cells 模块能管理多个 OpenStack 云环境。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing
ArticleID=983382
ArticleTitle=OpenStack 中的 Nova Cell
publish-date=09152014