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-scheduler 会根据计算节点当时的资源使用情况选择一个最合适的计算节点来运行虚机。
 
调度服务好比是开发团队中的项目经理,当接到新的开发任务后,项目经理会评估任务的难度,考察团队成员目前的工作负荷和技能水平,然后将任务分配给最合适的开发人员。除了Nova,块存储组件Cinder 也有Scheduler 子服务,后面我们会详细讨论。
 
Worker 工作服务
 
调度服务只管分配任务,真正执行任务的是 Worker 工作服务。在Nova中,这个Worker 就是 nova-compute了。将Scheduler 和 Worker 从职能上进行划分使得OpenStack非常容易扩展:
 
    1、当计算资源不够了无法创建虚机时,可以增加计算节点(增加Worker)
    2、当客户的请求量太大调度不过来时,可以增加Scheduler
 
Driver 服务
 
OpenStack 作为开放的 infrastructure 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 的配置文件中,由 compute_driver 配置想指定该计算节点使用哪种 Hypervisor 的driver
 
stack@DevStack-Controller:~$ cat /etc/nova/nova.conf  | grep compute_driver
compute_driver = libvirt.LibvirtDriver
 
在我们的环境中因为是KVM,所以配置的是 Libvirt 的 driver
 
不知大家是否记得我们在学习 Glance 的时候,OpenStack 支持多种backend 来存放image。可以是本地文件系统、Cinder、Ceph、Swift等。其实这也是一个driver架构。只要符合 Glance 定义的规范,新的存储方式可以很方便的加入到backend支持列表中。在后面 Cinder 和 Neutron 中我们还会看到 driver 框架的应用。
 
Messaging 服务
 
在前面创建虚机的流程示意图中,我们看到 nova-*  子服务之间的调用严重依赖 Messaging 。Messaging 是nova-* 子服务交互的中枢。
 
 
以前没接触过分布式系统的同学可能会不太理解为什么不让API 直接调用Scheduler,或是让Scheduler 直接调用Compute,而是非要通过 Messaging 进行中转。这里做一些解释。程序之间的调用通常分两种:同步调用和异步调用。
 
同步调用:
 
API直接调用 Scheduler 的接口是同步调用。其特点是API发出请求后需要一直等待,直到Scheduler完成对Compute的调度,将结果返回给API后API才能继续做后面的工作。
 
异步调用:
 
API通过Messaging 间接调用 Scheduler 就是异步调用。其特点是API 发出请求后不需要等待,直接返回,继续做后面的工作。Scheduler 从 Messaging接收到请求后执行调度操作,完成后将结果也通过Messaging 发送给API  。在OpenStack这类分布式系统中,通常采用异步调用的方式,其好处是:
 
    1、解耦各子服务。子服务不需要知道其他服务在哪里运行,只需要发送消息给Messaging 就能完成调用
    2、提高性能异步调用使得调用者无需等待结果返回。这样可以继续执行更多工作,提高系统总的吞吐量
    3、提高伸缩性,子服务可以根据需要进行扩展,启动更多的实例处理更多的请求,在提高可用性的同时也提高了整个系统的伸缩性。而且这种变化不会影响到其他子服务,也就是说变化对别人是无感的。
 

O025、OpenStack 通用设计思路的更多相关文章

  1. OpenStack 通用设计思路 - 每天5分钟玩转 OpenStack(25)

    API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...

  2. OpenStack 通用设计思路

    API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...

  3. iOS开发:代码通用性以及其规范 第二篇(猜想iOS中实现TableView内部设计思路(附代码),以类似的思想实现一个通用的进度条)

    在iOS开发中,经常是要用到UITableView的,我曾经思考过这样一个问题,为什么任何种类的model放到TableView和所需的cell里面,都可以正常显示?而我自己写的很多view却只是能放 ...

  4. asp.net abp模块化开发之通用树2:设计思路及源码解析

    一.前言 上一篇大概说了下abp通用树形模块如何使用,本篇主要分析下设计思路. 日常开发中会用到很多树状结构的数据,比如:产品的多级分类.省市区县,大多数系统也会用到类似“通用字典/数据字典”的功能, ...

  5. Redis入门指南(第2版) Redis设计思路学习与总结

    https://www.qcloud.com/community/article/222 宋增宽,腾讯工程师,16年毕业加入腾讯,从事海量服务后台设计与研发工作,现在负责QQ群后台等项目,喜欢研究技术 ...

  6. YYCache设计思路及源码学习

    设计思路 利用YYCache来进行操作,实质操作分为了内存缓存操作(YYMemoryCache)和硬盘缓存操作(YYDiskCache).内存缓存设计一般是在内存中开辟一个空间用以保存请求的数据(一般 ...

  7. Redis设计思路学习与总结

    版权声明:本文由宋增宽原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/222 来源:腾云阁 https://www.qclo ...

  8. 数据权限设计——基于EntityFramework的数据权限设计方案:一种设计思路

    前言:“我们有一个订单列表,希望能够根据当前登陆的不同用户看到不同类型的订单数据”.“我们希望不同的用户能看到不同时间段的扫描报表数据”.“我们系统需要不同用户查看不同的生产报表列”.诸如此类,最近经 ...

  9. [三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路

    Stream的概念定义   官方文档是永远的圣经~     表格内容来自https://docs.oracle.com/javase/8/docs/api/   Package java.util.s ...

随机推荐

  1. vue如何动态绑定v-model

    如图所示有三个字段要从弹出的输入框取值点击字段会弹出上面的弹窗,输入input会响应变化,比如点击身高,弹出输入框,输入值后身高后面会跟着一个同样的值点击体重,弹出输入框,输入值后体重后面会跟着一个同 ...

  2. 在CentOS7阿里云服务器部署ThinkPHP5,并配置phpstrom实现同步开发(微信小程序及管理员后端)

    小程序和后端同步开发 1.服务器安装tp5框架: 方法很多比如:github.linux命令直接手动下.composer 都可以,方法很多,百度一下,不再累述 2.这时你会发现怎么都访问出现不了这个令 ...

  3. Android中代码优化

    两个基本准则: 1.不要做冗余的工作 2.尽量避免次数过多的内存分配操作 Handler和内部类的正确使用 正确使用Context 正确使用Java四种引用方式:软引用,弱引用,虚引用,强引用 避免创 ...

  4. 【转载】网页JS获取当前地理位置(省市区)

    眼看2014又要过去了,翻翻今年的文章好像没有写几篇,忙真的或许已经不能成为借口了,在忙时间还是有的,就像海绵里的水挤挤总会有滴.真真的原因是没有学习过什么新的技术,工作过程中遇到的问题也不是非常难并 ...

  5. 实验一 绘制任意斜率的直线段 | 使用VS2017工具

    这世界上有很多坑,注定有些坑是要填的.下面我就用VS2017使用MFC对这个课堂实验进行填坑. 一.实验目的 (1)掌握任意斜率直线段的重点 Bresenham 扫描转换算法: (2)掌握 Cline ...

  6. linux下的缓存机制buffer、cache、swap

    一.缓存机制介绍 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果 ...

  7. aws S3存储概念

    S3存储(Simple Storage Service) 存储桶:存储桶是S3中用于存储对象的容器.每个对象都存储在一个存储桶中. 对象:对象是S3中存储的基本实体.对象由对象数据和元数据组成.数据部 ...

  8. 软件缺陷5C标准

    Correct(准确) :每个组成部分的描述准确,不会引起误解 Clear(清晰): 每个组成部分描述清晰,易于理解 Concise(简洁): 只包含必不可少的信息,不包括任何多余的内容 Comple ...

  9. 说说mysql的存储引擎,有什么区别?索引的介绍

    InnoDB 支持ACID事务,支持事务的四种隔离级别,串行化,可重复读,读已提交,读未提交. 支持行级锁以及外检约束:所以可以支持写并发. 不存储总行数. 逐渐索引采用聚集索引,索引的数据域存储数据 ...

  10. C语言链表之两数相加

    题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...