什么是分布式系统( 二 )


分布式系统挑战
分布式系统需要大量机器协作 , 面临诸多的挑战:
第一 , 异构的机器与网络
第二 , 普遍的节点故障
第三 , 不可靠的网络
节点间通过网络通信 , 而网络是不可靠的 。可能的网络问题包括:网络分割、延时、丢包、乱序 。
相比单机过程调用 , 网络通信最让人头疼的是超时:节点A向节点B发出请求 , 在约定的时间内没有收到节点B的响应 , 那么B是否处理了请求 , 这个是不确定的 , 这个不确定会带来诸多问题 , 最简单的 , 是否要重试请求 , 节点B会不会多次处理同一个请求 。
总而言之 , 分布式的挑战来自不确定性 , 不确定计算机什么时候crash、断电 , 不确定磁盘什么时候损坏 , 不确定每次网络通信要延迟多久 , 也不确定通信对端是否处理了发送的消息 。而分布式的规模放大了这个不确定性 , 不确定性是令人讨厌的 , 所以有诸多的分布式理论、协议来保证在这种不确定性的情况下 , 系统还能继续正常工作 。
分布式系统特性与衡量标准
透明性:使用分布式系统的用户并不关心系统是怎么实现的 , 也不关心读到的数据来自哪个节点 , 对用户而言 , 分布式系统的最高境界是用户根本感知不到这是一个分布式系统 , 在《and 》一书中 , 作者是这么说的:
Ais aofthatto its users as a.
可扩展性:分布式系统的根本目标就是为了处理单个计算机无法处理的任务 , 当任务增加的时候 , 分布式系统的处理能力需要随之增加 。简单来说 , 要比较方便的通过增加机器来应对数据量的增长 , 同时 , 当任务规模缩减的时候 , 可以撤掉一些多余的机器 , 达到动态伸缩的效果
可用性与可靠性:一般来说 , 分布式系统是需要长时间甚至7*24小时提供服务的 。可用性是指系统在各种情况对外提供服务的能力 , 简单来说 , 可以通过不可用时间与正常服务时间的必知来衡量;而可靠性而是指计算结果正确、存储的数据不丢失 。
高性能:不管是单机还是分布式系统 , 大家都非常关注性能 。不同的系统对性能的衡量指标是不同的 , 最常见的:高并发 , 单位时间内处理的任务越多越好;低延迟:每个任务的平均时间越少越好 。这个其实跟操作系统CPU的调度策略很像
一致性:分布式系统为了提高可用性可靠性 , 一般会引入冗余(复制集) 。那么如何保证这些节点上的状态一致 , 这就是分布式系统不得不面对的一致性问题 。一致性有很多等级 , 一致性越强 , 对用户越友好 , 但会制约系统的可用性;一致性等级越低 , 用户就需要兼容数据不一致的情况 , 但系统的可用性、并发性很高很多 。
组件、理论、协议
假设这是一个对外提供服务的大型分布式系统 , 用户连接到系统 , 做一些操作 , 产生一些需要存储的数据 , 那么在这个过程中 , 会遇到哪些组件、理论与协议呢
用一个请求串起来
用户使用Web、APP、SDK , 通过HTTP、TCP连接到系统 。在分布式系统中 , 为了高并发、高可用 , 一般都是多个节点提供相同的服务 。那么 , 第一个问题就是具体选择哪个节点来提供服务 , 这个就是负载均衡(load ) 。负载均衡的思想很简单 , 但使用非常广泛 , 在分布式系统、大型网站的方方面面都有使用 , 或者说 , 只要涉及到多个节点提供同质的服务 , 就需要负载均衡 。