设为首页 收藏本站
查看: 1261|回复: 0

[经验分享] OpenStack 中的 Nova Cell(转)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-10-11 10:07:47 | 显示全部楼层 |阅读模式

OpenStack 中的 Nova Cell


[size=0.95em]
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 服务。

[size=0.95em]
[size=0.8em]0
DSC0000.png 评论:

[size=0.8em]

健, 软件工程师, IBM

[size=0.8em]

子敛, 软件工程师, IBM

[size=0.8em]

文治, 软件工程师, IBM

[size=0.8em]
2014 年 9 月 15 日




  • DSC0001.png 内容




DSC0002.jpg

在 IBM Bluemix 云平台上开发并部署您的下一个应用。
[size=1.166em]
现在就开始免费试用



Nova Cell 模块简介


[size=1.166em]
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 调度进行处理。


[size=1.166em]
回页首



Nova Cell 模块基础架构


[size=1.166em]
Nova Cell 模块被设计成树型结构,基础架构如图 1 所示:



图 1.Nova Cell 模块基础架构


DSC0003.jpg
[size=1.166em]
结构中主要分为 API Cell(Parent Cell)以及 Child Cell 两种形式,其中,API Cell 主要包含的服务如下:

[size=1.166em]
AMQP Broker

[size=1.166em]
Database

[size=1.166em]
nova-cells

[size=1.166em]
nova-api

[size=1.166em]
Keystone

[size=1.166em]
Child Cell 包含服务如下:

[size=1.166em]
AMQP Broker

[size=1.166em]
Database

[size=1.166em]
nova-cells

[size=1.166em]
nova-scheduler

[size=1.166em]
nova-network

[size=1.166em]
nova-compute

[size=1.166em]
Keystone

[size=1.166em]
每一个 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 服务进行。

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


[size=1.166em]
回页首



Nova Cell 模块中主要组件介绍



Nova Cell 数据库表结构


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



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


DSC0004.jpg
[size=1.166em]
其中 transport_url 字段存储 Neighbor Cell 的 rabbitmq 的相关信息,用于 Cells 之间通信,"transport_url"字段的格式如下:

[size=1.166em]
scheme://username:password@hostname:port/virtual_host

[size=1.166em]
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"。

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

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

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

[size=1.166em]
rpc_driver_queue_base.msg_type



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


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

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

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

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


[size=1.166em]
回页首



Nova Cell 环境配置与搭建



Nova Cell 模块配置


[size=1.166em]
本文环境是基于 Ubuntu 12.04.4,通过 DevStack 完成 OpenStack 环境的搭建。

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

[size=1.166em]
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
[size=1.166em]
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
[size=1.166em]
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
[size=1.166em]
环境配置完成后,启动 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 模块成功


DSC0005.jpg
[size=1.166em]
在 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 的路径
[size=1.166em]
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
[size=1.166em]
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
[size=1.166em]
注册成功后,可以分别在 Cell 端运行命令,查看注册信息,运行命令如下:


nova-manage cell list

图 4.Parent Cell 中已注册的 Child Cell 节点信息


DSC0006.jpg
[size=1.166em]
验证 Cell 组件是否正常启动,可以通过在 Parent Cell 中运行如下命令:


nova service-list
[size=1.166em]
结果如图 5 所示:



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


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


[size=1.166em]
回页首



Nova 通信过程举例



Parent Cell 更新 Child Cells 的信息


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



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


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



Parent Cell 关闭 Child Cell 上创建的 Instance


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



图 7.关闭 Instance 的流程图



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


[size=1.166em]
回页首



结束语


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



版权声明:欢迎大家转载,转载请注明出处blog.iyunv.com/tantexian。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-125329-1-1.html 上篇帖子: OpenStack : Nova API 分析 下篇帖子: OpenStack Summit Paris 会议纪要
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表