什么是分布式系统

什么是分布式系统
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统 。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务 。其目的是利用更多的机器 , 处理更多的数据 。
【什么是分布式系统】首先需要明确的是 , 只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候 , 且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候 , 应用程序也不能进一步优化的时候 , 我们才需要考虑分布式系统 。因为 , 分布式系统要解决的问题本身就是和单机系统一样的 , 而由于分布式系统多节点、通过网络通信的拓扑结构 , 会引入很多单机系统没有的问题 , 为了解决这些问题又会引入更多的机制、协议 , 带来更多的问题 。。。
在很多文章中 , 主要讲分布式系统分为分布式计算()与分布式存储() 。计算与存储是相辅相成的 , 计算需要数据 , 要么来自实时数据(流数据) , 要么来自存储的数据;而计算的结果也是需要存储的 。在操作系统中 , 对计算与存储有非常详尽的讨论 , 分布式系统只不过将这些理论推广到多个节点罢了 。
那么分布式系统怎么将任务分发到这些计算机节点呢 , 很简单的思想 , 分而治之 , 即分片() 。对于计算 , 那么就是对计算任务进行切换 , 每个节点算一些 , 最终汇总就行了 , 这就是的思想;对于存储 , 更好理解一下 , 每个节点存一部分数据就行了 。当数据规模变大的时候 , 是唯一的选择 , 同时也会带来一些好处:
(1)提升性能和并发 , 操作被分发到不同的分片 , 相互独立
(2)提升系统的可用性 , 即使部分分片不能用 , 其他分片不会受到影响
理想的情况下 , 有分片就行了 , 但事实的情况却不大理想 。原因在于 , 分布式系统中有大量的节点 , 且通过网络通信 。单个节点的故障(进程crash、断电、磁盘损坏)是个小概率事件 , 但整个系统的故障率会随节点的增加而指数级增加 , 网络通信也可能出现断网、高延迟的情况 。在这种一定会出现的“异常”情况下 , 分布式系统还是需要继续稳定的对外提供服务 , 即需要较强的容错性 。最简单的办法 , 就是冗余或者复制集() , 即多个节点负责同一个任务 , 最为常见的就是分布式存储中 , 多个节点复杂存储同一份数据 , 以此增强可用性与可靠性 。同时 , 也会带来性能的提升 , 比如数据的可以减少用户的等待时间 。
下面这种来自for fun and的图形象生动说明了与是如何协作的 。
和是解决分布式系统问题的一记组合拳 , 很多具体的问题都可以用这个思路去解决 。但这并不是银弹 , 往往是为了解决一个问题 , 会引入更多的问题 , 比如为了可用性与可靠性保证 , 引用了冗余(复制集) 。有了冗余 , 各个副本间的一致性问题就变得很头疼 , 一致性在系统的角度和用户的角度又有不同的等级划分 。如果要保证强一致性 , 那么会影响可用性与性能 , 在一些应用(比如电商、搜索)是难以接受的 。如果是最终一致性 , 那么就需要处理数据冲突的情况 。CAP、FLP这些理论告诉我们 , 在分布式系统中 , 没有最佳的选择 , 都是需要权衡 , 做出最合适的选择 。