分布式系统是由一组经过网络进行通讯、为了完成共同的任务而协调工做的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机没法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。html
首先须要明确的是,只有当单个节点的处理能力没法知足日益增加的计算、存储任务的时候,且硬件的提高(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,咱们才须要考虑分布式系统。由于,分布式系统要解决的问题自己就是和单机系统同样的,而因为分布式系统多节点、经过网络通讯的拓扑结构,会引入不少单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题。。。java
在不少文章中,主要讲分布式系统分为分布式计算(computation)与分布式存储(storage)。计算与存储是相辅相成的,计算须要数据,要么来自实时数据(流数据),要么来自存储的数据;而计算的结果也是须要存储的。在操做系统中,对计算与存储有很是详尽的讨论,分布式系统只不过将这些理论推广到多个节点罢了。网络
那么分布式系统怎么将任务分发到这些计算机节点呢,很简单的思想,分而治之,即分片(partition)。对于计算,那么就是对计算任务进行切换,每一个节点算一些,最终汇总就好了,这就是MapReduce的思想;对于存储,更好理解一下,每一个节点存一部分数据就好了。当数据规模变大的时候,Partition是惟一的选择,同时也会带来一些好处:
(1)提高性能和并发,操做被分发到不一样的分片,相互独立
(2)提高系统的可用性,即便部分分片不能用,其余分片不会受到影响架构
理想的状况下,有分片就好了,但事实的状况却不大理想。缘由在于,分布式系统中有大量的节点,且经过网络通讯。单个节点的故障(进程crash、断电、磁盘损坏)是个小几率事件,但整个系统的故障率会随节点的增长而指数级增长,网络通讯也可能出现断网、高延迟的状况。在这种必定会出现的“异常”状况下,分布式系统仍是须要继续稳定的对外提供服务,即须要较强的容错性。最简单的办法,就是冗余或者复制集(Replication),即多个节点负责同一个任务,最为常见的就是分布式存储中,多个节点复杂存储同一份数据,以此加强可用性与可靠性。同时,Replication也会带来性能的提高,好比数据的locality能够减小用户的等待时间。并发
下面这种来自Distributed systems for fun and profit 的图形象生动说明了Partition与Replication是如何协做的。
分布式
Partition和Replication是解决分布式系统问题的一记组合拳,不少具体的问题均可以用这个思路去解决。但这并非银弹,每每是为了解决一个问题,会引入更多的问题,好比为了可用性与可靠性保证,引用了冗余(复制集)。有了冗余,各个副本间的一致性问题就变得很头疼,一致性在系统的角度和用户的角度又有不一样的等级划分。若是要保证强一致性,那么会影响可用性与性能,在一些应用(好比电商、搜索)是难以接受的。若是是最终一致性,那么就须要处理数据冲突的状况。CAP、FLP这些理论告诉咱们,在分布式系统中,没有最佳的选择,都是须要权衡,作出最合适的选择。性能
分布式系统须要大量机器协做,面临诸多的挑战:
学习
分布式系统中的机器,配置不同,其上运行的服务也可能由不一样的语言、架构实现,所以处理能力也不同;节点间经过网络链接,而不一样网络运营商提供的网络的带宽、延时、丢包率又不同。怎么保证你们齐头并进,共同完成目标,这四个不小的挑战。
优化
虽然单个节点的故障几率较低,但节点数目达到必定规模,出故障的几率就变高了。分布式系统须要保证故障发生的时候,系统仍然是可用的,这就须要监控节点的状态,在节点故障的状况下将该节点负责的计算、存储任务转移到其余节点
spa
节点间经过网络通讯,而网络是不可靠的。可能的网络问题包括:网络分割、延时、丢包、乱序。
相比单机过程调用,网络通讯最让人头疼的是超时:节点A向节点B发出请求,在约定的时间内没有收到节点B的响应,那么B是否处理了请求,这个是不肯定的,这个不肯定会带来诸多问题,最简单的,是否要重试请求,节点B会不会屡次处理同一个请求。
总而言之,分布式的挑战来自不肯定性,不肯定计算机何时crash、断电,不肯定磁盘何时损坏,不肯定每次网络通讯要延迟多久,也不肯定通讯对端是否处理了发送的消息。而分布式的规模放大了这个不肯定性,不肯定性是使人讨厌的,因此有诸多的分布式理论、协议来保证在这种不肯定性的状况下,系统还能继续正常工做。
分布式系统并不是灵丹妙药,解决问题的关键仍是看你对问题自己的了解。一般咱们须要使用分布式的常见理由是:
为了性能扩展——系统负载高,单台机器没法承载,但愿经过使用多台机器来提升系统的负载能力
为了加强可靠性——软件不是完美的,网络不是完美的,甚至机器自己也不多是完美的,随时可能会出错,为了不故障,须要将业务分散开保留必定的冗余度。在以提供 Service 为主的服务端软件开发过程当中经常遇到这些问题。
笼统的讨论分布式没有太大的意义,就如我刚才所谈的,实际上分布式很容易实现。真正难的地方在于如何选择正确的分布方案。
例如,当你想要创建一个分布式的数据管理系统的时候,你就必须得面对“一致性”问题。若是你对数据一致性要求很高,你就不得不容忍一些缺陷例如规模伸缩困难;而若是你放弃它,你能够轻松伸缩规模,但你必须解决好由此带来的一系列数据不一致致使的问题。(CAP 问题)
因而你会意识到,有许多种分布方案,为了正确解决你的问题,你须要对每个方案都进行了解,并评估,选择不一样的方案有时候区别不大,有时候却会深入的影响整个系统中其余部分的工做方式,甚至影响用户界面中用户操做时的流程。这是咱们学习分布式系统的重点所在。
如我前面所讲,分布式入门不难。主要包含以下知识点:
Process(进程)。在分布式系统中,进程是基本单元。
通讯协议。Process 间须要相互配合才能完成工做,所以通讯协议是最基本要解决的问题。这部分其实挺复杂,牵涉面光,不过核心仍是抓住两方面,一是存在哪些需求,二是各个协议如何知足这些需求命名法。两个 Process 要通讯,必须相互知道对方的名字,名字能够是数字,也能够是结构化的字符串。例如众所周知域名系统就是一种命名方案,可是方案还有不少,各有特色协做。
上面都在谈 Process 之间的通讯,但是为何要通讯?由于要协做。协做是个复杂的主题,其中最基本最基本的一个问题就是同步问题。而聊同步问题必然要聊“锁”……知识点就这么展开了。
上面几点是最基础的知识。了解了这些其实就算入门了。但是如何进阶呢?那么必然要开始学习下面的问题:
一致性。数据存储时,最基本的问题。其实也是实际设计系统时经常须要反复考虑的问题
容错。冗余是容错的基础,但并非所有,分布式自己为实现容错提供了一些便利,这也是实际设计系统时经常须要考虑的问题
以上都是分布式系统的理论基础,上海尚学堂Java学科在年前作了重大改进更新,加入了分布式系统课程,详情能够点击 上海java培训 查看上海尚学堂Java课程大纲和详情。获取免费资料或者试听资格能够联系客服咨询。
本文参考:xybaby https://www.cnblogs.com/xybab...