大家好,今天咱们继续 openstack 的第二期内容:揭秘 openstack 中的通信机制及 Nova 组件浅析,本次课程分为两个部分进行学习。
Part1 通信机制
大家都知道,openstack 整个系统架构非常的庞大,内部组件较多,且每个组件又是有多个子组件构建而成,各司其职,从而支撑起了整个系统。那么,组件和组件之间究竟是通过什么方式进行通信的呢?组件内部子组件之间又是如何进行通信的呢?
在 openstack 当中,组件之间的通信是通过 Rest 消息(即 http 消息)来完成的,而组件内部子组件之间的通信则是通过消息队列来完成的。一般程序与程序之间的调用通常分为两种方式:同步调用以及异步调用。
◎同步调用:A 直接去调用 B 的接口。举个例子:A 发了个请求给 B,要求 B 去干一件事情。那么在 B 干事情的过程当中,A 一直是处于一种等待状态。等到 B 干完了那件事情后,会把结果返回给 A。此时,A 才能继续干后续的事情。这就是同步调用。
◎异步调用:A 通过消息队列(如 RabbitMQ)间接去调用 B。同样的举个例子:A 发了个请求给 B,要求 B 去干一件事情。这个时候 A 不用等待,直接管自己干后续的事情就可以了。而 B 干完之后也需要通过消息队列的方式将结果返回给 A。这就是异步调用。
一般在一些大型的分布式系统当中,通常采用异步调用的方式。为什么?有几个原因:1. 性能上的考虑。前面也说到了异步调用的过程中,A 是不需要等待结果返回的,这样的话 A 就能去干更多的工作,执行更多的指令,从而提升整个系统的效率和性能。2. 可用性&可伸缩性的考虑。子组件可以通过部署多个来处理更多的请求,一个子组件出现了变化或者故障不会影响到其他子组件,也就是指子组件之间是相互独立的,所谓的变化是透明的。咱们可以通过下文的 Nova 组件的学习来体会一下所谓的异步调用机制。
Part2 计算组件 Nova 浅析
在前面的课程中咱们大致介绍了 openstack 以及它的三大存储组件 Glance、Cinder、Swift,今天我们来学习 openstack 中最核心的服务之一 Nova。Openstack 作为 IaaS 的云操作系统,虚拟机的生命周期管理也是通过 Nova 来实现的。Nova 组件处于 openstack 架构的中心(如下图所示),在整个 openstack 架构中负责维护和管理云环境的计算资源,是用来提供计算服务的。
Nova 的架构比较复杂,其内部的子组件也比较多(如下图所示)
nova-api:对外暴露服务接口,接收和响应客户的 API 调用请求,返回对应结果。nova-api 兼容 Amazon 的 Web 服务接口。这究竟是什么意思呢?简单地讲,如果用户以前用的是 Amazon EC2,并且用了 EC2 的 API 开发了一些工具用来管理虚拟机,那么如果现在要换成 Openstack,上述这些用 EC2 的 API 开发的工具就可以无缝地迁移到 openstack 上面,并且不需要做任何修改。
nova-scheduler:提供虚拟机的调度服务,通过①过滤②权重(CPU、内存、CPU+内存)③随机 三种方式来选择合适的主机进行虚拟机的运行。
nova-conductor:帮助 nova-compute 访问数据库,并且完成复杂流程的控制。这里可能大家会有个疑问:为什么 nova-conductor 需要帮助 nova-compute 去访问数据库?nova-compute 直接去访问数据库可否可行?答案是否。其实在很久以前的 openstack 中,nova-compute 是可以直接去访问数据库的,但是这样做会存在非常大的安全隐患。为什么呢?(大家在学习的过程中应该多问自己为什么,这样有利于大家的思考以及针对性的学习)两个原因:一、因为 nova-compute 是部署在计算节点之上的,而数据库是部署在控制节点之上,nova-compute 要想去访问数据库就必须在本节点之上配置数据库的连接信息等等,当计算节点被黑客攻击入侵时,那么数据库也就存在非常大的风险。所以,为了安全性的考虑,在 G 版本之后,就出现了一个叫做 nova-conductor 的子组件,这个组件是部署在控制节点之上的,由它去替代 nova-compute 完成对数据库的访问操作,从而增强了安全性。二、可扩展性的考虑。因为 nova-compute 与 nova-conductor 之间是通过消息队列进行交互的,所以咱们可以通过部署多个 nova-conductor,从而应对在大规模部署 openstack 情况下,日益增长的计算节点需要访问数据库的需求。
nova-compute:管理虚拟机的核心服务,通过调用 Hypervisor API 来实现虚拟机生命周期管理和资源管理。(Hypervisor:虚拟化管理程序,接入底层硬件资源,并对硬件资源进行抽象)
nova-novncproxy:novnc 访问虚拟机代理,基于 Web 浏览器的 VNC(Virtual Network Computing)访问。
nova-consoleauth:novnc 访问虚拟机鉴权,负责对访问虚拟机控制台请求提供 Token 认证。
接下来咱们从虚拟机创建流程来简单看 Nova 中的子组件是如何进行协同工作的?(这里的步骤仅包括了 Nova 组件,后续等讲完了所有组件之后,会有完整的虚拟机创建流程,大家放心哈!)
①当用户此时产生了一个需求,比如说:我需要一台虚拟机。这个时候会向 nova-api 发送 API 请求消息,请求创建一台虚拟机。
②nova-api 接收到这个外部请求之后,会进行一定的处理,通过消息队列 RabbitMQ 向 nova-conductor 发送创建虚拟机请求,nova-conductor 收到请求消息后,会通过消息队列 RabbitMQ 请求 nova-scheduler 筛选出一个合适的计算节点。
③nova-scheduler 接收到该消息后,会执行调度算法,通过①过滤②权重(CPU、内存、CPU+内存)③随机 等方式从若干个计算节点中选出一个合适的节点 node1。
④计算节点选择好之后,nova-scheduler 会通过消息队列 RabbitMQ 向 nova-conductor 返回结果,nova-conductor 会通过消息队列 RabbitMQ 向 nova-compute 请求创建虚拟机。
⑤在上述的过程中,若 nova-compute 需要去更新数据库的信息,则会通过消息队列 RabbitMQ 去向 nova-conductor 发送信息,有 nova-conductor 负责数据库的访问。
本期课程到这里就先告一段落了,咱们一起学习了 openstack 中组件之间以及组件内部子组件之间的通信机制,并且学习了 openstack 的核心组件之一 Nova。相信大家学习完之后也有了一定的了解。想要深入学习的同学可以课下去浏览 openstack 开源社区,寻找对应的文档进行一个系统的学习,加强对 openstack 的整体理解。



