OpenStack 中的 Nova Cell(转)

本文深入探讨了OpenStack在GRelease中引入的NovaCell模块,该模块旨在提供更具弹性的云环境,允许用户通过分布式形式构建大规模的OpenStackCompute云环境。NovaCell通过树型结构实现API-Cell和Child-Cell的分层,每个Child-Cell独立运行nova-*服务,以增强横向扩展和大规模部署能力。此外,文章还详细介绍了NovaCell的基础架构、组件介绍、环境配置与搭建步骤,以及通信过程,帮助开发者理解和实施NovaCell在实际项目中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenStack 中的 Nova Cell

Nova Cell 是 OpenStack 在 G release 提出的一个新的模块。Nova Cell 着眼于更加弹性化的云环境,允许用户通过分布式形式构建一个更加灵活的 OpenStack Compute 云环境,且不需要引入复杂的技术,不影响已部署的 OpenStack 云环境,更好地支持大规模的部署。Nova Cell 模块以树型结构为基础,主要包括 API-Cell(根 Cell)与 Child-Cell 两种形式。API-Cell 运行 nova-api 服务,每个 Child-Cell 运行除 nova-api 外的所有 nova-*服务,且每个 Child-Cell 运行自己的消息队列、数据库及 nova-cells 服务。

赵 健, 软件工程师, IBM

吉 子敛, 软件工程师, IBM

余 文治, 软件工程师, IBM

2014 年 9 月 15 日

  • +内容

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

结构中主要分为 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 模块数据库表结构

其中 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 服务启动后,需要对每个 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 节点信息

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

nova service-list

结果如图 5 所示:

图 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 在启动过程中会调用 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 的流程图

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

<think>好的,用户想查找关于OpenStack Nova的部署配置教程和常见问题。我需要先整理现有的引用内容,看看有哪些相关资源。首先,引用[1]提到了Nova相关参数修改,可能涉及部署中的具体配置步骤。引用[3]有手动分布式部署Nova的Queens版教程,这应该对用户有用。而引用[2]提供了安装部署中的常见问题解决方法,包括官方和社区资源,还有Quora和stackoverflow的链接,这些可能需要包含在常见问题部分。用户可能需要详细的部署步骤,比如环境准备、安装流程、配置文件修改等。常见问题可能涉及网络配置、依赖包缺失、服务启动失败等。另外,版本差异需要注意,用户提到的Victoria、Ussuri、Train和Queens版,不同版本的配置可能有区别,需要提醒用户注意版本兼容性。还要考虑用户的实际应用场景,比如生产环境部署还是测试环境,不同场景下的配置优化可能不同。可能需要分步骤说明,确保结构清晰。同时,引用中的教程都是离线安装,如果用户有网络的话,也可以提及在线安装的选项,但引用内容主要提供离线方案,所以重点放在离线部署上。 另外,需要检查是否有遗漏的问题,比如性能调优、高可用性配置等,但根据引用内容,可能主要集中在基础部署和常见错误解决。需要确保回答真实可靠,引用正确的来源,比如官方文档和社区资源。最后,生成的相关问题需要围绕Nova的部署、配置优化、故障排除和应用场景展开,帮助用户进一步探索。</think>### OpenStack Nova 部署配置与常见问题解答 #### 一、部署配置教程要点 1. **环境准备** - 确保节点满足最小硬件要求(至少4核CPU/8GB内存/100GB存储)[^1] - 配置时间同步服务(Chrony/NTP)和主机名解析 - 安装MariaDB数据库并创建Nova专用账号: ```sql CREATE DATABASE nova_api; CREATE DATABASE nova; CREATE DATABASE nova_cell0; ``` 2. **核心安装流程** ```bash # 安装Nova组件(以Queens版为例) apt install nova-api nova-conductor nova-novncproxy nova-scheduler ``` - 修改`/etc/nova/nova.conf`关键参数: ```ini [api_database] connection = mysql+pymysql://nova:密码@controller/nova_api [database] connection = mysql+pymysql://nova:密码@controller/nova [DEFAULT] transport_url = rabbit://openstack:密码@controller my_ip = 控制节点IP ``` 3. **服务验证** ```bash openstack compute service list nova-status upgrade check ``` #### 二、常见问题解决 1. **虚拟机启动失败** - 检查`nova-compute.log`中的错误代码 - 验证计算节点资源是否超限 - 确认镜像元数据正确性(`glance image-show`) 2. **API服务不可用** ```bash # 查看服务状态 systemctl status nova-api # 检查防火墙规则(需开放8774/8775端口) ``` 3. **数据库同步错误** - 执行`nova-manage api_db sync`和`nova-manage db sync` - 验证数据库权限设置[^3] #### 三、推荐学习资源 1. 官方部署指南: [OpenStack Nova Queens版官方文档](https://docs.openstack.org/nova/queens/) [^2] 2. 离线部署方案: 《OpenStack手动分布式部署Nova【Queens版】》[^3] 3. 性能优化专题: 《Nova调度算法深度解析与参数调优》[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值