课堂笔记(MIT 6.824: Lec 1-2)

  • 2020 年 5 月 25 日
  • AI

本文是 MIT 6.824分布式系统Lecture 1和Lecture 2的课堂笔记内容,同时包含MapReduce的论文笔记,欢迎阅读。

如果想要跟方便的查看课程的更新内容,也欢迎关注微信公众号:《油麻酥爱学习爱健身》,微信号:youmasu

一、分布式系统简介

1、相比一个单机系统,建立分布式系统的目的是:性能,容错和安全

(1)性能,要求CPU,内存,甚至硬盘的并行处理。即,可以通过资源的横向扩展获得成倍的性能提升。大型网站中,最简单的横向扩展设计是把用户分组,hash取模路由到不同的无状态HTTP服务器。所有服务器共享一个数据库DB,直至数据库性能成为瓶颈。即,将HTTP服务器的性能瓶颈向后传递到数据库,同时使服务器拥有横向扩展的能力。

(2)容错,如果某些机器出错,不影响其他机器提供服务。如果每台机器的可靠性是99.9%,那么,1000台机器构成的集群可靠性只有36.8%。由此可见,如果没有容错机制,整个分布式系统的维护将是一场灾难。除了可靠性的考虑,容错的目标还包括可恢复性,毕竟错误是无法避免的,发生错误后如果自动地快速恢复,也是重要考量。

容错的实现方式主要是“非易失内存”(non-volatile),比如,将所有数据全部直接读写硬盘和闪存等,保证机器出错时数据不丢失,但代价是磁盘的寻道时间导致性能骤降。

容错的另一个选择是“复制”(replication),replication的关键难点是如何管理多台机器间的资源备份,毕竟机器间的同步出错,也是经常出现的问题。replication容错中,不同的备份应当尽可能独立,比如,放置在不同的机房或不同的城市,以避免同一个机房掉电或者同一个城市自然灾害等问题,导致容错备份毫无意义

所以,使用replication完成容错的过程中,对一个K-V存储而言,它的put和get操作如何在多机间保持一致性,就是随之而来的待解问题。但“强一致性”往往要求不同城市间多机通信后取最新时间戳或多数投票后返回,耗时太长系统不可用,因此,分布式K-V存储通常允许一定程度脏读的弱一致性。

(3)安全,提供一定的隔离性,不同的服务运行在不同的集群上,通过网络协议交互。

MIT 6.824主要通过MapReduce介绍性能,通过分布式存储介绍容错。我们将站在更高的角度抽象出这2个目标的核心接口,并对上游封装内部的分布式细节。

2、相比一个单机系统,建立分布式系统的难点是:并发编程的复杂性(多线程,并发控制),网络通信的复杂性(RPC),问题排查的复杂性。

因此,MIT 6.824主要讲解业界已有的解决方案。比如,MapReduce,Raft等。

3、MIT 6.824的课程安排主要包括:lecture,paper,exam,lab和project。其中,paper每周1篇,如果课前已经认真阅读过paper,lecture随便听听就行。重点是labs有4个,因为分布式系统的特点,非常难debug,要早做准备:

(1)MapReduce;

(2)Raft,目的是容错思想;

(3)基于Raft的Key-Value存储Server;

(4)基于Raft K-V Server的Sharded K-V存储Service。Sharded是指,在分布式系统上,使用分区的方式存储数据,做到并行数据传输,加快传输速度。

二、MapReduce简介

MapReduce:论文笔记链接

三、多线程

1、多线程并发是分布式学习的重点。原因有3点:

(1)IO并发:分布式系统需要与多机同时通信。在多线程的加持下,客户端可以同时开启多个线程,向不同的服务端分别发出请求后,只需等待最慢的一个应答时间,就能收到所有响应。

(2)多核并行:计算密集型任务在多核计算机上并行,需要多线程来实现。简单说,并行是同一时刻2个以上线程在同时运行;并发是同一时刻有且仅有1个线程在运行,只不过在下一个时间片,线程切换运行第2个线程时,人类反应不过来而已。

(3)后台任务:分布式系统的某个服务中,一定存在某些后台常驻线程执行周期性的操作,比如,心跳,统计上报等,它们各自都是在一个线程中独立运行。

2、多线程并发在系统实现上也引入了更多挑战,主要是2点:

(1)线程间竞争:通常一个高级语言的一条语句是由多个CPU原子指令组成,当多线程执行同一条高级语言中对共享数据的竞争操作时,会导致数据不一致。正确使用“锁”或避免使用共享数据,可以解决竞争问题。但“锁”的错误使用,比如,死锁,又是新的问题。

(2)线程间同步:当不同线程间在逻辑上存在依赖时,需要并行执行某些任务后,在某些时间点等待其他较慢的任务完成。正确使用“channel”,“条件变量”和“wait group”来实现线程的同步和协作。

3、go实战

(1)多线程实战(crawler.go):同步crawler;使用共享状态和锁的并发crawler;使用channels的并发crawler。

(2)RPC实战(kv.go):基于tcp的go原生net/rpc的K-V server。

四、广告时间

如果大家喜欢我分享的内容,欢迎关注我的知乎专栏或微信公众号。

除了MIT分布式课程的学习以外,还会不定期分享自己的健身经验,包括,家庭自重健身,健身房增肌减脂,日常饮食营养等健身内容,再次谢谢大家~