MIT 今年终于主动在 Youtube 上放出了随堂视频资料,之前跟过一半这门课,今年打算刷一下视频,写写随堂笔记。该课程以分布式基础理论:容错、备份、一致性为脉络,以精选的工业级系统论文为主线,再填充上翔实的阅读材料和精到的课程实验,贯通学术理论和工业实践,实在是一门不可多得的分布式系统佳课。课程视频: Youtube,B站。课程资料:6.824主页。本篇是第五节课笔记,包括两部分:第一部分由一个助教讲了 lab2 中将会用到的一些 go 的源语、设计模式和实践技巧,包括内存模型、goroutine和闭包、时间库、锁、条件变量、channel、信号、并行和一些常用工具等等。第二部分是由另两个助教梳理了下 raft 中常遇到的一些 bug 和调试方法。
MIT 6.824 2020 视频笔记四:VM-FT
MIT 今年终于主动在 Youtube 上放出了随堂视频资料,之前跟过一半这门课,今年打算刷一下视频,写写随堂笔记。该课程以分布式基础理论:容错、备份、一致性为脉络,以精选的工业级系统论文为主线,再填充上翔实的阅读材料和精到的课程实验,贯通学术理论和工业实践,实在是一门不可多得的分布式系统佳课。课程视频: Youtube,B站。课程资料:6.824主页。本篇是第四节课笔记,VM-FT。
备份——容错
失败(Failue)
如何定义?在其他电脑看来,停止对外提供服务。
通过备份/副本(Replication)
可以解决:宕机(fail-stop),比如 CPU 过热而关闭、主机或者网络断电、硬盘空间耗尽等问题。
不能解决:一些相关联(correlated,主副本机器会同时存在)的问题,比如软件 Bug、人为配置问题
前提
主从备份可以工作的一个假设是,主从机器的出错概率需要时独立的。
比如说:同一批次机器、同一个机架上的机器,出错概率就存在强正相关特性。
是否值当
需要对业务场景和所需费用考量,是否真的需要进行 Replica。比如银行数据就需要多备份,而课程网站可能并不需要。
WiscKey —— SSD 介质下的 LSM-Tree 优化
使用 Vercel 托管 Hexo 静态博客
博客本来用的是 github pages,但貌似由于百度爬虫太疯狂,被 github 给 ban 掉了。根据 marketmechian 的数据,在中国大陆搜索引擎界,百度还是占了半壁江山:
- Baidu: 67.09%
- Sogou: 18.75%
- Shenma: 6.84%
- Google: 2.64%
- bing: 2.6%
- Other: 2.08%
而作为一个中文博客,还是希望能够被更多的国内用户看到,因此一直在寻求一个使得百度爬虫自动爬取博客的方法。偶然间在浏览博客时,看到了有人在推荐 zeit.co 这个托管平台,使用了下,发现真是个非常棒的静态代码托管+CI Serverless Function 平台,在这里推荐给大家。
MIT 6.824 2020 视频笔记三:GFS
MIT 今年终于主动在 Youtube 上放出了随堂视频资料,之前跟过一半这门课,今年打算刷一下视频,写写随堂笔记。该课程以分布式基础理论:容错、备份、一致性为脉络,以精选的工业级系统论文为主线,再填充上翔实的阅读材料和精到的课程实验,贯通学术理论和工业实践,实在是一门不可多得的分布式系统佳课。课程视频: Youtube,B站。课程资料:6.824主页。本篇是第三节课笔记,GFS。
概述
存储(Storage)是一个非常关键的抽象,用途广泛。
GFS 论文还提到了很多关于容错、备份和一致性的问题。
GFS 本身是 Google 内部一个很成功的实用系统,其关键点被很好的组织到一块发表成为了学术论文,从硬件到软件,涵盖了很多问题,值得我们学习。
想详细了解 GFS,也可以看我之前的 GFS 论文笔记。
MIT 6.824 2020 视频笔记二:RPC和线程
MIT 今年终于主动在 Youtube 上放出了随堂视频资料,之前跟过一半这门课,今年打算刷一下视频,写写随堂笔记。该课程以分布式基础理论:容错、备份、一致性为脉络,以精选的工业级系统论文为主线,再填充上翔实的阅读材料和精到的课程实验,贯通学术理论和工业实践,实在是一门不可多得的分布式系统佳课。课程视频: Youtube,B站。课程资料:6.824主页。本篇是第二节课笔记,RPC 和线程。
为什么用 Go
- 语法先进。在语言层面支持线程(goroutine)和管道(channel)。对线程间的加锁、同步支持良好。
- 类型安全(type safe)。内存访问安全(memory safe),很难写出像 C++ 一样内存越界访问等 bug。
- 支持垃圾回收(GC)。不需要用户手动管理内存,这一点在多线程编程中尤为重要,因为在多线程中你很容易引用某块内存,然后忘记了在哪引用过。
- 简洁直观。没 C++ 那么多复杂的语言特性,并且在报错上很友好。
MIT 6.824 2020 视频笔记一:绪论
MIT 今年终于主动在 Youtube 上放出了随堂视频资料,之前跟过一半这门课,今年打算刷一下视频,写写随堂笔记。该课程以分布式基础理论:容错、备份、一致性为脉络,以精选的工业级系统论文为主线,再填充上翔实的阅读材料和精到的课程实验,贯通学术理论和工业实践,实在是一门不可多得的分布式系统佳课。课程视频: Youtube,B站。课程资料:6.824主页。本篇是第一节课笔记,绪论。
课程背景
构建分布式系统的原因:
- Parallelism,资源并行(提高效率)。
- Fault tolerance,容错。
- Physical,系统内在的物理分散。
- Security,不可信对端(区块链)。
分布式系统面临的挑战:
- Concurrency,系统构件很多,并行繁杂,交互复杂。
- Partial failure,存在部分失败,而不是像单机一样要么正常运行,要么完全宕机。
- Performance,精巧设计才能获取与机器数量线性相关的性能。
(译)请不要再称数据库为 CP 和 AP
本文缘起于Lu Pan 的个人博客文章:https://blog.the-pans.com/cap/ ,是他经过 Martin Kleppmann 授权并且翻译的博文”Please stop calling databases CP or AP”中文版本。但译文中不少句子读来颇为古怪,我对照英文原文,按照自己理解,逐句校验、重译了一遍。这篇文章探讨了为什么不应该滥用 CAP定理 这个概念,旁征博引,入木三分,值得一读。更值得称道的是,Martin 文中所有关键观点都给出了来源,并在最后推荐了一些学习资料,都是不错的阅读材料。以下是正文。
在 Jeff Hodges 的精彩博文给年轻人关于分布式系统的笔记 中,他建议我们用CAP定理来评判系统。不少人听从了这个建议,将他们的系统称为”CP” (提供一致性但在网络分区时不可用),“AP”(高可用但是在网络分区时不一致) 或者干脆 “CA” (说明还没有读过Coda的五年前的文章)。
我同意 Jeff 的所有其他观点,但其关于 CAP 定理的使用建议,我不能表示赞同。CAP 定理本身太过简化而且存在广泛的误解,以至于在界定系统时不能有效的起到作用。因此我请求大家不要再引用CAP定理, 不要再讨论CAP定理。取而代之,我们应该用更精确的术语来表述我们对系统的取舍。
(当然,讽刺的是我不希望别人再讨论这个话题,自己却正在写一篇关于这个话题的文章。不过至少以后别人问我为什么不喜欢讨论CAP定理的时候,我可以把这篇文章的链接给他。还有,抱歉这篇文章会有些吐槽,但是至少这些吐槽给出了文献引用)
分布式基础(一):CAP 的理解
初冬日暮什刹海
真香——MacBook Pro 2016 Genius Bar 更换键盘小记
研究生毕业时,去网易游戏实习攒了点钱,便想入手垂涎了好久的程序员生产力工具—— MacBook Pro。适逢新版发售,等到 2016 年底,新版甫一上市,便从官网下单了一台 pro 入门版:13 寸两口不带 bar 。不过哪怕是入门版,也要一万多大洋,还两个口,还不带 bar。
不带 bar 尚可接受,毕竟 vim 党还是喜欢能按的下去的 Esc 。但两个口——于是默默了去京东下单了几个扩展口,彼时 tpye c 尚不流行,选择无几。
到货后满心欢喜打开,惊艳异常,是醉人的新配色——深空灰、是史无前例的轻薄、是类 Unix 系统加上舒服的 UI。于是将之前的小嘀咕抛诸脑后,嗯,真香。
MIT 6.824 2020 Raft 实现细节备忘
引子
18年的时候做过一些 6.824,旧文在此,无奈做到 Part 2C,无论如何也跑不过测试,便一直搁置起来。但在后来的日子,却时时念起此门神课,心下伤感。拖到今日,终于可以来还愿了。
这次能跑过所有测试,原因有三:一来,之前做过一次,很多原理还留有印象;二来,这一年多在工作上有了很多分布式系统的实践;三来,golang 的驾驭上也精进了一些。但是在做的过程中,仍然遇到了大量令人纠结的细节,为了方便日后回顾,将这些细节梳理一下,记在此处。若能好巧对其他做此门课的人有些微启发,则又是快事一件了。
6.824 与 Raft
6.824 是一门关于分布式系统的非常棒的公开课,做课程实验的过程中时时惊叹于其构思之精巧、材料准备之翔实。MIT 的大师们能将这样精华的课程开放出来,实乃名校和大师们的气度,更是我们计算机人的幸事。
Raft 是一个面向理解的分布式共识(consensus)协议。分布式共识算法是分布式领域非常非常经典的问题,同时也是分布式系统中非常难的一块,直观的说,就如同流沙上打下分布式系统大楼的地基。不可靠的网络、易故障的主机,造成的状态变化之复杂,实在不是一般人能在脑中模拟得了的。本人愚钝,只能是感性把握加细节堆叠,堪堪有些认识。说回 Raft,有同领域 Paxos 珠玉在前,何以 Raft 仍能脱颖而出?应该是抓住了以下两点:
- 易于理解。Paxos 是出了名的难以理解,因此也就难以飞入寻常百姓家。而 Raft 通过解耦出多个模块,将算法复杂度进行降维,大大降低了一般人的理解难度。此外,Raft 还有很多精巧的设计,以尽可能避免引入复杂度,从而进一步减轻大家的心智负担。
- 易于实现。易于理解客观上会导致利于实现,但不等同于就能据此产出优秀系统。如果理解流于感性,则实现成空中楼阁。Raft 论文的厉害之处就在于既有感性把握又有细节组织,几乎就是一个系统的设计文档,还是详细设计文档。
要想做好该实验,需要涉猎大量的材料,我把实验中提到的和我看到的汇总在文末。当然,还有英文劝退。虽然我最后测试用例都过了,但仍有很多没实现好的点以及不理解之处。
注:后续,2023 年又做了一次,终于理清楚了大部分点。