fc013 发表于 2015-11-29 19:14:53

OpenStack 中的 Nova Cell

本帖最后由 fc013 于 2015-11-29 19:15 编辑



问题导读:

1.Nova Cell 模块是什么?2.Nova Cell 模块有哪些主要组件?3.怎样搭建与配置Nova Cell 环境?

http://www.aboutyun.com/static/image/hrline/4.gif


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 模块基础架构






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


AMQP BrokerDatabasenova-cellsnova-apiKeystone
Child Cell 包含服务如下:
AMQP BrokerDatabasenova-cellsnova-schedulernova-networknova-computeKeystone
每一个 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 模块数据库表结构




其中 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"中,可以通过更改""部分下面的属性信息进行配置,默认情况下,Nova Cell 功能是被禁止的。
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 配置实例如下:

    compute_api_class = nova.compute.cells_api.ComputeCellsAPI
      
   
    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 配置实例如下:

      quota_driver = nova.quota.NoopQuotaDriver
      
      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 服务启动后,需要对每个 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 节点信息




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

nova service-list

结果如图 5 所示:
图 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 在启动过程中会调用 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 的流程图




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 云环境。



eason 发表于 2016-2-25 20:11:20

li hai
页: [1]
查看完整版本: OpenStack 中的 Nova Cell