OpenStack 的通用设计思路自上而下分为前端服务(API)、调度服务(Scheduler)、工作服务(Worker)、框架服务(Driver)、消息服务(Messaging)、数据库(Database)六个部分。
一、前端服务(API)
每个 OpenStack 组件可能包含若干个子服务,其中必定有一个前端服务负责接收客户请求。
以Nova为例,Nova-api作为Nova组件对外的唯一窗口,向客户暴露Nova能够提供的功能。当客户需要执行虚拟机相关的操作时,只能向 Nova-api 发送REST(Representational State Transfer,表征状态转移)请求。这里的客户包括终端用户、命令行和OpenStack其他组件。
设计前端服务(API)的好处在于:
(1)对外提供统一接口,隐藏实现细节;
(2)提供REST标准调用服务,便于与第三方系统集成;
(3)通过运行多个 API 实例轻松地实现 API 的高可用性,例如,运行多个Nova-api进程。
二、调度服务(Scheduler)
对于某项操作,如果有多个实体都能够完成任务,那么通常会有一个Scheduler 负责从这些实体中挑选一个最合适的来执行操作。一般来说,Nova 有多个计算节点,当需要创建虚拟机时,Nova-scheduler 会根据计算节点当时的资源使用情况选择一个最合适的计算节点来运行虚拟机。
调度服务好比开发团队中的项目经理。当接到新的开发任务后,项目经理会评估任务的难度,并考察团队成员目前的工作负荷和技能水平,然后将任务分配给最合适的开发人员。除了Nova,块服务组件Cinder也有Scheduler子服务。
三、工作服务(Worker)
调度服务只管分配任务,真正执行任务的是工作服务(Worker)。在 Nova中,这个Worker就是Nova-compute了。将Scheduler和Worker从职能上进行划分,会使OpenStack非常容易扩展。
当计算资源不够无法创建虚拟机时,可以增加计算节点(增加 Worker);当客户的请求量太大调度不过来时,可以增加Scheduler。
四、框架服务(Driver)
OpenStack作为开放的IaaS(Infrastracture as a Service)云操作系统,支持业界各种优秀的技术。这些技术可能是开源免费的,也可能是商业收费的。这种开放架构使得 OpenStack 能够在技术上保持先进性,具有很强的竞争力,同时又不会导致厂商锁定(Lock-in)。
那么,OpenStack 的这种开放性体现在哪里呢?一个重要的方面就是采用基于 Driver 的框架。以 Nova 为例,OpenStack 的计算节点支持多种虚拟化平台,包括KVM(Kernel-based Virtual Machine,KVM虚拟机)、Hyper-V、VMWare、Xen、Docker、LXC等。Nova-compute为这些虚拟化平台定义了统一的接口,虚拟化平台只需要实现这些接口,就可以Driver的形式即插即用到OpenStack中。
五、消息服务(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)提高伸缩性。子服务可以根据需要进行扩展,启动更多的实例以处理更多的请求,在提高可用性的同时提高整个系统的伸缩性。另外,这种变化不会影响其他子服务,也就是说变化对其他子服务是透明的。
六、数据库(Database)
OpenStack 各组件需要维护自身的状态信息。例如,Nova 中有虚拟机的规格、状态,这些信息都是在数据库中维护的。每个 OpenStack 组件在 MySQL 中都有自己的数据库。