分布式的对立面就是集中式。
集中式系统就是由一台或者多台计算机组成的中心节点,数据集中存储在这个中心节点,并且整个系统的逻辑单元都在这个中心节点。
集中式系统部署简单,无需考虑对服务进行多节点部署,也就无需考虑多节点之间的分布式协作问题。
现在的分布式系统在解决部署和扩容便利性方面,都在追求类集中式系统的部署。将分布式系统单元化,一组服务作为一个单元,这个单元能提供完整的服务,扩容就是增加一个单元如此简单。
分布式特点
对于分布式系统,我的理解就是将集中式的程序拆分出独立的服务模块,部署在不同的网络计算机上,各模块之间仅仅通过消息传递进行通信和协调。
分布式系统中的计算机在空间部署上是随意分布的。可以在不同的机柜,可以在不同的机房,也可以在不同的地理区域。分布式系统都会有如下特点:
分布性
即计算机可以随意分布,不受空间约束。机器的分布情况可以随时变动。
对等性
分布式系统中的计算机没有主从之分。可以理解为计算机没有中心控制节点,组成分布式系统的计算机节点都是对等的。
需要指出的是,副本是分布式系统中最常见的概念,其对数据和服务提供的一种冗余方式,这是提高系统高可用的一方面。一种是数据副本,当某个数据节点失效之后,可以从其副本节点获取数据,这是解决分布式系统数据丢失问题的最常见做法。另一种是服务副本,多个节点提供相同服务,一个节点失效后可以转移到另外副本处理。
并发性
分布式系统中多个节点可能同时(并发)操作同一个资源,如数据库。如何高效准确协调并发操作,成为分布式系统架构设计中最大的挑战。一般架构设计的做法是将共享资源进行细分,将并发操作降低到最小。比如之前是一百万人会并发访问一个数据库,为把并发操作降低,可以设计并拆分数据库,将数据按照一定规则分开存放到十个数据库,控制每组是十万人并发访问各自的数据库。也可以增加多个数据副本,每个副本处理的并发量也会减小。
缺乏全局时钟
在分布式系统中,计算机在空间随意分布的,很难定义其中两个计算机上的事件先后发生顺序。原因就是缺乏全局的时钟。
故障总会发生
任何形式的故障都有可能发生。机房断电,光缆被挖,自然灾害,机器本身故障等。如何保证在故障发生时系统能正确提供服务也是一大挑战。一个被大量工程实践验证过的黄金定律是:任何在设计阶段考虑到的异常情况,一定会在系统实际中发生,并且还会遇到很多在设计上未考虑到的异常情况。
所以设计分布式系统时一定要严谨,不要存在侥幸心理,"这个事件发生的概率极其小,只有千万分之一"。但是在有千万用户的系统中,发生这个"千万分之一概率"事件的概率就是1。也就是必然会发生!
分布式环境中的问题
通信异常
现代计算机体系结构中,单机内存访问延时在纳秒级别,正常的一次网络交互延迟在0.1~1毫秒左右。如此巨大的延时期间,天知道会发生什么异常情况。所以消息的丢失和延迟就是家常便饭了。
网络分区
网络分区俗称"脑裂"。就是一个分布式系统因网络故障出现小的集群。集群之间互不通信,但是各集群又可能完成正常的逻辑。如果是数据业务,就会存在数据一致性问题。
三态
即成功,失败,超时。在单机系统中就只存在成功和失败。引入空间后就会存在超时状态。所以tcp协议层会有超时状态。
节点故障
某个节点挂掉了,或者由于网络问题,该节点与集群失去联系。分布式系统中,每个节点都可能出现故障,而且是必然事件。
参考 从paxos到zookeeper-分布式一致性原理与实践