1. 简介
什么是分布式系统?
- 多个相互协作的计算机
- DNS, P2P文件共享,大数据库, MapReduce, &c
- 许多关键基础设施都是分布式的
为什么使用分布式?
- 为了连接物理上分隔的实体
- 通过隔离来实现安全
- 通过复制来容忍错误
- 通过并行CPU/内存/磁盘/网络来提高吞吐量
分布式存在的问题?
- 复杂性:许多并发的实体
- 必须处理局部故障
- 充分发掘性能潜能的困难性(tricky to realize performance potential)
为什么你应该选修这门课?
- 有趣—— 有难度的问题,而且没有显而易见的答案
- 被真实的系统所使用——由大型网站的发展所驱动
- 活跃的研究区域——有很多未解决的问题和待改进的地方
- 动手——你可以在实验里创建严谨的(serious)系统
2. 课程结构
2.1 课程主页:
2.2 课程工作人员:
- Robert Morris, lecturer
- Frans Kaashoek, lecturer
- Steven Allen, TA
- Stephanie Wang, TA
- Jon Gjengset, TA
- Daniel Ziegler, TA
2.3 课程构成
- lectures
- readings
- two exams
- labs
- final project
相关说明:
Lectures
包含 重要概念, 论文 和实验。Readings:
将研究论文作为案例学习。请在课前阅读完论文,不然你在上课时容易开飞机。每一篇论文都有一些简短的问题,你需要在晚上10点之前提交答案。Mid-term exam in class, and final exam
Lab goals:
- 对一些重要的技术有更深的理解
- 分布式编程经验
- 第一个实验持续一周(从周五开始)
- Lab 1: MapReduce
- Lab 2: replication for fault-tolerance
- Lab 3: fault-tolerant key/value store
- Lab 4: sharded key/value store
Final project
以2~3人形式的小组完成,你可以自己设计一个项目并和我们展示或者选一个我们指定的项目。
注:
- Lab的分数取决于你通过了多少个测试用例
- Lab 代码审核:
通过查看其它人的lab解决方案,并进行反馈,也许你就可以得到问题的另外一种解决方案。 - 调试labs是一件费事的事
- start early
- come to TA office hours
- ask questions on Piazza
3. 主题
这个课程主要讲述由应用程序使用的基础设施。使用抽象来隐藏应用程序中分布式的复杂性。
主要有三种抽象:
- 存储(storage)
- 通讯(communication)
- 计算(computation)
以下的主题重复的使用着这些抽象。
3.1 Topic: implementation
RPC, threads, concurrency control.
3.2 Topic: performance
理想状况:可扩展的吞吐量
- Nx servers -> Nx total throughput via parallel CPU, disk, net.
- 所以处理更多的负载只需要更多的电脑
可扩展性则变得越来越难:
- 负载均衡, stragglers
- “小段的”非并行化部分
- 隐藏的共享资源, e.g. 网络
3.3 Topic: fault tolerance
1000s of server, complex net -> always something broken
我们想隐藏应用程序中的这些错误,从以下两方面展开:
- 可用性(Availability) – 尽管失败,但是我可以继续使用我的文件。
- 持久性(Durability) – 当错误被修复时,我的数据会恢复正常。
专用名词: 复制服务器
- 如果一个服务器崩溃了,那么客户端可以利用其它服务器进行处理
3.4 Topic: consistency
通用基础设施需要良好定义的行为。
例如: “Get(k)返回最新的Put(k, v)中的值”
想达到定义良好的行为是非常困难的!
- 客户端提交并发操作
- 服务器在不恰当的时候崩溃
网络可能回事活跃的服务器变得像死了;“split brain”风险
一致性和性能是敌对的关系:- 一致性需要通信(e.g 得到最新的Put()操作)
- 有”严格”语义的系统一般来说都比较慢(Systems with pleasing (“strict”) semantics are often slow)
- 快速系统通常会让程序处理”轻松的”复杂度行为(Fast systems often make applications cope with complex (“relaxed”) behavior)
人们在这个范围内进行了许多的设计。