学习分布式系统需要怎样的知识?

今天跟大家聊一下分布式系统。首先需要说明的是,分布式系统是一个复杂且宽泛的研究领域,学习一两门在线课程,看一两本书可能都是不能完全覆盖其所有内容的。介于这篇文章是引导初学者入门,所以我个人觉得为初学者介绍一下当前分布式系统领域的全貌,也许比直接推荐论文和课程更有帮助。当初学者对这个领域建立起一个大的 Picture 之后,可以根据自己的兴趣,有选择性地深入不同领域进行进一步的学习。

本文主要试图回答以下两个问题:

1.  近些年分布式系统领域都在做些什么。
2.  为什么现在投入分布式系统的学习和研究是值得的。

我会尽可能多地去介绍更 “实用” 的分布式系统知识。

什么是实用?例如:

  • Paxos 是分布式系统里一个重要而且实用的技术。

  • Consistent Hash 也是分布式系统里一个重要而且实用的技术。

  • MapReduce、Spark 等等都是很实用的系统。

什么不实用? 例如:

  • Paxos 算法的数学证明。(注意此处“不实用” 和 “不重要”的区别)

当然,分布式系统实在是一个太宽泛的话题,本人才疏学浅,回答也仅仅可能侧重于我所关心的领域和方向,很多地方都不能面面俱到。所以在此只能抛砖引玉, 蜻蜓点水,欢迎大家提出宝贵意见,我也会及时对文章进行修改和补充。

分布式系统近些年都在做些什么?

分布式系统是一个古老而宽泛的话题,而近几年因为 “大数据” 概念的兴起,又焕发出了新的青春与活力。除此之外,分布式系统也是一门理论模型与工程技法并重的学科内容。相较于机器学习这样的研究方向,学习分布式系统的同学往往会感觉:“入门容易,深入难”。

的确,学习分布式系统几乎不需要太多数学知识(相比于机器学习),这也是为什么会造成 “入门容易” 的错觉。然而一旦深入下去,往往需要我们去体会 System 研究的 “简洁” 与 “美”,正如李沐的回答中说的那样,系统工作是 “艺术” 而不是 “科学” ,这一点我觉得是系统研究工作最难,同时也是最精华的地方。总之把握一点原则:好的系统研究工作,尤其是分布式系统研究,一定是尽可能地用最简单、最直观的方法去解决实际的问题(看看 MapReduce 就知道了),因为简单就意味着实用

总体来说,分布式系统要做的任务就是把多台机器有机地组合、连接起来,让其协同完成一件任务,可以是计算任务,也可以是存储任务。如果一定要给近些年的分布式系统研究做一个分类的话,我个人认为大概可以包括三大部分:

1.  分布式存储系统 
2.  分布式计算系统 
3.  分布式管理系统

近十年来在这三个方向上,毫无疑问, Google 都是开创者,甚至很多业内人士都说,这十年是外界追随谷歌技术的十年。我们之前说到,分布式系统的研究是一门由实际问题驱动的研究,而 Google 则是最先需要面对这些实际问题的公司。下面我们分别看看这三个方面工业界以及学术界这几年都在做些什么。

分布式存储系统:

分布式存储系统是一个非常古老的话题,同时也是分布式系统里最难,最复杂,涉及面最广的问题。 往细了分,分布式存储系统大概可以分为四个子方向:

1.  结构化存储 
2.  非结构化存储 
3.  半结构化存储 
4.  In-memory 存储

除了这四个子方向之外,分布式存储系统还有一系列的理论、算法、技术作为支撑:例如 Paxos、CAP、ConsistentHash、Timing(时钟)、2PC、3PC 等等,这些内容我们会在后面提到。现在,我们先来看看上述四个子方向大致都在干些什么。

结构化存储(Structured Storage Systems)的历史非常古老,典型的场景就是事务处理系统或者关系型数据库(RDBMS)。传统的结构化存储都是从单机做起的,比如大家耳熟能详的  MySQL。有句话说:MySQL 的成长史就是互联网的成长史。这一点也不为过。除了 MySQL 之外,PostgreSQL 也是近几年来势头非常强劲的一个 RDBMS。我们发现,传统的结构化存储系统强调的是:(1)结构化的数据(例如关系表);(2)强一致性 (例如,银行系统、电商系统等场景);(3)随机访问(索引、增删查改、SQL 语言)。然而,正是由于这些性质和限制,结构化存储系统的可扩展性通常都不是很好,这在一定程度上限制了结构化存储在大数据环境下的表现。随着摩尔定律面临的瓶颈,传统的单机关系型数据库系统面临着巨大的挑战。不过真的没办法了吗?在此我们先埋下一个伏笔:)

非结构化存储 (No-structed Storage Systems):和结构化存储不同的是,非结构化存储强调的是高可扩展性,典型的系统就是分布式文件系统。分布式文件系统也是一个古老的研究话题,比如 70 年代的 Xerox Alto、80 年代的 NFS、AFS、90 年代 xFS 等等。然而,这些早期的分布式文件系统只是起到了网络磁盘的作用,其最大的问题就是不支持容错 (Fault Tolerance)和错误恢复 (Fault Recovery)。而 Google 在 2003 年 SOSP 上推出的 GFS(Google File System)则是做出了里程碑的一步,其开源实现对应为  HDFS。GFS 的主要思想包括:

(1)用 Master 来管理 Metadata。
(2)文件使用 64MB 的 Chunks 来存储,并且在不同的 Server 上保存多个副本。
(3)自动容错,自动错误恢复。

Google 设计 GFS 最初的目的是为了存储海量的日志文件以及网页等文本信息,并且对其进行批量处理(例如配合 MapReduce 为文档建立倒排索引,计算网页 PageRank 等)。和结构化存储系统相比,虽然分布式文件系统的可扩展性、吞吐率都非常好,但是几乎无法支持随机访问(Random Access)操作,通常只能进行文件进行追加(Append)操作。而这样的限制使得非结构化存储系统很难面对那些低延时,实时性较强的应用。

半结构化存储 (Semi-structure Storage Systems)的提出便是为了解决非结构化存储系统随机访问性能差的问题。我们通常会听到一些流行的名词,比如 NoSQL、Key-Value Store,  甚至包括对象存储,例如 Protobuf、Thrift 等等。这些都属于半结构化存储研究的领域,其中以 NoSQL 近几年的发展势头尤为强劲。NoSQL 系统既有分布式文件系统所具有的可扩展性,又有结构化存储系统的随机访问能力(例如随机 Update、Read 操作),系统在设计时通常选择简单键值(K-V)进行存储,抛弃了传统 RDBMS 里复杂 SQL 查询以及 ACID 事务。这样做可以换取系统最大限度的可扩展性和灵活性。在 NoSQL 里比较有名系统包括:Google 的 Bigtable、Amazon 的 Dynamo,以及开源界大名鼎鼎的 HBase、Cassandra 等。通常这些 NoSQL 系统底层都是基于比较成熟的存储引擎,比如 Bigtable 就是基于 LevelDB(Jeff dean 写的,非常好的 C++ 源码教程),底层数据结构采用 LSM-Tree,除了 LSM-Tree 之外 B-Tree (B+Tree)也是很成熟的存储引擎数据结构。

In-memory 存储:随着业务的并发越来越高,存储系统对低延迟的要求也越来越高。 同时由于摩尔定律以及内存的价格不断下降,基于内存的存储系统也开始普及。In-memory 存储顾名思义就是将数据存储在内存中, 从而获得读写的高性能。比较有名的系统包括 Memcahed ,以及 Redis。 这些基于 K-V 键值系统的主要目的是为基于磁盘的存储系统做 Cache。还有一些偏向于内存计算的系统,比如可以追溯到普林斯顿 Kai Lee 教授早期的研究工作 Distributed Shared Memory ( DSM ),斯坦福的 RamCloud,以及最近比较火的基于 Lineage 技术的 Tachyon(Alluxio)项目(Spark 生态系统子项目)等等。

NewSQL:我们在介绍结构化存储时说到,单机 RDBMS 系统在可扩展性上面临着巨大的挑战,然而 NoSQL 不能很好地支持关系模型。那是不是有一种系统能兼备 RDBMS 的特性(例如:完整的 SQL 支持,ACID 事务支持),又能像 NoSQL 系统那样具有强大的可扩展能力呢? 2012 年 Google 在 OSDI 上发表的 Spanner,以及 2013 年在 SIGMOD 发表的 F1,让业界第一次看到了关系模型和 NoSQL 在超大规模数据中心上融合的可能性。不过由于这些系统都太过于黑科技了,没有大公司支持应该是做不出来的。比如 Spanner 里用了原子钟这样的黑科技来解决时钟同步问题,打破光速传输的限制。在这里只能对 Google 表示膜拜。

我们在之前提到,分布式存储系统有一系列的理论、算法、技术作为支撑:例如 Paxos、CAP、Consistent Hash、Timing(时钟)、2PC、3PC 等等。那么如何掌握好这些技术呢?以我个人的经验,掌握这些内容一定要理解其对应的上下文。什么意思呢?就是一定要去思考为什么在当下环境需要某项技术,如果没有这个技术用其它技术替代是否可行,而不是一味地陷入大量的细节之中。例如:如何掌握好 Paxos?  Paxos 本质上来说是一个三阶段提交,更 high level 讲是一个分布式锁。理解 Paxos 必须一步一步从最简单的场景出发,比如从最简单的 Master-backup 出发,发现不行;衍生出多数派读写,发现还是不行,再到 Paxos。之后再了解其变种,比如 Fast Paxos、Multi-Paxos。同理为什么需要 Consistent Hash,我们可以先思考如果用简单 Range Partition 划分数据有什么问题。再比如学习 2PC、3PC 这样的技术时,可以想想他们和 Paxos 有什么关系,能否替代 Paxos。

以上是我关于分布式存储系统内容的一些总结,推荐一些相关的论文 ,有兴趣的读者可以看看:

  • http://www.eecg.toronto.edu/~ashvin/courses/ece1746/2003/reading/ghemawat-sosp03.pdf

  • http://lintool.github.io/UMD-courses/bigdata-2015-Spring/content/ChangFay_etal_OSDI2006.pdf

  • https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf

  • http://lintool.github.io/UMD-courses/bigdata-2015-Spring/content/Khurana_etal_2012.pdf

  • http://lintool.github.io/UMD-courses/bigdata-2015-Spring/content/Abadi_2012.pdf

  • https://www.usenix.org/conference/osdi12/technical-sessions/presentation/corbett

  • https://www.cs.cornell.edu/projects/ladis2009/papers/lakshman-ladis2009.pdf

  • https://homes.cs.washington.edu/~billhowe/mapreduce_a_major_step_backwards.html

  • http://lintool.github.io/UMD-courses/bigdata-2015-Spring/content/Stonebraker_etal_CACM2010.pdf

  • http://www.cs.cmu.edu/~pavlo/courses/fall2013/static/slides/mapreduce.pdf

以上的部分内容来自网络,如有涉及版权立马删除。如果有问题可以在下面评论,技术问题可以私聊我。

原文地址:https://www.cnblogs.com/c1024/p/11012032.html