什么是分布式系统,如何学习分布式系统

作者:xybaby来源:https://www.cnblogs.com/xybaby/p/7787034.html

什么是分布式系统,如何学习分布式系统

文章插图
 
正文
虽然本人在前面也写过好几篇分布式系统相关的文章,主要包括CAP理论、分布式存储与分布式事务,但对于分布式系统,并没有一个跟清晰的概念 。
分布式系统涉及到很多的技术、理论与协议,很多人也说,分布式系统是“入门容易,深入难”,我之前的学习也只算是管中窥豹,只见得其中一斑 。
因此,一致希望能对分布式系统有一个更全面的认识,至少能够把分布式系统中的各个技术、理论串起来,了解他们在分布式系统分别解决什么问题,有哪些优秀的实现 。
我曾在网络上搜索过”如何学习分布式系统“,也在知乎上关注了该话题,但并没有看到一个全面的、有指导意义的答案 。
本文的目标是给打算全面学习分布式系统的自己、以及感兴趣的读者指明一条可行的路径,使得之后的学习不再盲目 。
不过,我并没有越过这座山,我只是站在山前,从前人留下的痕迹揣测山的全貌与沟壑,臆想的成分居多,还望各位大师指点迷津 。
什么是分布式系统 
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统 。
分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务 。其目的是利用更多的机器,处理更多的数据 。
首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统 。
因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题 。。。
在很多文章中,主要讲分布式系统分为分布式计算(computation)与分布式存储(storage) 。
计算与存储是相辅相成的,计算需要数据,要么来自实时数据(流数据),要么来自存储的数据;而计算的结果也是需要存储的 。
在操作系统中,对计算与存储有非常详尽的讨论,分布式系统只不过将这些理论推广到多个节点罢了 。
那么分布式系统怎么将任务分发到这些计算机节点呢,很简单的思想,分而治之,即分片(partition) 。
对于计算,那么就是对计算任务进行切换,每个节点算一些,最终汇总就行了,这就是MapReduce的思想;对于存储,更好理解一下,每个节点存一部分数据就行了 。
当数据规模变大的时候,Partition是唯一的选择,同时也会带来一些好处:
(1)提升性能和并发,操作被分发到不同的分片,相互独立
(2)提升系统的可用性,即使部分分片不能用,其他分片不会受到影响
理想的情况下,有分片就行了,但事实的情况却不大理想 。原因在于,分布式系统中有大量的节点,且通过网络通信 。
单个节点的故障(进程crash、断电、磁盘损坏)是个小概率事件,但整个系统的故障率会随节点的增加而指数级增加,网络通信也可能出现断网、高延迟的情况 。
在这种一定会出现的“异常”情况下,分布式系统还是需要继续稳定的对外提供服务,即需要较强的容错性 。
最简单的办法,就是冗余或者复制集(Replication),即多个节点负责同一个任务,最为常见的就是分布式存储中,多个节点复杂存储同一份数据,以此增强可用性与可靠性 。
同时,Replication也会带来性能的提升,比如数据的locality可以减少用户的等待时间 。
下面这种来自 


    推荐阅读