Openstack Cell简要说明

部署模式

API CELL

cell,总的api入口,需要启动的openstack服务为keystoneneutronglanceglance-apiglance-registry)、cindercinder-api)、novanova-apinova-cellsnova-consolenova-consoleauthnova-novncproxy);需要启动的第三方服务为rabbitrabbitmq-server)与mysqlmariadb)。

COMPUTE CELL

cell,每一个子cell相当于一个独立的openstack环境,担负具体的计算功能。在子cell内可划分为控制节点与计算节点,控制节点上需要启动的openstack服务为neutronneutron-openvswitch-agent)、cindercinder-schedulercinder-volume)、novanova-cellsnova-conductornova-schedulernova-compute);控制节点上需要启动的第三方服务为rabbitrabbitmq-server)与mysql(mariadb);计算节点需要启动的openstack服务为neutronneutron-openvswitch-agent)、novanova-compute)。(是否在子cell的控制节点上启用nova-compute为可选)

Cell的创建与删除

在父Cell上需要添加子Cell的信息

1
nova-manage cell create --name {子cell名称} --cell_type compute --username {子cell消息服务器用户名} --password {子cell消息服务器密码} --broker_hosts {子cell消息服务器地址,list形式} --hostname {子cell消息服务器地址} --port {子cell 消息服务器端口} --virtual_host {子cell消息服务器虚拟机主机地址}

在子Cell上需要添加父Cell的信息

1
nova-manage cell create --name <父cell名称> --cell_type api --username <父cell消息服务器用户名> --password <父cell消息服务器密码> --broker_hosts <父cell消息服务器地址,list形式> --hostname <父cell消息服务器地址> --port <父cell 消息服务器端口> --virtual_host {父cell消息服务器虚拟机主机地址}

删除Cell

1
nova-manage cell delete {cell_id}

请求的执行流程

当指令下发后,首先进入nova-api,经过对请求地址解析,参数处理之后,会调用到computeapi。非cell模式,computeapinova.compute.api.pycell模式下,为nova.compute.cells_api.py

父Cell到子Cell的过程

nova.compute.cells_api.py -> nova.cells.rpcapi.py -> nova.cells.manager.py -> nova.cells.messaging.py (以上为父Cell,主要功能为调度) -> nova.cells.messaging.py (子Cell,由此进入到具体的执行操作)

另一种调用的方式

nova.compute.cells_api.py (父Cell,调用其中的_cast_to_cells_call_to_cells等方法,直接调用子Cellnova.compute.api.py中的对应函数) -> nova.compute.api.py (子Cell

相当于非Cell模式中的功能相简便移植到Cell模式中,只需要在nova.compute.cells_api.py中增加一个类似跳板的同名函数,并使用_cast_to_cells_call_to_cells等方法将请求转到子Cellnova.compute.api.py中的同名函数。

数据库与消息服务器

Cell模式下,有些函数访问的是自身的数据库且不向其他Cell的数据库同步数据;有些函数访问父Cell的数控库且会向其他Cell的数据库同步数据。原生的cell并不健全,如aggregate仅在父Cell上更新,并不同步数据到子Cell,而子Cell只从自己的数据库上查询,导致环境无法创建az。如遇到非Cell模式下可正常运行的功能在Cell模式下失效,可以查看是否存在数据读取的问题。

消息服务器的存活是Cell非常关心的一件事,在多个子Cell的环境中,其中一个子Cell的消息服务器挂了之后,会导致父Cell异常,需要尽快在父Cell的配置中删除异常的子Cell