组队
distributed-system-from-scratch
2025

从零开始的分布式系统

集群,轻而易举啊!...

分布式架构设计

随着云计算和大数据技术的发展,分布式系统在各个领域得到了广泛应用。相比于传统的单一机器系统,分布式系统能够管理集群规模的机器,并动态地协调机器间的通信来提高执行性能和资源利用率。

对于现阶段的大多数计算任务来说,分布式系统并不是必需的。只有当任务的计算量非常大,单台机器(节点)无法满足需求,且硬件升级的成本过高时,我们才需要考虑使用分布式系统来连接多台机器协同工作。但分布式系统的发明,使利用普通机器处理超大规模计算任务成为可能,极大地降低了特定场景下的计算成本。

在本题中,你需要从零开始搭建一个分布式系统。你可以参考市面上已有的分布式系统1,也可以参考相关的论文和书籍2,但请注意,你需要有自己的设计思路和实现方案,不能简单地复制已有产品。

我需要做什么?

分布式系统通常包括分布式计算和分布式存储两大方向。无论是计算还是存储,都要求分布式系统高效稳定地处理多机器(节点)间的数据通信工作,并通过协议和机制约束来管理机器的上线、下线和故障恢复等复杂问题。

所以,分布式系统需要具备以下能力:

  1. 节点管理: 能够动态地添加和移除节点,确保系统的可扩展性和灵活性。
  2. 数据一致性: 在节点动态变化、并发处理任务负载的情况下,确保系统中的数据保持一致,避免数据竞争和数据丢失。
  3. 负载均衡: 动态调整各个节点的负载,以提高系统的整体性能。
  4. 故障恢复: 能够快速检测和恢复节点故障,确保系统的高可用性。

我该怎么做?

1. 选择你的方向

  • 分布式调度框架: 从最底层的节点通信协议、任务调度和负载均衡等方面入手,设计并实现一个简易的任务分发和节点通信框架。
  • 节点决策系统: 设计并实现一个节点决策系统,能够动态地管理节点的上线、下线和故障恢复等工作。
  • 分布式计算系统: 设计并部分实现一个简易的分布式计算系统,能够动态地分配计算任务并协调节点间的通信。
  • 分布式存储系统: 设计并部分实现一个简易的分布式存储系统,能够动态地管理数据的分布和复制等工作。

2. 规划任务目标

对于每个方向,你可以从表格中选择多个目标进行实现。如果有余力的话,也可以自行实现更多的功能。

方向任务目标加分项
分布式调度框架
  • 必选: 使用 Figma 等软件绘制架构设计图
  • 必选: 编写节点通信协议的文档
  • 完成核心框架的搭建,展示系统的分布式调度功能
  • 设计并实现可并发节点通信协议
  • 设计统一抽象层,使得该框架在分布式计算和分布式存储等场景中都能方便地应用
  • 实现去中心化架构,即不存在管理员节点,每个节点都具有任务分布和任务接收能力
  • 根据可能出现的通信延迟和网络中断情况,实现相应的应对策略
  • 添加测试用例并进行性能调优,追求系统的高效性
节点决策系统
  • 必选: 使用 Figma 等软件绘制架构设计图
  • 必选: 绘制状态转移图并解释节点状态管理机制
  • 设计并实现节点的动态管理和负载均衡算法
  • 设计并实现节点的故障检测和恢复机制
  • 创建一个测试环境,覆盖节点上线、下线、故障恢复等场景
  • 提供多种负载均衡算法,进行性能对比,并说明相应使用场景
分布式计算系统
  • 必选: 使用 Figma 等软件绘制架构设计图
  • 必选: 阐述你设想的分布式计算场景与实现方式
  • 实现一个任务调度(负载分配)算法
  • 设计一个冗余机制,以保证计算能够在节点出现某些故障时不被中断
  • 实现一个简易的分布式计算任务,并展示其在系统中的运行效果
  • 创建一个测试环境,并接入日志监控和性能追踪功能
分布式存储系统
  • 必选: 使用 Figma 等软件绘制架构设计图
  • 必选: 阐述你设想的分布式存储场景与实现方式
  • 为分布式存储场景设计并实现一个简易的数据分布和复制算法
  • 实现数据一致性约束
  • 实现高效查询、数据备份、数据缓存等功能,提高系统存储能力
  • 实现一个简易的分布式存储任务,并展示其在系统中的运行效果
  • 创建一个测试环境,并接入日志监控和性能追踪功能

3. 做好安排

与其它题目相似,本题并非仅仅考察你的代码能力,而是更考察你(与团队)在有限时间内的统筹安排、架构设计、工作规划能力。请务必在开始工作前确定好打算实现的目标并大致规划好时间安排,不要因为某个功能的推迟上线而影响整体进度。

最终,你需要在答辩中详细展示你的设计思路,体现你的架构能力,并展示已经实现的功能。同时,你需要对你所研究的方向和相关技术有足够的了解,以一个技术自信的姿态完成工作。

祝一切顺利!

附:我可以用什么?

善用已经掌握的资源和工具,并抓紧学习不了解的技术。

建议使用的编程语言

  • Rust
  • Go
  • Scala
  • C, C++

当然,你也可以使用其它任何语言,只要你能证明它适合这个任务。

文档编写与绘图工具

脚注

  1. 例如 Hadoop、Spark、Cassandra 等。 ↩︎

  2. 例如《分布式系统概念与设计》、《Designing Data-Intensive Applications》等。 ↩︎

出题人:在机房做举重的KrLite