- 什么是分布式
- 单体系统和分布式有什么区别?
- 分布式系统是怎么处理部分失败和全部失败的?
- 分布式系统中网络传输
分布式是解决单体系统不足的一种技术。结局了单机性能瓶颈不足导致的成本问题,廉价的PC性能无法突破问题。增加了系统的高可用。最重要的是分布式解决了大规模软件系统的迭代效率和成本问题。
互联网时代,单机系统无法解决成本,效率和高可用的问题,但是这三个问题,却是最关键的问题,分布式系统都可以优化解决这三个问题。所以这就是分布式系统。
单体系统和分布式有什么区别?本质上来看,单体系统是运行在某一个计算机上面的一个进程,分布式系统是运行在堕胎计算机上面的多个进程。正因为他们的本质区别,导致了分布式系统面临着处理故障,异步网络传输,时钟同步和共识协同。
分布式系统是怎么处理部分失败和全部失败的?故障是每个系统都要考虑的问题之一。在单体服务中,所有硬件正常的情况下,一个输入总有一个输出。在异常情况下,比如内存或者磁盘损坏,对于一个确定的输入,也会有一个无法启动或者直接系统崩溃的输出,而不是一个摸棱两可的输出。
这种一出现故障就直接系统崩溃(“也可以叫做宕机”)的输出,有一个最大的好处就是让用户知道系统内部出现了故障,计算机不会给出错误的结果,而是会直接崩溃。
相反计算机如果给出的是一个错误的结果,这些错误的结果和正确的结果混在一起,我们是没办法感知到的。比如系统的某次硬件故障把所有的0变成了1,并且写到了数据库。这个时候我们并没有发现业务代码有什么错误。等到我们发现的时候也许是很久以后,那么再想识别出来,并且运行处理这些数据的成本是非常大的。
分布式系统是由多个计算机节点组成的,而且每一个节点都是全部失败的模型。在分布式系统中某个节点出现了宕机或者网络故障,这个分布式系统便出现了部分失败的情况,也就是单机系统的全部失败的情况,在分布式系统中这个节点就无效了。解决这个问题大大提高了分布式系统的复杂性,也给我们处理分布式问题增加了很多难度。
部分失败是分布式系统的一个大挑战,解决这个挑战就是看分布式系统的设计方式和原则是怎么样的。在设计分布式系统的时候,我们需要考虑可能导致部分失败的原因是什么?考虑清楚系统中每一个会出现故障的部分,在不可靠的硬件上通过软件来容错,构建一个高可用的分布式系统。
在设计分布式系统的时候,每一个部分都最好是高可用的,在网络出现分区的时候,系统能够正确处理,网络分区恢复的时候,系统也要可以正确处理。不能出现不可预知的错误,特别在数据复制的时候。
分布式系统中网络传输网络传输分为本地调用和远程调用,在这里单体系统和分布式系统区别大了,单体系统几乎不用依赖网络,但是网络是架构分布式的基础。单体系统中调用服务直接调用本地的就可以,但是在分布式系统中不同的组件运行在不同的机器上面,分布式服务通过本地调用是不行的,所以在分布式系统中我们只能通过网络来进行调用,分布式系统中调用服务就是远程调用。
单体系统和分布式系统的调用虽然只有一个是否有网络通道这一个区别,但是这却给分布式系统带来了很大的复杂性。我们可以理解为,在单体系统中,只要发起调用,便一定会执行,在这里我们忽略了本地调用中调用方和被调用方数据传输的时间。
但是这种本地调用在远程调用中是不成立的,远程调用是通过网络进行发送数据和接收数据的。目前依赖的网络传输是异步的,从一个节点发送到另外一个节点,不能保证多少时间内到达,甚至不能保证一定可以到达;如果网络是同步的,能够保证从一个节点到另外一个节点的数据,最慢在多少时间内一定到达,这样就可以大大简化远程调用带来的复杂性了。
能不能实现一个同步网络呢?答案就是发送节点到接收节点之间建立一条带宽充足的专门链路。可是,这样会导致整个网络效率太低了,所以这是不现实的,分布式就是为了提高效率,实现高可用。



