Nova Data Flow(Newton版)
2017-08-10 17:21
218 查看
一、简介
首先看看Nova的架构图,里面包含了Nova的主要组件,各组件的关键功能:
API :进入Nova的HTTP接口;
Scheduler:从可用池中选择最合适的计算节点(物理机)来创建虚拟机实例;
Conductor:为数据库的访问提供一层安全保障,避免Compute直接访问数据库;
Compute:管理虚拟机的生命周期;
还有其他的几个组件,可以通过systemctl |grep nova查看:
nova-novncproxy:用户可以通过多种方式访问虚机的控制台,该种是基于Web浏览器的VNC访问;
nova-consoleauth:负责对访问虚机控制台提供Token认证;
nova-cert:提供x509证书支持
二、API服务
在nova/setup.cfg中,可以看到nova-api=nova.cmd.api:main,api的入口为cmd目录下的api.py文件中的main()函数:config.parse_args(sys.argv) |
解析参数
首先看CONF=nova.conf.CONF,在conf/__init__.py中,大致看一眼是什么:
CONF是在oslo.config中定义的一个类,作为参数传入nova,作为在代码各处注册配置项的实例,和上图相似:
为nova设置logging
monkey patch
用过gevent就会知道,会在最开头的地方gevent.monkey.patch_all();把标准库中的thread/socket等给替换掉.这样我们在后面使用socket的时候可以跟平常一样使用,无需修改任何代码,但是它变成非阻塞的了.
之前做的一个游戏服务器,很多地方用的import json,后来发现ujson比自带json快了N倍,于是问题来了,难道几十个文件要一个个把import json改成import ujson as json吗?
其实只需要在进程startup的地方monkey patch就行了,是影响整个进程空间的。同一进程空间中一个module只会被运行一次,给出一个demo,容易理解:
注册所有的objects
__import__ 和import功能相同,不同的是作为函数,传入的是字符串格式,将nova.objects下的所有内容import进来
nova/objects目录下每一个类都对应数据库中的一个表,是操作数据库的最终接口,conductor、api操作数据库时都是经过objects
获取服务的启动器
启动对应的api
manager只有metadata有,在配置文件中进行配置,搜索规则如下:
app即paste生成的WSGI的app,请求来了都发往这些app
host和port即监听路径及端口
worker则是具体的工作数,一般默认是一个CPU核对应一个,原因后续分析。继续看代码:
首先先看父进程的,父进程做的事情比较简单:启动子进程,然后记录一些信息(更新wrap),然后返回子进程的PID。
然后再看子进程的,子进程的话先通过launcher = self._child_process(wrap.service)启动对应的服务,然后就是while循环等待信号。如果有终止的信号量就结束,否则则重新启动进程。所以我们来看下launcher = self._child_process(wrap.service)做了什么吧,这里的service就是我们上面的WSGIService对象(有WSGI app在里边):
service, self.done)的self.run_service里面):
这里和普通的多线程模型下的HTTP server有一个很大的不同:普通的HTTP server在启动的时候只有一个线程在那里监听一个端口,来了一个请求才会fork一个线程去做独立的处理(也就是说如果请求很多的话,线程个数也会很多)。但这里由于使用了eventlet的绿化(本质就是协程,可以看这里),因此对于协程来说,一个协程只能运行在一个CPU核上,并且不存在来个请求就fork这种东西,所以这里会根据CPU的核的个数去建立对应的协程(worker)。当一个请求来了过后呢其就会交给某一个协程去处理。不管请求个数多少,协程的个数是固定的。协程在HTTP
server方面的效率比较高。
监听并服务
总结
nova-api的启动过程就是读取配置文件,生成TRANSPORT和NOTIFIER这两个全局对象用于消息操作。同时启动n个wsgi server,每个server对应配置文件中的一个api。另外根据系统的CPU核心数n,每个wsgi server都会有n个worker协程去处理请求。
相关文章推荐
- Zaqar Data Flow(Newton 版)
- Cloudkitty Data Flow(Newton版)
- tcp/ip学习笔记--第19章 TCP interactive data flow (交互数据流)
- Android 5.1 open data flow 数据开启流程
- SSIS ->> Control Flow And Data Flow
- SSIS ->> Data Flow Design And Tuning
- DSS Source Code Analyse (17) - Data Flow of classical Live
- tensorflow reading data (1)
- Data Flow Diagrams (DFDs)
- PCM data flow - 1 - Overview
- Android 5.1 open data flow 数据开启流程
- PCM data flow - part 4: ASoC platform driver
- 利用背景流量数据(contexual flow data) 识别TLS加密恶意流量
- DSS Source Code Analyse (18) - Data Flow of classical Relay
- spring cloud data flow demo
- Softmax on Digits Data with TensorFlow
- 数据流图(Data Flow Diagram ,简称DFD)
- Receiving Module Data Flow
- Spring Cloud Data Flow Server for Apache Mesos 适用于mesos平台的springcloud数据流服务器(DCOS构建)
- Spring Cloud Data flow