一、调度系统概述:集群资源调度的本质
大家好,我是你们的老朋友。今天咱们聊聊集群资源调度。
说白了,调度系统就是一群服务器里的「大管家」。你想想看,几十台、几百台机器摆在那,谁跑什么任务、用多少CPU、占多少内存,总得有人管吧?这个「管」的过程,就是调度。
我刚开始接触分布式系统时,觉得调度不就是排队吗?后来踩了坑才明白——调度是分布式系统的灵魂。一个糟糕的调度器,能让百台机器跑出单机的性能;一个好的调度器,能让资源利用率翻倍。
1.1 集群资源调度的定义
集群资源调度,简单说就是:把用户提交的任务,合理地分配到集群的各个节点上执行。
这里有几个关键要素:
- 资源:CPU、内存、磁盘、网络带宽、GPU等
- 任务:批处理作业、在线服务、容器、微服务等
- 节点:物理机、虚拟机、容器宿主机
- 调度策略:决定「谁先跑」「跑在哪」的规则
核心公式:调度 = 资源匹配 + 约束满足 + 目标优化
嗯,这里要注意:调度不是简单的「先来后到」。它要考虑任务优先级、数据本地性、资源碎片、负载均衡……一堆约束条件。我曾经在一个项目中,就因为没处理好数据本地性,导致任务跑了3小时才完成——其实优化后只需要40分钟。
1.2 核心目标:三个维度
调度系统追求的目标,我总结为三个词:快、多、省。
| 目标 | 含义 | 我踩过的坑 |
|---|---|---|
| 高吞吐 | 单位时间内能处理的任务数量 | 曾经调度器每秒只能处理200个任务,业务高峰期直接崩溃 |
| 低延迟 | 任务从提交到开始执行的时间 | 有个在线推理服务,调度延迟超过500ms,用户直接超时 |
| 资源利用率 | 集群资源被有效使用的比例 | 某客户集群利用率只有30%,钱花了但性能没上去 |
这三个目标其实是互相制约的。你想想看:
- 追求高吞吐,可能会增加排队时间,延迟就上去了
- 追求低延迟,得预留资源,利用率就下来了
- 追求高利用率,任务挤在一起,延迟和吞吐都可能受影响
我个人习惯是:先明确业务场景,再定优先级。离线批处理看重吞吐,在线服务看重延迟,混合部署则要平衡。
1.3 常见调度架构
调度架构经历了三代演变。我画了一张图,帮你快速理解:
1.4 三种架构详解
1.4.1 单体调度器
这是最原始的架构。一个中央调度器,掌握所有节点的资源信息,统一做决策。
优点:
- 实现简单,逻辑清晰
- 全局最优,能做出最好的调度决策
- 容易调试和排查问题
缺点:
- 单点瓶颈——所有请求都经过它
- 扩展性差——集群大了就扛不住
- 可用性低——调度器挂了,整个集群瘫痪
避坑指南:我曾经在一个2000节点的集群上部署了单体调度器,结果调度延迟从50ms飙升到5秒。后来发现是状态同步的锁竞争太严重。如果你节点数超过500,建议别用单体架构。
1.4.2 两级调度器
为了解决单体的问题,两级调度器出现了。它把「资源管理」和「任务调度」分开:
- 第一级:中央资源管理器,负责收集和分配资源
- 第二级:多个应用调度器,各自管理自己的任务
我举个例子你就明白了。中央资源管理器就像一个「房东」,它只管把房子租出去。至于租客怎么装修、怎么住,那是租客自己的事。每个应用调度器就是一个「租客」。
代表系统:
- Apache Mesos
- Hadoop YARN(改进版)
个人经验:Mesos 的两级架构很适合多框架共存。我曾在同一个集群上同时跑 Spark 和 TensorFlow,互不干扰。但要注意——两级调度器无法做到全局最优,因为每个调度器只看到自己那一亩三分地。
1.4.3 共享状态调度器
这是目前最主流的架构。多个调度器实例共享同一个资源状态,通过乐观并发控制来避免冲突。
说白了,就是「大家一起看同一张地图,谁先抢到谁先跑」。Kubernetes 就是典型的共享状态调度器。
核心机制:
- 所有调度器读取同一份资源状态
- 调度时先「乐观锁定」,再提交
- 如果冲突,重试即可
优点:
- 高并发——多个调度器同时工作
- 高可用——一个挂了,其他的照常运行
- 扩展性好——加调度器实例就能提升吞吐
缺点:
- 实现复杂——需要处理并发冲突
- 状态一致性问题——多个调度器看到的状态可能不一致
我的建议:如果你从零开始搭建调度系统,直接选共享状态架构。Kubernetes 已经证明了这条路是可行的。但要注意,共享状态调度器对存储后端要求很高——etcd 的性能直接决定了调度器的天花板。
1.5 如何选择调度架构?
没有银弹。我根据项目经验,给你一个参考:
| 场景 | 推荐架构 | 原因 |
|---|---|---|
| 小集群(<100节点) | 单体调度器 | 简单够用,维护成本低 |
| 多框架共存 | 两级调度器 | 框架隔离性好 |
| 大规模集群 | 共享状态调度器 | 扩展性好,高可用 |
| 在线服务为主 | 共享状态调度器 | 低延迟,快速响应 |
| 离线批处理为主 | 单体或两级 | 吞吐优先,延迟不敏感 |
嗯,最后说一句:调度架构没有最好,只有最合适。我见过有人用 Kubernetes 跑批处理,也见过有人用 YARN 跑在线服务——只要满足业务需求,就是好架构。
想要更多资料,联系可可