回顾:分布式系统和云计算课程 | 美国 SIT CS549
2022年1月 · 预计阅读时间: 4 分钟
距离从美国史蒂文斯理工学院毕业已经有 4 年了,时间过的真快。此前一直从事 Java 开发的我,在学院读研的时候选择了最难的云计算相关的课,这门 CS549 《Distributed Systems and Cloud Computing》(分布式系统和云计算)就是其中之一,4年过去也忘的都差不多了,现在随着自己的爱好转行做了前端,不过以前的知识也不能全忘,说不定后面还用的到,现在回顾以前的一些学习经历吧,希望对你也有所帮助。
在选课的时候老师就提醒我,你选了两门我的课,这学期你甭想睡觉了。我想,有啥难的,还能睡不了觉,后来事实证明,觉是可以睡的,但是玩的时间是真没有了...简单的回忆一下课程内容吧,细节是真的记不清了。
第一节课,就学习了客户端/服务端架构的计算,利用 Sockets 和 RPC 进行通信,讲了通信的模型,有消息传递型的,还有共享内存型的,消息传递型又介绍了阻塞、非阻塞的方式,后讲了 FTP 协议、RPC 协议实现的原理,Java RMI API 的使用方法,还有网络数据发送的错误处理、延迟管理等等,后来还讲了什么 fbufs。课后作业是实现 FTP 客户端和服务端通信,可以改变 Active 或 Passive 模式,当然,作业是老师搭好架子,我们需要自己写上核心的代码,读老师给的资料需要研究2、3天才完成。
第二节课讲了分布式的文件系统,NFS、AFS、GFS 等架构,以及这些网络文件系统的命名方法,还记得讲了半天 Amazon S3 Object 存储的文件命名,大概是路径其实就是文件名,例如 /doc/some_doc.doc 这个整体是个文件名。后来讲了文件系统的缓存策略,有 write-through,直接写入到服务端,delayed-write,先缓存起来,稍后再写入到服务器,write-on-close,在文件关闭后再写入服务器。再有就是文件内容的一致性、容错和恢复等。
第三节课,讲了分布式的 Hash Table,是 p2p 分布式网络的实现基础,把数据,利用一致性哈希,分布在各个节点上,每个节点维护一份路由表,用于利用 chord (弦算法?)快速找到数据所在的节点。每当有节点进入、退出的时候,还要再次利用一致性哈希,重新分部数据,这个数据是按节点的 ID 来存储的,ID 是多少的节点存储什么样的数据是有规定的。
第四节课讲了 Web Services 和 Restful API。学这节课让我见识到了,Restful API 可不是传递 JSON 数据那么简单,它是一整套的资源表示方法,对于 URL 斜杠后面的片段,都代表一种资源,可以对它进行 GET、POST、PUT、DELETE 等操作,在原理上,把它类比成了状态机。而资源的表示方法,不只有 JSON 一种,还有 XML、自定义的类型(application/vnd.xxx+xxx)等。
第五节课,貌似开始难了,讲了分布式服务器的错误模型,有很多种,印象最深的就是拜占庭故障,这个是引用了一个故事,说是有人冒充长官,发布攻击命令,转移到服务器这个概念上,大概是讲有服务器报了假故障(由于网络延迟等原因),所以需要一组服务器互相监督,形成拜占庭合约。具体的流程忘了,这节课还讲了其它的错误模型,然后讲了一些处理方法,每种方法需要由不同数量的服务器达成一致之后,才认为是真的出了故障了。
第六节课讲了时间和事件,这节课纯属是为了把人绕蒙,讲的是从一台或一组服务器中,发出的一组异步的事件,在逻辑上的时间,到达另一台/组服务器的顺序。首先这个逻辑时间表示法,压根也没咋搞懂,总之是一个序列还有一堆公式(出自 Lamport)。
第七节讲了异步通信和快照(完全不记得讲了啥?)。代码是 JMS 消息队列和 WebSocket相关的。
第八节、第九节讲了事务和分布式事务,讲的是分布式数据库的数据读取和写入,该如何保持事务的特性(ACID)。这需要事务管理器(Transaction Manager),而且一台还不够,如果这台服务器挂了,那么就没法读写数据库了,所以需要多台,那么多台就形成了分布式的事务,这样问题就又来了,多台事务管理器之间,如何对事务操作达成一致,这需要使用选举算法,例如 Paxos,后面讲了这个算法的原理,也没太记清楚,中间穿插了 2 phase commit 还有 3 phase commit 等不同的提交方式。
第十节讲了高可用,也是原理方面的,主从集群之间,对于故障的一致性达成策略,还有备份、恢复策略。
第十二节讲了 Hadoop 的用法,利用 MapReduce 模拟了谷歌的 PageRank 算法。
第十三节课讲了 NoSQL 数据库和最终一致性策略。NoSQL 数据库是为分布式打造的,所以数据的统一并不像关系型数据库那么严谨(Strong Consistency),NoSQL 是最终一致(Eventraul Consistency),期间可能会有数据不同步的情况,但是借助服务器的日志,会互相把旧的数据更新上来,这个过程不是实时的。这节课还讲了 CAP 理论。
最后一节课介绍了 P2P 网络,不同类型 P2P 的网络实现简介,还有中心化的数据库等等,云里雾里。
这就这节课的所有内容了,只是我记住的部分,每个概念都有背后的原理和算法,细节已经完全忘了(所以不要问我:( ),哪天用到了再查资料吧。这门课我感觉就是分布式框架的实现原理(例如 Zookeeper)、云计算服务器的配置(分布式数据库)等等,大概率工作开发中不需要,除非开发框架,或者底层的东西要用,这些算法还是很重要的。好了,有时间再回顾其它课程吧!