【发布时间】:2014-11-23 13:19:10
【问题描述】:
我正在尝试设计一个通用的作业调度程序,以扩展我的架构知识和在面试中思考系统设计问题的能力。到目前为止,我想出的内容如下。您能否指出我在解决此类问题的方法中应该在哪些方面进行全面的工作?
我已经阅读了很多在线资源,但需要一些具体的指导才能继续前进。
为 X 公司设计一个通用的作业调度程序(这是最大的 当今的科技公司)。
用例
创建/读取/更新/删除作业
调查已运行的作业 过去(工作类型、花费时间、详细信息)
约束
每秒将在系统上运行多少作业?
= # 个作业/小时归因于用户 + # 个作业/小时归因于机器
= 1m * 0.5 /day/24/3600 + 1m/50*20/24/3600
~= 12 个作业/秒
系统需要存储多少数据?
推理:我只存储作业执行细节,实际 工作(脚本执行)在其他机器上完成 收集的数据是结束时间、成功/失败状态等。这些是 > 都可能只是文本,可能带有用于说明目的的图形。一世 将存储 >> 所有在系统中执行的作业的数据,通过 作业调度程序(即过去 10 年)
=(设置作业详细信息的页面大小 + 收集的有关作业的数据大小)* 作业数 * 365 > 天 * 10 年 = 1 MB * 900 000 * 365 * 10
~= 3600 000 000 MB
= 3600 000 GB
=3600 TB =3.6 PB
抽象设计
根据以上信息,我们不需要太多 机器来保存数据。我会将设计分解为 以下:
应用层:服务于请求,显示 UI 细节。
数据存储层: 像一个大哈希表:存储映射 键值(键是按它们运行的日期时间组织的作业, 而这些值将显示这些工作的详细信息)。这是为了启用 轻松搜索历史和/或计划的工作。
瓶颈:
流量:12 个作业/秒并不太具有挑战性。如果这个峰值,我们可以 使用负载均衡器将作业分配到不同的服务器 执行。
数据:在 3.6 TB 时,我们需要一个哈希表,可以很容易地 查询快速访问已在 应用。
扩展抽象设计
这个作业调度器的本质是每个作业都拥有一个 几个状态:待处理、失败、成功、终止。没有业务逻辑 返回少量数据。
为了处理流量,我们可以有一个应用服务器 每秒处理 12 个请求,并在此请求失败时进行备份。在 未来,我们可以使用负载均衡器来减少请求的数量 访问每台服务器(假设 >1 台服务器正在生产中) 优势 这将是减少请求/服务器的数量,增加 可用性(如果一台服务器出现故障,并处理峰值流量 好)。
对于数据存储,要存储 3.6 TB 的数据,我们需要几台机器 将其保存在数据库中。我们可以使用 noSQL 数据库或 SQL 数据库。鉴于如何 后者有更广泛的使用和社区支持,这将有助于 在解决问题并被大公司使用时,我 会选择 mySQL 数据库。
随着数据的增长,我会采用以下策略来处理 它:
1) 在哈希上创建唯一索引
2) 通过添加更多内存垂直扩展 mySQL 数据库
3) 通过分片对数据进行分区
4) 使用主从复制策略与主-主 复制以确保数据的冗余
结论
因此,这将是我对作业调度程序组件的设计。
【问题讨论】:
-
我建议您查看现有大型作业调度程序之一的架构。 slurm(computing.llnl.gov/linux/slurm) 和 grid-engine(gridscheduler.sourceforge.net) 被认为是主要候选人。
标签: architecture job-scheduling n-tier-architecture system-design