引言和技术思想
MIT不愧是MIT,Introduction都上得这么好,层层深入,引导思考。
国内的课要是有这种水平就好了。
这是我上课做的一些笔记,可能没太多细节,但是框架都有了
为何需要分布式系统?
- 并行获得高性能
- 容错
- 物理上本就是分布式
- 安全 / 隔离
讨论的基础架构:
- 储存
- 通信
- 计算(MapReduce)
抽象出接口,尽量将分布式特性隐藏在系统内,操作起来像非分布式系统一样。使用的工具例如:
- PRC (Remote Procedure Call)远程过程调用,用以掩盖网络的不可靠。
- 线程,提供结构化的并发。
- 并发控制,锁。
性能
-
可拓展性:可以扩增机器横向拓展提高性能。
举例:一台web服务器一个数据库,用户量增多可以扩增web服务器数量,使用同一个数据库。但是当web服务器数量达到一定程度后,数据库读取成为瓶颈,但是拆分数据库需要大量工作。
现实中很难实现只靠扩增机器实现拓展,这就需要设计一个新架构将它无限拓展下去,需要考虑分布式储存的问题。
-
容错:可用性 / 可修复性
分布式系统大量机器会将罕见问题放大,错误总在发生,系统要能向上层屏蔽错误,服务仍能正确运行,并能自我修复。可用方法:
- 非易失性存储,例如硬盘。存放一些checkpoint或者系统状态的log在这些存储中,修复后读出继续运行。但是代价较高,为了高性能,要避免频繁的写入非易失存储。
- 复制。多副本系统实现容错,主要问题在于副本的同步,即一致性问题。
-
一致性
最基本的分布式存储系统提供
(k,v)
服务,有put / get 行为。系统中会有多个副本,可能put操作中途出问题导致副本不一致,get到的数据也可能不一致。强一致可以保证get得到的是put写入的最新的数据,弱一致性则无法保证。但是实现强一致性系统中需要大量通信,例如读取所有副本取最新值,而且为了容灾不同副本可能相距很远。这样做代价很高,所以现实中常常会考虑构建弱一致性系统来提高性能。
MapReduce
这部分直接看Google的那篇论文更清晰。简单说一下。
对于PB级的数据,MapReduce的思想是,使用者只需要写简单的Map
函数和Reduce
函数,而不需要关注底层,MapReduce框架自动处理。
一个完整的MapReduce Job,它由一些Map Task和一些Reduce Task组成。
Map
函数将GFS文件系统的输入处理成一个个键值对,例如用来统计词频,将输入文本变为 (a,1) (b,1)
输出,经过聚合同一个键和排序,即shuffle操作,将每个键的结果交给Reduce
函数,shuffle后返回统计结果保存到GFS。
大型应用需要多次MapReduce,即上一次输出作为下一次输入。
论文发表时代网络带宽是瓶颈,所以尽量在本地处理,即GFS文件系统和MapTask在同一台机器上,只有shuffle后需要传输数据到其他机器,这也是MapReduce的瓶颈。
论文里提到Map操作之后可以运行Reduce的代码先进行聚合,减少数据传输量,但这不算是Reduce操作只是用了相同代码。标准的Reduce操作必须等所有Map结束,获得所有输出才能进行。
论文还提到MapReduce快结束时启动多个重复任务,只要有一个完成就标志任务完成,这样可以防止有机器出问题拖后腿。