本系列是源于「码农翻身」
所属知识星球发起的读书活动,由大佬 @我的UDP不丢包
推荐而来,这次的读书活动有一些另类,我们抛弃了传统的书籍,开始攻略最高学府的研究生顶级课程 <6.824>,该课程是很多年前的蠕虫病毒发明者Robert Morris
大佬授课,归属于麻省理工大学
,授课方式主要是:视频 + Lab 实验(Go 语言) + 论文,全程英语,难度较大。
MapReduce
:大规模数据集计算系统,比如计算从 1 加到 1000 亿,可以单台计算机计算,也可以利用该技术分散到多台计算机计算然后合并结果,极大的提高效率
容错:
针对于容错,主要是两点,一是可用性,二是可恢复性 对于分布式系统来说,一般不会全部服务器同时瘫痪,因此无论是服务可用还是数据安全,都比单体服务更有保障。
局部错误
:假设一台机器每天出故障的概率是千分之一,在单体应用中,可能很长时间可以工作,但是在分布式系统中,设备数量急剧上升,每天都可能有设备出现故障,这就是所谓的局部错误,很难排查,也几乎无法避免
此处展示一张单体应用和分布式应用的对比图,图片出自:《极客时间 · 左耳听风》
我们需要设计一系列能够屏蔽分布式系统复杂性的抽象
为什么要设立此目标?
因为分布式系统本身已足够复杂,因此必须简化使用方式简化使用方式和抽象有什么关系?
我目前认可的最完美抽象是:文件 “UNIX 文件本质上就是一大袋字节。” —— 《UNIX 编程艺术》 在 Unix 中,任何可读/写也就是有 I/O 的设备,无论是文件,socket,驱动,在打开设备之后都有一个对应的文件描述符。Unix 将对这些设备的读写简化在 read/write 中,换言之,你只需要把打开的文件描述符传给这两个函数,操作系统内核知道如何根据这个文件描述符得到具体设备信息,内部隐藏了对各种设备进行读写的细节,所有这些对用户都是透明的,你只需要打开它,得到 fd,再进行相应的操作就够了。
一致性
:一致性问题貌似是最难以解决的问题,因为它本质包含了性能,容错,数据一致性等等诸多要素 我们前文说过,为了考虑容错容灾机制,需要数据进行备份,那么在分布式系统中,A 服务修改了 A 数据库的值,B 数据库的值要不要跟着改,是立即跟着改,还是延迟跟着改,在同步修改中出问题了怎么办,在异步修改中出问题了怎么办 最终业界也很难解决相应的问题,因此现在主流的方式是:最终一致性
即允许短时间内数据不一致,通过最终一致性保证性能和数据安全的兼顾
文件分享地址:https://www.processon.com/view/link/5f1db0230791291b99680fa0
接下来的一章,我们将进行 <6.824> 中的 Lab 1,即实现一个简单的MapReduce
系统,该系统将采用 Go 语言构建
Go 语言是近些年非常热门的语言之一,其价值个人感觉大于被炒的火热的 Python
相关资源:
Go 官方镜像站[1]
Go 语言 IDE[2]
Go 语言环境搭建教程[3]
Go 语言初识 + HelloWorld[4]
MIT 课程表主页[5]
B 站中文翻译视频地址[6]
[1]Go官方镜像站: https://golang.google.cn/dl/
[2]Go语言IDE: https://www.jetbrains.com/go/download/other.html
[3]Go语言环境搭建教程: https://www.cnblogs.com/qicun/p/11378354.htm
[4]Go语言初识 + HelloWorld: https://devhints.io/go
[5]MIT课程表主页: https://pdos.csail.mit.edu/6.824/index.html
[6]B站中文翻译视频地址: https://www.bilibili.com/video/BV1R7411t71W