Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Apache Mesos: 分布式系统内核

What is Mesos

Apache Mesos 是一个分布式系统内核——将多台机器的 CPU、内存、存储等资源抽象为统一资源池的集群管理器。它提供资源隔离和共享能力,允许多种分布式应用框架(Spark、Hadoop、Jenkins 等)在同一集群上动态共享资源。

核心创新是两级调度模型:

  • Master 用可插拔分配策略决定给每个框架分配多少资源
  • 框架调度器 决定接受哪些资源、在哪些节点上运行哪些任务
  • 这种薄接口让 Mesos 能扩展到数千节点,同时框架独立演化

Mesos 不是一个调度器——它是资源管理器,把调度决策委托给各应用框架。这区别于 Slurm(HPC 专用)和 Kubernetes(容器编排+内置调度)。

  • 当前版本: 1.12.0,Apache 2.0 许可证,C++ 为主
  • 起源于 UC Berkeley(2011 NSDI 论文),现由 Apache 软件基金会维护

架构

graph TB
    subgraph "Management"
        master[mesos-master<br/>Allocator]
        zk[(ZooKeeper)]
    end

    subgraph "Frameworks"
        fw1[Spark Scheduler]
        fw2[Marathon Scheduler]
        fw3[Custom Framework]
    end

    subgraph "Compute Nodes"
        agent1[mesos-agent<br/>node1]
        agent2[mesos-agent<br/>node2]
        agent3[mesos-agent<br/>nodeN]
    end

    master --- zk
    master -->|resource offers| fw1
    master -->|resource offers| fw2
    master -->|resource offers| fw3
    fw1 -->|accept/launch| agent1
    fw2 -->|accept/launch| agent2
    fw3 -->|accept/launch| agent3
    master --- agent1
    master --- agent2
    master --- agent3

核心 Daemon

Binary功能
mesos-master中央控制器——管理 agent、框架注册、资源分配。默认端口 5050
mesos-agent节点 daemon——运行在每个节点上,启动和监控 executor/task。默认端口 5051
mesos-local单机 Mesos 集群(master+agent 合一),用于开发测试

插件/模块系统

通过动态库(.so)在运行时加载,约 12 种可插拔接口:

模块类型功能
Allocator资源分配策略(默认:层级 DRF)
Isolator容器资源隔离(cgroups、Docker、disk/volume)
Containerizer容器运行时(Mesos、Docker、composing)
Authenticator / Authorizer认证(SASL、JWT)和 ACL 授权
HookMaster/agent 生命周期钩子
QoS ControllerOversubscription 的服务质量管控
Resource Estimator预估可用资源用于 oversubscription

核心概念

数据模型(Protobuf)

消息功能
FrameworkInfo框架描述:用户、名称、角色、能力、failover 超时
Resource资源:name、type(SCALAR/RANGES/SET)、value、role reservation
Offer资源提供:某 agent 上可分配给框架的一组资源
InverseOffer反向提供:请求回收框架的资源(维护/降级)
TaskInfo / TaskStatus任务描述和状态更新
ExecutorInfoExecutor 描述:类型(DEFAULT/CUSTOM)、命令、资源、容器

Task 生命周期:

stateDiagram-v2
    [*] --> STAGING
    STAGING --> STARTING
    STARTING --> RUNNING
    RUNNING --> FINISHED
    RUNNING --> FAILED
    RUNNING --> KILLED
    RUNNING --> ERROR
    RUNNING --> LOST : agent lost
    RUNNING --> UNREACHABLE : agent partitioned
    FINISHED --> [*]
    FAILED --> [*]
    KILLED --> [*]
    ERROR --> [*]
    LOST --> [*]

调度器 API(v1 HTTP)

Events(master → scheduler): SUBSCRIBED、OFFERS、INVERSE_OFFERS、RESCIND、UPDATE、FAILURE、ERROR、HEARTBEAT

Calls(scheduler → master): SUBSCRIBE、ACCEPT、DECLINE、REVIVE、KILL、ACKNOWLEDGE、RECONCILE、SUPPRESS

10 种 Offer 操作

操作功能
LAUNCH / LAUNCH_GROUP启动单个/一组共享 executor 的任务
RESERVE / UNRESERVE动态角色预留/释放
CREATE / DESTROY创建/销毁持久化卷
GROW_VOLUME / SHRINK_VOLUME卷扩容/缩容
CREATE_DISK / DESTROY_DISKCSI 磁盘供应/取消

核心算法:层级 DRF 分配器

默认分配器 HierarchicalDRFAllocatorProcess 实现主导资源公平性(DRF) + 层级角色 + 配额支持。

DRF 原理:

  • 每个框架/角色有一个主导份额 = max(cpu_share, mem_share, disk_share)
  • 排序器按主导份额升序排列(“最穷“的优先获得资源)
  • 分配后该框架的主导份额上升,排名下降
  • 保证多资源维度的 max-min 公平性

两阶段分配:

Algorithm: __generateOffers()

Stage 1 — 配额感知分配:
  for each agent (随机顺序):
    for each role in DRF顺序:
      for each framework in DRF顺序:
        分配预留资源 + 满足配额保证的无预留资源
        更新配额跟踪 + headroom 跟踪

Stage 2 — 尽最大努力分配:
  for each agent (重新随机):
    for each role in DRF顺序:
      for each framework in DRF顺序:
        分配剩余资源(受配额限制 + headroom 约束)

资源预留模型

类型方式
静态预留agent --resources 配置,不可变
动态预留RESERVE 操作或 /reserve HTTP 端点
精炼预留动态预留的进一步特化(如 engeng/front_end

与 Kueue、Slurm 对比

MesosSlurmKueue
调度模型两级(Master→框架)单体(slurmctld)两级(K8s→Kueue)
运行环境裸金属/云 VMHPC 集群Kubernetes
资源模型Offer 供应模式节点分配ResourceFlavor
多租户角色+动态预留Account+QOSClusterQueue+Cohort
适用场景混部多框架HPC/超算K8s 批处理作业

参考