Lecture 1 - Introduction

MIT 6.824

MIT 6.824 Distributed Systems - Moments to Remember 用于标记我在学习分布式系统过程中认为比较重要和个人感兴趣的知识,同时记录我疑惑和思考的过程。

在最新的课程表中,虽然课程名称变成 MIT 6.5840 了,但是内容差不多,都是分布式系统设计。

Introduction to Distributed Systems

什么是分布式系统?简单来说,分布式系统就是一个由多个节点(独立的计算机、虚拟机、容器)组成的计算机网络。这些节点通过协作完成复杂的任务。

Why Distribution?

人多力量大,我们需要分布式系统的一大原因就是单独主机能够提供的性能不足以满足任务的处理。而分布式系统可以通过增加节点引入更多的核心,更多的内存,从而分担计算压力 (parallelism computing)。

而且多节点提供的容错性 (fault tolerance) 和可扩展性也是单独主机所满足不了的。因为分布式系统往往有多个节点,当某个或部分节点故障 (partial failure),其他节点 (replica servers) 可以接管任务,不用担心单节点造成整个系统的故障 (total failure)。同时,系统节点数量可以根据负载情况来动态地增加和减少。

另外,虽然数据在多个节点之间传输的延迟(socket API and underlyng hardwares)肯定会远大于在一台主机上的数据传输(进程间通信),但是分布式系统可以将任务放在离用户更近的节点来减少远程传输延迟 (bring it home),降低用户端到服务器之间数据传输所需要的时间。

但这样就一定会带来一些问题跟挑战,比如如何保证数据在多个节点中的一致性?如何设计容错机制来确保整个系统的健壮性,避免部分故障的发生?如何协调这些节点最大化系统性能?

Main Topics and Goals

这个课程的目标就是用 Go 语言设计并实现一个 infrastructure for applications。通过这个 infrastructure,底层分布式的服务器得以隐藏其细节,对应用透明化,即应用可以无感知地使用分布式服务器,而无需关注实现细节。

为实现这样一个系统,分布式系统设计将聚焦于三个方面:存储 (storage)、通讯 (communication)和计算 (computation)。通过抽象,我们想让分布式系统就像一台主机一样操作。

Fault Tolerance

Availability
Recoverability (roll-back.....) non-volatile storage(expensive)/replication

Consistency

put replicas as independent as possible(not even in one power cable)

weak consisitence or strong?

✅ 通讯(Communication)

📌 可靠传输:如何避免消息丢失或重复?(如 TCP vs. QUIC) 📌 负载均衡:如何在多个服务器间分发请求?(如 RPC 代理、反向代理) 📌 状态维护:如何处理长连接、会话状态?(如 gRPC、WebSocket)

🔹 抽象思路:让分布式通讯看起来像本地进程通信,应用层不需要关心底层网络,而是像调用本地 API 一样与远程服务器交互。

✅ 计算(Computation)

📌 任务调度:如何分配计算任务,避免某些节点过载?(如 Kubernetes 调度)
📌 资源隔离:如何保证不同用户或任务不会干扰?(如 Cgroup、Namespace) 📌 弹性扩展:如何根据负载动态增加或减少计算资源?(如 Serverless 计算)

🔹 抽象思路:让计算资源看起来像一个统一的 CPU 池,无论计算在哪个服务器上执行,应用层都能像调用本地线程一样使用它。

🚀 统一抽象:分布式系统 → 单机体验

📌 存储:提供一个“虚拟磁盘”,让数据像本地存储一样访问 📌 通讯:封装 RPC,让远程服务器像本地 API 一样调用 📌 计算:构建统一调度,让所有计算任务像本地 CPU 线程一样执行

这样,整个分布式系统在应用层看来像是一台强大的单机,而底层复杂的分布式机制被隐藏起来。