☰
Apache Mesos 0.27.0 版本解析:Quota 配额、多磁盘与隐式角色
2026/10/14 2:21:08 网站建设 项目流程
  • 云原生

【免费下载链接】mesos

Apache Mesos

项目地址:https://gitcode.com/gh_mirrors/mesos2/mesos
点击查看免费下载

Apache Mesos 0.27.0 是 Mesos 在资源管理能力上的一次里程碑式发布,首次引入**资源配额(Quota)与多磁盘(Multiple Disks)支持,并通过隐式角色(Implicit Roles)**解除了角色白名单的静态约束,同时显著优化了大集群下state端点的性能。本文以 0.27.0 官方发布说明为骨架,结合仓库内的配额文档、多磁盘文档、角色文档、升级指南及核心源码与测试,逐一解析这些特性背后的设计与实现,帮助调度器开发者、集群运维人员快速理解该版本的能力边界与升级要点。

一、版本总览

0.27.0 是继 0.26.x 之后的重大特性版本,主要亮点(均对应 CHANGELOG 中 Version 0.27.0 一节)包括:

  • [MESOS-1791] 资源配额(Quota):提供**非可撤销(non-revocable)**的资源保证,且配额不绑定特定 Mesos Agent,与静态预留(Reservation)形成互补;
  • [MESOS-191] 多磁盘(Multiple Disks):允许运维人员在 Agent 上暴露 Root、Path、Mount 三种磁盘资源,为磁盘 IO 密集型应用提供可靠、高性能的存储方案;
  • [MESOS-4085] 灵活角色 / 隐式角色(Implicit Roles):弃用 Master 启动时通过--roles指定静态角色白名单的方式;
  • [MESOS-2353] 大集群 state 端点性能改进:重写state/state.json端点的 JSON 序列化路径。

此外,本版本还包含167+ 项 bug 修复与改进,API 层面另有几处重要变更:

  • [MESOS-313] 向调度器上报 Executor 终止事件:executorLost回调首次真正生效(详见 docs/upgrades.md);
  • [MESOS-2315] 移除已弃用的CommandInfo::ContainerInfo;
  • [MESOS-4154] 将shutdown_frameworks重命名为teardown_frameworks,影响--acls中的本地授权器配置(docs/upgrades.md)。

二、资源配额(Quota):不绑定 Agent 的资源保证

2.1 配额解决什么问题

当多个用户共享一个集群时,运维人员往往希望对每个用户可使用的资源量设置上限。Quota 正是为此设计:允许运维人员以角色(role)为单位设置资源限制,保证角色在集群范围内获得确定的资源份额。与 Reservation 相比,Quota 不把资源固定绑定在某台 Agent 上,因此角色可以在任何满足条件的 Agent 上获得资源,调度弹性更强。

注意:0.27.0 中的配额 API 面向guarantee(保证),即确保角色可获得的最小资源量;配额limit(限制)语义在 Mesos 1.9+ 才直接对外暴露,并在后续版本中取代 guarantee(详见 docs/quota.md 的 Deprecated 说明)。本文按 0.27.0 当时的实现展开。

2.2 支持与不支持的资源类型

根据 docs/quota.md 的 "Supported Resources" 一节:

  • 支持:cpus、mem、disk、gpus,以及任何SCALAR类型的自定义资源;
  • 不支持:ports,以及任何RANGES或SET类型的自定义资源。

2.3 设置配额(Update Quota)

默认情况下,每个角色都没有资源限制。运维人员通过 Master 的 v1 HTTP API 发送UPDATE_QUOTA请求来修改一个或多个角色的配额:

curl --request POST \ --url http://<master-ip>:<master-port>/api/v1/ \ --header 'Content-Type: application/json' \ --data '{ "type": "UPDATE_QUOTA", "update_quota": { "force": false, "quota_configs": [ { "role": "dev", "limits": { "cpus": { "value": 10 }, "mem": { "value": 2048 }, "disk": { "value": 4096 } } }, { "role": "test", "limits": { "cpus": { "value": 1 }, "mem": { "value": 256 }, "disk": { "value": 512 } } } ] } }'

要点:

  • all-or-nothing 语义:如果其中任意一个角色的配额更新无效或未通过授权,整个请求都不会生效;
  • force字段:当当前配额消费量已超过新提供的限额时,请求默认会被拒绝;将force置为true可覆盖该检查(对应 CHANGELOG 中的 [MESOS-3911]);
  • offer 回收:Master 会尝试撤回(rescind)足够数量的 offer,确保角色不会超出其限额(对应 [MESOS-3912])。

从源码看,配额更新由 src/master/quota.cpp 中的UpdateQuota::perform完成:它会先逐一校验每个QuotaConfig,然后将其写入 Registry 的quota_configs,并同步维护QUOTA_V2这一 Master 最小能力(minimum capability)标记——这保证了旧版本 Master 不会误读新格式的注册表数据。该实现位于 Master 的注册表操作(Registry Operation)链路中,因此配额配置可随 Master 的高可用选举持久化。

2.4 查看配额

Web UI:Roles标签页会展示所有已知角色的资源核算信息,包括已配置的配额与配额消费量。

v1 APIGET_QUOTA:返回当前配额配置:

$ curl --request POST \ --url http://<master-ip>:<master-port>/api/v1/ \ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ --data '{ "type": "GET_QUOTA" }'

响应示例(JSON 结构见 docs/quota.md):

{ "type": "GET_QUOTA", "get_quota": { "status": { "infos": [ { "configs" : [ { "role": "dev", "limits": { "cpus": { "value": 10.0 }, "mem": { "value": 2048.0 }, "disk": { "value": 4096.0 } } }, { "role": "test", "limits": { "cpus": { "value": 1.0 }, "mem": { "value": 256.0 }, "disk": { "value": 512.0 } } } ] } ] } } }

/roles端点:查看配额的消费量(consumption):

$ curl http://<master-ip>:<master-port>/roles

响应示例:

{ "roles": [ { "name": "dev", "weight": 1.0, "quota": { "role": "dev", "limit": { "cpus": 10.0, "mem": 2048.0, "disk": 4096.0 }, "consumed":{ "cpus": 2.0, "mem": 1024.0, "disk": 2048.0 } }, "allocated": { "cpus": 2.0, "mem": 1024.0, "disk": 2048.0 }, "offered": {}, "reserved": { "cpus": 2.0, "mem": 1024.0, "disk": 2048.0 }, "frameworks": [] } ] }

配额消费量的口径:一个角色的配额消费量 = 它的分配(allocations)+ 预留(reservations)。即使预留资源尚未被分配,也会计入配额消费;而offered(被提供的)资源不记入配额消费(docs/quota.md)。

监控指标:Allocator 暴露以下配额指标键:

  • allocator/mesos/quota/roles/<role>/resources/<resource>/guarantee
  • allocator/mesos/quota/roles/<role>/resources/<resource>/limit

2.5 配额实现的注意事项

  • 不支持嵌套角色:例如eng/prod这类带斜杠的角色不能设置配额;
  • Failover 行为:为了在 Master 故障恢复时正确执行限额,Allocator 会暂停并停止发放 offer,直到至少80% 的 Agent 重新注册或10 分钟过去(这两个参数计划在后续版本中改为可配置,对应 [MESOS-4073]);
  • 配额消费的检查、offer 撤回与 DRF 排序的联动在 0.27 中已有完整测试覆盖(如 CHANGELOG 中 [MESOS-3984]、[MESOS-3985] 所列的allocate()与 rescind 测试)。

三、多磁盘(Multiple Disks):为 IO 密集应用提供多种存储语义

3.1 三种磁盘类型

Mesos 为运维人员提供了暴露多种磁盘资源的机制。框架在创建持久卷时,可以通过检查Offer中磁盘资源的source字段决定使用哪块磁盘(docs/multiple-disk.md)。磁盘资源共有三种形式:

类型判定方式说明
RootDiskInfo未设置source基础磁盘资源,通常映射到主操作系统盘,数据落入 Agent 的work_dir
Pathsource枚举为PATH,并带root目录辅助磁盘,可被切分成更小的持久卷,适合日志、归档、缓存等非性能敏感场景
Mountsource枚举为MOUNT,并带root挂载点辅助磁盘,不可被切分,提供独占磁盘设备的保证,适合数据库、WAL、性能敏感应用

3.2 通过--resources配置磁盘

运维人员可在 Agent 启动时通过 JSON 格式的--resources选项提供这些磁盘(源码入口见 src/slave/flags.cpp 的resources标志)。默认情况下(未指定--resources时),Agent 只会向集群提供 Root 磁盘。

重要提示:一旦通过--resources手动指定了任何磁盘资源,Mesos 将停止自动探测 Root 磁盘。因此若仍需使用 Root 磁盘,必须按下述格式手动指定它。

Root 磁盘示例(可选项role表示将该磁盘静态预留给单个角色):

[ { "name" : "disk", "type" : "SCALAR", "scalar" : { "value" : 2048 } } ]

Path 磁盘示例:运维只需创建一个目录并将其作为root即可。多个Path磁盘位于同一文件系统时需要静态划分磁盘空间:例如 10GB 设备挂载于/foo,配置/foo/disk1与/foo/disk2两块 Path 磁盘时,二者总量不应超过 10GB,以免设备空间耗尽。Path 磁盘也很适合在测试/预发环境用操作系统盘上的几个目录模拟多磁盘环境。

[ { "name" : "disk", "type" : "SCALAR", "scalar" : { "value" : 2048 }, "disk" : { "source" : { "type" : "PATH", "path" : { "root" : "/mnt/data" } } } } ]

Mount 磁盘示例:在 Linux 上,Mount磁盘必须对应/proc/mounts表中的挂载点。运维应将物理磁盘以首选文件系统挂载,并将挂载点作为root。

[ { "name" : "disk", "type" : "SCALAR", "scalar" : { "value" : 2048 }, "disk" : { "source" : { "type" : "MOUNT", "mount" : { "root" : "/mnt/data" } } } } ]

Block 磁盘:Mesos 目前不允许运维直接暴露裸块设备。未来可能支持,但需要先通过设计文档解决安全与灵活性方面的顾虑。

3.3 Mount 磁盘的行为差异

  • 独占与报错语义:由于 Mount 磁盘不可切分,应用在超出卷容量时会依赖文件系统正确传播ENOSPC等磁盘错误;正因如此,disk/du隔离器对 Mount 磁盘被禁用(对应 CHANGELOG 中的 [MESOS-4506]);
  • 目录结构差异:Path磁盘会在root下创建子目录来区分不同卷,销毁持久卷时会一并删除该子目录;Mount磁盘则不创建子目录,应用可使用设备上的完整文件系统——这允许任务访问包含预先存在目录结构的卷(例如已有的 Postgres 数据目录或 HDFS 数据目录),销毁卷时 Mesos 会删除卷内文件但不会删除根目录(挂载点)(docs/multiple-disk.md)。运维在检查或清理残留数据时需注意这一区别。

3.4 源码侧的支撑

多磁盘能力在 0.27 中通过给Resource.DiskInfo增加Source字段实现(CHANGELOG 中的 [MESOS-4378]),并配套完成了一系列改造:资源运算对DiskInfo.Source的适配([MESOS-4380])、按DiskInfo.Source创建持久卷目录([MESOS-4400])、文件系统隔离器从正确位置查找持久卷目录([MESOS-4402])、Agent 初始化时校验Source.Path中目录存在性([MESOS-4403])。在 src/common/resources_utils.cpp 中可以观察到磁盘资源在比较与合并时会剥离persistence与volume而保留source的细节处理,这正是 Root/Path/Mount 三类磁盘身份判定在底层算术中的体现。

四、隐式角色(Implicit Roles):告别静态白名单

4.1 从角色白名单到隐式角色

在 Mesos 0.26 及更早版本中,只有出现在--roles白名单中的角色才能被使用,运维通常需要同时配置 ACL 与白名单。0.27 引入了隐式角色概念([MESOS-4085]):如果 Master 启动时未指定--roles,则任意角色名都可以被使用。这意味着:

  • 角色不再需要预先声明,框架可以动态注册新角色;
  • 控制“哪些 principal 可以使用哪些角色”的工作应完全交给 ACL 授权完成;
  • --roles白名单功能仍被支持,但已弃用(deprecated)。

这一点在源码中有直接印证。src/master/flags.cpp 中--roles标志的帮助文本明确写道:

"A comma-separated list of the allocation roles that frameworks in this cluster may belong to.This flag is deprecated; if it is not specified, any role name can be used."

src/tests/role_tests.cpp 的RoleTest.ImplicitRoleRegister测试完整验证了该行为:框架以一个新角色名new-role-name注册后,能够正常收到 offer、完成动态预留(dynamic reservation)并创建持久卷。ImplicitRoleStaticReservation(src/tests/role_tests.cpp)则验证了隐式角色下静态预留新角色资源并运行任务的能力。

4.2 角色语义的配套变化

角色是 Mesos 中的"资源消费者"概念,代表组织内的用户、团队、服务或框架(docs/roles.md)。0.27 的角色体系还有以下配套事实:

  • 多个框架可订阅同一角色(需声明MULTI_ROLE能力),共享该角色资源的框架应相互协作(docs/roles.md);
  • 默认角色*表示未预留资源;框架未提供FrameworkInfo.role时会被分配到*;
  • 角色名必须是合法的目录名:不能为空、不能是.或..、不能以-开头、不能包含斜杠/退格/空白字符(docs/roles.md);
  • DRF 排序纳入预留资源:0.27 中预留资源开始计入加权 DRF 角色排序(CHANGELOG 中的 [MESOS-4526]、[MESOS-4527]),因此如果运维显式设置了角色权重,可能需要随集群中预留资源的变化调整权重(docs/upgrades.md)。

4.3 对自定义 Allocator 与隔离器模块的影响

升级到 0.27 时需要注意:Allocator API 因隐式角色的引入而发生变化,自定义 Allocator 实现需要更新(对应 [MESOS-4000])。此外,隔离器(Isolator)的prepare接口改用ContainerConfigprotobuf,并将ContainerPrepareInfo重命名为ContainerLaunchInfo——隔离器模块编写者需要按新接口调整并重新编译(对应 [MESOS-4240]、[MESOS-4282],详见 docs/upgrades.md)。

五、state 端点性能改进与其余修复

[MESOS-2353] 对大规模集群下state端点的性能进行了专项改进:其 JSON 序列化路径被迁移到 stout 新引入的jsonify设施上(CHANGELOG 中的 [MESOS-4236]~[MESOS-4239]),同时state.json的响应结构也在后续版本中持续被修正(如 0.26.2 中修复的重复active字段问题),保证超大集群的运维查询体验。

0.27.0 其余值得关注的修复与改进还包括:可配置的已完成任务/框架历史大小([MESOS-3307])、使用线程安全的strerror_r替代strerror([MESOS-3551])、Master 故障切换后框架进程挂起问题的修复([MESOS-3595])、HTTP Basic Authentication 支持([MESOS-3232])、--force配额健全性检查开关([MESOS-3911])、日志大小受限的 ContainerLogger 模块([MESOS-4136])等,完整清单见 CHANGELOG。

六、从 0.26.0 升级到 0.27.0

按照 docs/upgrades.md,从 Mesos 0.26.0 集群滚动升级到 0.27.0 是直接可行的,仅包含少量向后兼容的弃用项。升级要点如下:

  1. 隐式角色:若省略--roles,任意角色名可用;角色准入控制改用 ACL;
  2. executorLost回调:Agent 检测到自定义 Executor 终止时,调度器接口的executorLost回调现在会被调用(此前从未触发),请确保调度器可以安全处理该回调(注意该回调可能无法可靠投递);
  3. 隔离器接口:prepare改用ContainerConfig,ContainerPrepareInfo更名为ContainerLaunchInfo,模块需重新编译;
  4. ACL 重命名:shutdown_frameworks弃用,改用teardown_frameworks,影响--acls;
  5. 预留资源计入 DRF:显式设置的权重可能需要调整。

滚动升级的执行顺序为:重建并安装所有模块 → 安装新 Master 二进制并重启 Master → 安装新 Agent 二进制并重启 Agent → 用最新 native 库/JAR/egg 升级调度器并重启 → 必要时升级 Executor。新角色体系与配额、多磁盘能力均保持向后兼容,因此可以在不停机的条件下逐组件完成升级。

七、小结

Apache Mesos 0.27.0 通过Quota提供了面向角色的、不绑定 Agent 的非可撤销资源保证;通过Multiple Disks将存储从单一 Root 盘扩展为 Root/Path/Mount 三种语义;通过Implicit Roles移除了角色白名单的静态限制并推动授权工作全面转向 ACL;同时借助jsonify重构提升了 state 端点在大型集群中的响应性能。对于调度器开发者而言,需要注意executorLost回调的启用与隔离器接口变更;对于集群运维人员而言,配额配置、多磁盘暴露与升级顺序是本版本落地的三个关键抓手。后续版本(1.9+)在此基础之上将配额从 guarantee 语义演进为 limit 语义,但 0.27.0 确立的配额 API 骨架、多磁盘模型与隐式角色机制至今仍是理解 Mesos 资源管理体系的重要基石。

  • 云原生

【免费下载链接】mesos

Apache Mesos

项目地址:https://gitcode.com/gh_mirrors/mesos2/mesos
点击查看免费下载

相关推荐

上一篇:Cartography实现标签页控制器:iOS应用界面设计
下一篇:如何扩展ViewAnimator动画库:第三方动画类型与集成方案完全指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询