第 5 章 Nova - 025 - OpenStack 通用设计思路
API 前端服务
每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求。
以 Nova 为例
nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 Nova 能够提供的功能。
当客户需要执行虚机相关的操作,能且只能向 nova-api 发送 REST 请求。
这里的客户包括终端用户、命令行和 OpenStack 其他组件。
设计 API 前端服务的好处在于:
1、对外提供统一接口,隐藏实现细节
2、API 提供 REST 标准调用服务,便于与第三方系统集成
3、可以通过运行多个 API 服务实例轻松实现 API 的高可用,比如运行多个 nova-api 进程
Scheduler 调度服务
对于某项操作,如果有多个实体都能够完成任务,那么通常会有一个 scheduler 负责从这些实体中挑选出一个最合适的来执行操作。
以 Nova 为例
Nova 有多个计算节点。
当需要创建虚机时,nova-scheduler 会根据计算节点当时的资源使用情况选择一个最合适的计算节点来运行虚机。
调度服务好比是开发团队中的项目经理,当接到新的开发任务后,项目经理会评估任务的难度,考察团队成员目前的工作负荷和技能水平,然后将任务分配给最合适的开发人员。
除了 Nova,块服务组件 Cinder 也有 scheduler 子服务。
Worker 工作服务
调度服务只管分配任务,真正执行任务的是 Worker 工作服务。
以 Nova 为例
这个 Worker 就是 nova-compute 了。
将 Scheduler 和 Worker 从职能上进行划分使得 OpenStack 非常容易扩展:
当计算资源不够了无法创建虚机时,可以增加计算节点(增加 Worker)
当客户的请求量太大调度不过来时,可以增加 Scheduler
Driver 框架
OpenStack 作为开放的 Infrastracture as a Service 云操作系统,支持业界各种优秀的技术。
这些技术可能是开源免费的,也可能是商业收费的。
这种开放的架构使得 OpenStack 能够在技术上保持先进性,具有很强的竞争力,同时又不会造成厂商锁定(Lock-in)。
OpenStack 的开放性体现:一个重要的方面就是采用基于 Driver 的框架。
以 Nova 为例
OpenStack 的计算节点支持多种 Hypervisor。
包括 KVM, Hyper-V, VMWare, Xen, Docker, LXC 等。
Nova-compute 为这些 Hypervisor 定义了统一的接口,hypervisor 只需要实现这些接口,就可以 driver 的形式即插即用到 OpenStack 中。
下面是 nova driver 的架构示意图
在 nova-compute 的配置文件 /etc/nova/nova.conf 中由 compute_driver 配置项指定该计算节点使用哪种 Hypervisor 的 driver
在实验环境中因为是 KVM,所以配置的是 Libvirt 的 driver。
前面有提到:
OpenStack 支持多种 backend 来存放 image。
可以是本地文件系统,Cinder,Ceph,Swift 等。
其实这也是一个 driver 架构。
只要符合 Glance 定义的规范,新的存储方式可以很方便的加入到 backend 支持列表中。
在后面 Cinder 和 Neutron 中还会看到 driver 框架的应用。
Messaging 服务
在前面创建虚机的流程示意图中,看到 nova-* 子服务之间的调用严重依赖 Messaging。
Messaging 是 nova-* 子服务交互的中枢。
程序之间的调用通常分两种:同步调用和异步调用。
同步调用
API 直接调用 Scheduler 的接口是同步调用。
其特点是 API 发出请求后需要一直等待,直到 Scheduler 完成对 Compute 的调度,将结果返回给 API 后 API 才能够继续做后面的工作。
异步调用
API 通过 Messaging 间接调用 Scheduler 就是异步调用。
其特点是 API 发出请求后不需要等待,直接返回,继续做后面的工作。
Scheduler 从 Messaging 接收到请求后执行调度操作,完成后将结果也通过 Messaging 发送给 API。
在 OpenStack 这类分布式系统中,通常采用异步调用的方式,其好处是:
- 解耦各子服务
子服务不需要知道其他服务在哪里运行,只需要发送消息给 Messaging 就能完成调用。
- 提高性能
异步调用使得调用者无需等待结果返回。
这样可以继续执行更多的工作,提高系统总的吞吐量。
- 提高伸缩性
子服务可以根据需要进行扩展,启动更多的实例处理更多的请求,在提高可用性的同时也提高了整个系统的伸缩性。
而且这种变化不会影响到其他子服务,也就是说变化对别人是透明的。
Database
OpenStack 各组件需要维护自己的状态信息。
以 Nova 为例
比如 Nova 中有虚机的规格、状态,这些信息都是在数据库中维护的。
每个 OpenStack 组件在 MySQL 中有自己的数据库。
小结
Nova 是 OpenStack 中最重要的组件,也是很典型的组件。
Nova 充分体现了 OpenStack 的设计思路。
理解了这种思路,再来学习 OpenStack 的其他组件就能够举一反三,清晰容易很多。
--------------------------------------------------引用来自-------------------------------------------------------
https://www.cnblogs.com/CloudMan6/p/5427981.html
https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587849&idx=1&sn=5b9b0805aac68436d97c13a5fd17eb85&chksm=8d308190ba4708865c97c29b8fbc1ca5d9ba9abbcf4f2daaf6803a306bc8d9dd36a8efb91fcc&scene=21#wechat_redirect
转载于:https://www.cnblogs.com/gsophy/p/10998851.html
第 5 章 Nova - 025 - OpenStack 通用设计思路相关推荐
- OpenStack 通用设计思路 - 每天5分钟玩转 OpenStack(25)
API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...
- OpenStack 通用设计思路
API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...
- 华为云计算IE面试笔记-FusionSphere Openstack规划设计过程中要考虑哪些网络平面,各平面主要走哪些业务?
在FusionSphere Openstack规划设计的过程中,至少有8个平面. 1. Internal_base,内部平面. ①是FusionSphere Openstack中的组件之间进行通信的网 ...
- 第2章 中小型网络系统总体规划与设计
第2章 中小型网络系统总体规划与设计 选择题5-7 考点1:网络总体设计方法 1.核心层网络结构设计 整个网络系统的主干部分是核心层网络,它是设计与建设的重点.目前应用于核心层网络的技术标准主要是GE ...
- 【选择恐惧症】需不需要通用设计?
[选择恐惧症]需不需要通用设计? 症前兆 症分析 症解决 症前兆 经常会遇到这样的问题:一份需求下来,在做设计的时候就会开始纠结了:到底需不需要先抽象公共元素进行通用设计,再来进行功能的细化设计呢?还 ...
- 我要翻译《Think Python》- 006 第四章 学习案例:接口设计
本文翻自:Allen B. Downey --<Think Python> 原文链接:http://www.greenteapress.com/thinkpython/html/think ...
- 基于OpenStack+Docker设计与实现CI/CD
本文所述内容的背景是,基于Docker容器技术的OpenStack研发.测试.运维及其相关的CI/CD.DevOps等活动.思想是相通的,读者可以取其可用部分用于自己的业务需求中. IaaS云和容器云 ...
- 《代码大全2》第5章 软件构建中的设计
目录 前言 本章主题 5.1 设计中的挑战 5.1.1 设计在软件构建中所处的角色 5.1.2 设计是一个险恶的问题 5.2 关键的设计概念 5.2.1 软件的首要技术使命:管理复杂度 1. 管理复杂 ...
- 第 5 章 Nova - 030 - Launch和Shut Off操作详解
Launch Launch instance 应该算 Nova 最重要的操作. 1.客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:"帮 ...
最新文章
- arm-linux内核编译过程小结
- SpringMVC控制器接收不了PUT提交的参数的解决方案
- challenges at investment bank
- android上垂直跑马灯,android textview 垂直滚动and水平跑马灯
- android 中的组合控件的设计
- Layer 父子页面之间的交互
- 学籍管理系统 c++作业
- 《领域驱动设计》第二部分:模型驱动设计的构造块 第四章:分离领域 阅读笔记...
- Entity Framework在三层架构中的使用
- 远程服务器登入信息,远程登录服务器查看信息
- 用Visual C#实现文件下载
- 基于JAVA+SpringMVC+Mybatis+MYSQL的外卖点餐系统
- 令人激动!谷歌推强化学习新框架「多巴胺」,基于TensorFlow,已开源丨附github...
- tensorflow eager 模式下打印dataset中的数据
- GO语言学习之路26
- HDU2504 又见GCD
- IntelliJ IDEA 13怎么创建JAVA SE项目
- Java面试全集(中)
- 生成带微信头像的用户二维码
- 时序数据预测:Holt-Winters
热门文章
- JavaScript中的普通函数与构造函数比较
- Java NIO使用及原理分析(三)
- 2014年最值得关注的六大趋势
- 如何修改WINDOWS默认的3389远程端口
- 如果我是小白, 学Python要准备什么呢?
- html 图片时钟,教你五步制作精美的HTML时钟
- php仿攻击,PHP写的仿DDOS攻击程序代码
- java中unknown source_java中GUI编程中的unknown source问题
- Mozilla在Firefox Nightly 92 版本测试兼容性影响
- php中年月日用什么参数,PHP中date()日期函数参数整理