为什么需要分布式
- 通过复制(replication)实现容错
- CPUs/mem/disk/net的水平扩容
分布式的难点
- 复杂。多个并发部分
- 部分失败问题
- 难以实现的性能潜力
分布式领域有个著名的CAP定律
- Consistency:一致性,需要处理部分失败的问题。比如关系型数据库的ACID。
- Availability:可用性,避免单点。
- Partition tolerance:分区容忍性,即扩展性,按需扩展。
有个说法是三者最多只能取其二。主要的矛盾点在于一致性和扩展性,因为实现按需扩展,必定会存在不一致的情况。因此分布式系统往往都会是CA或者是AP。最典型的的就是传统关系型数据库(CA)和NoSQL(AP)。
分布式系统往往会有以下几个方面:
- 存储
- 通信
- 计算
MapReducer是一个分布式计算的编程模型
- 计算过程分成map和reduce。Map函数不需要相互等待或者共享数据,这对并行非常友好。
- map不保持状态,部分map失败了,重跑可以得到一样的结果。
- map 的输入来自本地磁盘,而不是网络,中间结果也是保存在本地磁盘,而且只会网络传输一次(reduce),这点提升网络性能。