其他分享
首页 > 其他分享> > 6.824 笔记

6.824 笔记

作者:互联网

6.824 笔记

零、简介

https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/

人们使用大量的相互协作的计算机驱动力是

分布式系统的挑战

分布式基础架构

存储、通信、计算

分布式系统三个指标

一、MapReduce

编程模型

工作方式

在这里插入图片描述

  1. 用户程序首先调用的MapReduce库将输入文件分成M个数据片度,每个数据片段的大小一般从16MB到64MB(可以通过可选的参数来控制每个数据片段的大小)。然后用户程序在机群中创建大量的程序副本。
  2. 这些程序副本中的有一个特殊的程序–master。副本中其它的程序都是worker程序,由master分配任务。有M个Map任务和R个Reduce任务将被分配,master将一个Map任务或Reduce任务分配给一个空闲的worker。
  3. 被分配了map任务的worker程序读取相关的输入数据片段,从输入的数据片段中解析出key/value pair,然后把key/value pair传递给用户自定义的Map函数,由Map函数生成并输出的中间key/value pair,并缓存在内存中。
  4. 缓存中的key/value pair通过分区函数分成R个区域,之后周期性的写入到本地磁盘上。缓存的key/value pair在本地磁盘上的存储位置将被回传给master,由master负责把这些存储位置再传送给Reduce worker。
  5. 当Reduce worker程序接收到master程序发来的数据存储位置信息后,使用RPC从Map worker所在主机的磁盘上读取这些缓存数据。当Reduce worker读取了所有的中间数据后,通过对key进行排序后使得具有相同key值的数据聚合在一起。由于许多不同的key值会映射到相同的Reduce任务上,因此必须进行排序。如果中间数据太大无法在内存中完成排序,那么就要在外部进行排序。
  6. Reduce worker程序遍历排序后的中间数据,对于每一个唯一的中间key值,Reduce worker程序将这个key值和它相关的中间value值的集合传递给用户自定义的Reduce函数。Reduce函数的输出被追加到所属分区的输出文件。
  7. 当所有的Map和Reduce任务都完成之后,master唤醒用户程序。在这个时候,在用户程序里的对MapReduce调用才返回。

Map 函数和 Reduce 函数

二、GFS 谷歌文件系统

简介

GFS 是一个大型的快速的全局文件系统

GFS 的 Master 节点

Master节点用来管理文件和Chunk的信息,而Chunk服务器用来存储实际的数据。Master节点知道每一个文件对应的所有的Chunk的ID以及存储位置(Chunk每个是64MB大小)。

Master 保存的数据内容
Master 数据在磁盘上的保存情况:

GFS 读文件

第一步,客户端将文件名和偏移量发送给 Master。
第二步,Master 节点将 Chunk Handle(也就是ID,记为H)和服务器列表发送给客户端。
第三步,客户端从最近的服务器读,并缓存 Chunk 与服务器的对应关系。

GFS 写文件

第一步,客户端将文件名发给 Master。
第二步,Master 将保存了文件最后一个 Chunk 的主副本和从副本列表告知客户端。
第三步,客户端将要追加的数据写入全部服务器的一个临时位置,直到所有服务器都返回了确认消息。
第四步,客户端告诉主服务器追加文件。服务器查看文件的结尾 Chunk,有足够的空间则通知所有从服务器和自己都将数据写入 Chunk 文件。

第二步 Chunk 主副本不存在

Master 找到所有保存的版本号与 Master 中记录的 Chunk 版本号一致的最新的副本。
然后挑选一个作为主副本,并告知主副本和从副本,副本将增加版本号、写入磁盘、返回确认消息。
最后 Master 将新版本号写入磁盘。

第四步从副本写入失败

从副本告诉主副本写入失败,主副本收到一个写入失败则告诉客户端写入失败,但什么也不会做。客户端收到写入失败之后会重新发起写入流程。

主副本挂了怎么处理

Master 定时 ping 主副本,当发现他挂了之后并不会立即指定新的主副本。因为有可能只是网络问题。
为了避免出现脑裂,主副本在上任时会和 Master 都维护一个租约时间,当 Master 发现主副本挂了会等到租约过期再指定新的主副本。

第二步追加新文件不存在副本

Master 会发现,该文件没有关联的 Chunk,然后通过随机数生成器创造一个新的Chunk ID。之后,Master 会创建一条新的 Chunk 记录,版本号为1,再随机选择一个 Primary 和一组 Secondary。

第四步写失败重写

一般写入失败都是因为网络问题,重试就行了。如果多次失败,Master会踢掉失败的从副本。
为了能够高并发,在写入B的时候可能就已经开始写C了,所以不会撤销B再写入C。代价是应用程序需要容忍乱序数据,可以通过加序列号来解决。
在这里插入图片描述

将 GFS 升级成强一致性系统需要考虑的点

单个 Master 存在的问题

三、VMware FT

复制的方法

状态转移:备份完整状态,包括内存中的全部内容。
复制状态机:备份来自客户端的操作或者其他外部事件。

复制的级别

应用程序级别的复制:更加的高效,但是复制的这个行为需要构建在应用程序内部。如 GFS 复制 Chunk 和 Chunk ID。
机器的完整状态的复制:复制每一个 bit,包括内存和寄存器。可以对任何软件进行复制,应用本身不需要操心复制的事儿。效率较低,比如说需要确保中断在主副本和备份的相同位置执行。

VMware FT 工作原理

每个物理计算机可以运行一个虚拟监控机器 VMM,VMM 上再运行一个或多个操作系统。
VMware FT 需要多个物理服务器,一个运行主副本,其他运行备份,目标是让他们的内存镜像完全一致。
在这里插入图片描述

工作流程:
  1. 客户端发送请求
  2. P 的 VMM 收到网络数据包产生的中断,模拟中断发给应用程序的 P 副本。
  3. P 的 VMM 将网络数据包拷贝一份,通过 Log Channel 分发给 B 的 VMM。
  4. B 的 VMM 模拟中断发给应用程序的 B 副本。
  5. P 副本 处理请求进行回复,从虚拟网卡发出,P 的 VMM 收到后发给客户端。
  6. B 副本 处理请求进行回复,从虚拟网卡发出,B 的 VMM 收到后直接丢弃。
副本故障

当备份的 VMM 收不到主副本的定时器 Log,会让备份上线,不在阻拦它的回复,不再由主副本的事件驱动,并且对外宣称自己有主副本的 IP 地址,使客户端与自己通信。

非确定性事件

包含客户端输入、怪异指令和多核 CPU。怪异指令包含随机数生成、获取时间、获取计算机唯一 ID 等。为了保证主副本与备份的一致性,通过 Log Channel 进行非确定性事件同步。

Log 组成
  1. 事件发生时的指令序号,保证主副本和备份在相同的指令位置看到数据。
  2. 日志条目的类型,普通网络数据包或怪异指令。
  3. 数据,普通网络数据包则是数据内容,怪异指令则是在主副本执行的结果。
Log 同步过程
  1. 主副本的 VMM 收到外部中断。
  2. VMM 在适当的时候停止主副本的虚机执行并记下当前的指令序号。
  3. 在指令序号的位置插入模拟外部中断并恢复虚机执行。
  4. 主副本 VMM 将指令序号、终端内容打包成 Log 发送给备份。
  5. 备份 VMM 保存 Log 并等待备份虚机执行到指令序号的位置,停止备份虚机的执行,插入外部中断。

输出控制

直到备份 VMM 确认收到了相应的 Log 条目,主副本 VMM 不允许生成任何输出。

  1. 客户端输入到达主副本 VMM。
  2. 主副本 VMM 将输入的拷贝发送给备份 VMM。
  3. 主副本 VMM 将输入发送给主副本虚机,虚机执行后将输出交给主副本 VMM。
  4. 主副本 VMM 等待备份 VMM 对之前的 Log 都进行了回复之后,将输出发给客户端。
重复输出

问题:客户端一次请求在主副本得到了回应之后,主副本离线,备份上线执行完 Log 之后再次给出回复。
解决:备份与主副本的内存全都一样,使用相同的 TCP 源端口,重复的报文会被 TCP 丢弃。

Test-and-Set 服务

当备份认为主副本挂了,想要上线的时候,要向第三方权威 Test-and-Set 服务请求许可,拿到锁才行。每次主从切换都需要获得锁。

四、Raft

标签:VMM,Chunk,笔记,6.824,Master,备份,副本,客户端
来源: https://blog.csdn.net/qq_41763749/article/details/120795761