Nomad技术手册:整体架构(Architecture)

30 篇文章 2 订阅
19 篇文章 5 订阅

Nomad是一个复杂的系统,有许多不同的部分。为了帮助Nomad的用户和开发人员构建一个关于它如何工作的心理模型,这个文档说明了Nomad的系统架构。

高级主题!这篇文章涵盖了Nomad的技术细节。您不需要了解这些细节就可以有效地使用Nomad。对于那些希望了解它们而不需要通过源代码进行深入研究的人来说,这里提供了详细的文档。

术语表

在描述系统架构之前,我们提供了以下术语表,以帮助阐述所讨论的内容:

  • 作业(job) - 作业是用户提供的一种规范,用于声明Nomad的工作负载。作业是理想状态的一种形式;用户表示作业应该在运行,而不是应该在哪里运行。Nomad的职责是确保实际状态与用户理想的状态匹配。一个作业由一个或多个任务组组成。

  • 任务组(task group) - 任务组是一组必须一起运行的任务。例如,web服务器可能要求日志传输协同进程也始终在运行。任务组是调度单元,这意味着整个组必须在同一个客户机节点上运行,不能分割。

  • 驱动(driver) - 驱动表示执行任务的基本方法。典型驱动包括Docker、Qemu、Java和静态二进制文件。

  • 任务(task) - 任务是Nomad中最小的工作单元。任务由驱动执行,这使得Nomad在它支持的任务类型上具有灵活性。任务指定它们的驱动、驱动的配置、约束和所需的资源。

  • 客户端(client) - Nomad的客户端是一台可以运行任务的机器。所有客户端都运行Nomad代理。代理负责向服务器注册、监视要分配的工作和执行任务。Nomad代理是一个长期存活的进程,它与服务端交互。

  • 分配(Allocation - 分配是作业中的任务组和客户端节点之间的映射。一个作业可能有成百上千个任务组,这意味着必须存在等量的分配来将工作映射到客户端。分配由Nomad服务端创建,作为评估期间的调度决策的一部分。

  • 评估(Evaluation - 评估是Nomad做出调度决策的机制。当理想的状态(作业)或实际的状态(客户端)发生变化时,Nomad创建一个新的评估,以确定是否必须采取任何行动。如有必要,评估可能导致分配的改变。

  • 服务端(Server) - Nomad服务端是集群的大脑。每个区域都有一个服务器集群,它们管理所有作业和客户端、运行评估并创建任务分配。服务端之间相互复制数据,并进行领导人选举,以确保高可用性。服务端跨区域联合以使Nomad具有全局意识。

  • 区域和数据中心(Regions and Datacenters) - Nomad将基础架构建模为区域和数据中心。区域可能包含多个数据中心。服务端被分配到特定的区域,管理状态并在该区域内做出调度决策。多个区域可以联合在一起。例如,您可能拥有一个包含US -east-1和US -west-1数据中心的美国区域,该区域与EU -fr-1和EU -uk-1数据中心连接在一起。区域之间的请求被转发到适当的服务器。数据不会在区域之间复制。

  • 装箱(Bin Packing) - 装箱是用箱子装满物品的过程,使箱子的利用率最大化。扩展到Nomad,其中客户端是“箱子”,物品是任务组。Nomad通过在客户端机器上高效地装箱任务来优化资源。

高级概述

只观察单个区域,在高层次上,Nomad是这样的:

Regional Architecture

在每个区域内,我们都有客户端和服务端。服务端负责接收用户的作业、管理客户端和计算任务分配。每个区域可能有来自多个数据中心的客户端,允许少量服务器处理非常大的集群。

在某些情况下,为了获得可用性或可伸缩性,您可能需要运行多个区域。Nomad支持将多个区域联合成一个集群。在高层次上,这个设置看起来是这样的:

Global Architecture

区域之间完全独立,不共享工作、客户端或状态。它们使用gossip协议松散耦合,允许用户向任何区域提交作业或透明地查询任何区域的状态。请求被转发到需要处理的适当服务器并返回结果。数据不会在区域之间复制。

每个区域的服务端都是一个共识组的一部分。这意味着他们共同努力选出一个有额外职责的领导人。领导人负责处理所有查询和事务。Nomad乐观地认为是并发的,这意味着所有的服务端都并行地参与调度决策。领导人提供必要的额外协调,以确保安全完成调度,并确保客户端没有超额认购。

每个区域预计有三个或五个服务端。这就在出现故障时的可用性和性能之间取得了平衡,因为随着添加更多的服务器,共识变得越来越慢。但是,每个区域的客户端数量没有限制。

客户端被配置为与其区域服务端通信,并使用远程过程调用(RPC)进行通信,以注册自己、发送心跳以获取活性、等待新的分配以及更新分配状态。客户端向服务端注册,以提供可用的资源、属性和已安装的驱动。服务端使用这些信息来调度决策,并创建分配来指派工作给客户端。

用户使用Nomad CLI或API向服务端提交作业。作业表示理想的状态,并提供应该运行的任务集。服务端负责调度任务,这是通过为每个任务找到一个最佳位置来完成的,以便在满足作业指定的所有约束的同时最大化资源利用率。装箱能最大限度地利用资源,在装箱过程中,调度尽量利用机器的所有资源,而不消耗任何维数。作业约束可用于确保应用程序在适当的环境中运行。约束可以是基于硬件特性(如gpu的体系结构和可用性)的技术需求,也可以是操作系统和内核版本等软件特性,也可以是业务约束(如确保在适当的服务器上运行符合PCI的工作负载)。

深入理解

本文简要概述了Nomad的体系结构。每个子系统都有更多的详细信息。共识协议、gossip协议和调度器设计都有更详细的文档说明。

要了解其他详细信息,请查阅代码、在IRC中询问或访问邮件列表。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值