分布式基础

分布式系统题图

分布式基础

A distributed system is one in which the failure of a computer you didn’t even know existed can render your own computer unusable. – Leslie Lamport

过去数十年间,信息技术的浪潮深刻地改变了这个社会的通信、交流与协作模式,我们熟知的互联网也经历了基于流量点击赢利的单方面信息发布的 Web 1.0 业务模式,转变为由用户主导而生成内容的 Web 2.0 业务模式;在可见的将来随着 3D 相关技术的落地,互联网应用系统所需处理的访问量和数据量必然会再次爆发性增长。计算机系统早就从单机独立工作过渡到以集群的方式存在的多机器协作工作;按照分布式理论的指导构建出庞大复杂的应用服务,没有分布式系统,我们将无法拨打电话,转账或远距离交换信息。

分布式系统定义

典型的集中式系统即某个带多个终端的主机,终端仅负责数据的录入和输出,而没有有数据处理能力,并且运算、存储等全部在主机上进行。传统的银行系统、大型企业、科研单位、军队、政府等,存在着大量的这种集中式的系统。集中式系统的最大的特点就是部署结构非常简单,底层一般采用从 IBM、HP 等厂商购买到的昂贵的大型主机。因此无需考虑如何对服务进行多节点的部署,也就不用考虑各节点之间的分布式协作问题。但是,由于采用单机部署。很可能带来系统大而复杂、难于维护、发生单点故障、扩展性差等问题。不过对于许多现代软件系统而言,垂直扩展(通过在具有更多 CPU,RAM 或更快磁盘的更大,速度更快的计算机上运行同一软件进行扩展)是行不通的。更大的机器更昂贵,更难更换,并且可能需要特殊维护。

借鉴凯文.凯利 2016 年在《失控》一书中指出的分布式系统具有四个突出特点:即没有强制性的中心控制、次级单位具有自治的特质、次级单位之间彼此高度链接、点对点之间的影响通过网络形成了非线性因果关系,我们可以看出分布式系统具备的定义:

  • 分布式系统中的多台计算机之间在空间位置上可以随意分布,系统中的多台计算机之间没有主、从之分,即没有控制整个系统的主机,也没有受控的从机。
  • 系统资源被所有计算机共享。每台计算机的用户不仅可以使用本机的资源,还可以使用本分布式系统中其他计算机的资源,包括 CPU、文件、打印机等。
  • 系统中的若干台计算机可以互相协作来完成一个共同的任务,或者说一个程序可以分布在几台计算机上并行地运行。
  • 系统中任意两台计算机都可以通过通信来交换信息。

分布式系统则是一个在通过网络连接并作为单个逻辑实体运行的多台计算机上运行软件,它的硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。简单来说就是一群独立计算机集合共同对外提供服务,但是对于系统的用户来说,就像是一台计算机在提供服务一样。分布式意味着可以采用更多的普通计算机(相对于昂贵的大型机)组成分布式集群对外提供服务。计算机越多,CPU、内存、存储资源等也就越多,能够处理的并发访问量也就越大。从分布式系统的概念中我们知道,各个主机之间通信和协调主要通过网络进行,所以,分布式系统中的计算机在空间上几乎没有任何限制,这些计算机可能被放在不同的机柜上,也可能被部署在不同的机房中,还可能在不同的城市中,对于大型的网站甚至可能分布在不同的国家和地区。这种分布性能够有效规避单点故障,即单个点发生故障的时候会波及到整个系统或者网络,从而导致整个系统或者网络的瘫痪。

分布式系统的大小可能不同,从少数几台到几百台机器,以及从小型手持设备或传感器设备到高性能计算机的参与者特征。分布式系统中最基础的单元就是节点与网络,节点就是能提供单位服务的逻辑计算资源的集合,网络则将节点聚合起来,形成可协同工作的有机系统。传统的节点也就是一台单体的物理机,所有的服务都揉进去包括服务和数据库;随着虚拟化的发展,单台物理机往往可以分成多台虚拟机,实现资源利用的最大化,节点的概念也变成单台虚拟机上面服务;近几年容器技术逐渐成熟后,服务已经彻底容器化,也就是节点只是轻量级的容器服务。典型的案例是,我们熟悉的数据库系统主要在单个节点上运行的时间早已过去,大多数现代数据库系统都将多个节点连接到群集中,以增加存储容量,提高性能并增强可用性。

总结而言,与其说一个分布式、去中心化的网络是一个物体,还不如说它是一个过程。

分布式系统应用

今天的企业架构中充满了平台和框架,这些平台和框架都是分布式的,分布式系统的常见应用包括了:

  • 分布式应用和服务:将应用和服务进行分层和分割,然后将应用和服务模块进行分布式部署。这样做不仅可以提高并发访问能力、减少数据库连接和资源消耗,还能使不同应用复用共同的服务,使业务易于扩展。
  • 分布式静态资源:对网站的静态资源如 JS、CSS、图片等资源进行分布式部署可以减轻应用服务器的负载压力,提高访问速度。
  • 分布式文件系统:单台计算机的存储始终有上限,随着网络的出现,多台计算机协作存储文件的方案也相继被提出来。最早的分布式文件系统其实也称为网络文件系统,现代分布式文件系统则出自由 The Google File System 这篇论文奠定了分布式文件系统的基础。几个常用的文件系统譬如 HDFS, FastDFS, CephmooseFS 等。
  • 分布式数据库:大型网站常常需要处理海量数据,单台计算机往往无法提供足够的内存空间,可以对这些数据进行分布式存储。传统关系型数据库为了兼顾事务和性能的特性,在分布式方面的发展有限,非关系型数据库摆脱了事务的强一致性束缚,达到了最终一致性的效果,从而有了飞跃的发展,NoSql(Not Only Sql)也产生了多个架构的数据库类型,包括 KV,列式存储,文档类型等。
  • 消息中间件:分布式消息队列系统是消除异步带来一系列的复杂步骤的一大利器,多线程高并发场景先我们常常要谨慎的去设计业务代码,来保证多线程并发情况下不出现资源竞争导致的死锁问题。而消息队列以一种延迟消费的模式将异步任务都存到队列,然后再逐个消化。
  • 分布式计算:随着计算技术的发展,有些应用需要非常巨大的计算能力才能完成,如果采用集中式计算,需要耗费相当长的时间来完成。分布式计算将该应用分解成许多小的部分,分配给多台计算机进行处理。这样可以节约整体计算时间,大大提高计算效率。分布式计算系统在场景上分为离线计算,实时计算和流式计算。

将这些不同领域的分布式系统映射到实际生产环境中的应用,我们可以得到如下的表格:

Type of platform/framework Example
Databases Cassandra, HBase, Riak
Message Brokers Kafka, Pulsar
Infrastructure Kubernetes, Mesos, Zookeeper, etcd, Consul
In Memory Data/Compute Grids Hazelcast, Pivotal Gemfire
Stateful Microservices Akka Actors, Axon
File Systems HDFS, Ceph

和集中式系统相比,分布式系统的性价比更高、处理能力更强、可靠性更高、也有很好的扩展性。提取以上系统的共性需求,可以发现分布式系统能够帮我们解决如下的问题:

  • 单机性能瓶颈导致的成本问题,由于摩尔定律失效,廉价 PC 机性能的瓶颈无法继续突破,小型机和大型机能提高更高的单机性能,但是成本太大高,一般的公司很难承受;
  • 用户量和数据量爆炸性的增大导致的成本问题,进入互联网时代,用户量爆炸性的增大,用户产生的数据量也在爆炸性的增大,但是单个用户或者单条数据的价值其实比软件时代(比如银行用户)的价值是只低不高,所以必须寻找更经济的方案;
  • 业务高可用的要求,对于互联网的产品来说,都要求 7 * 24 小时提供服务,无法容忍停止服务等故障,而要提供高可用的服务,唯一的方式就是增加冗余来完成,这样就算单机系统可以支撑的服务,因为高可用的要求,也会变成一个分布式系统。

不过,分布式在解决了网站的高并发问题的同时也带来了一些其他问题。首先,分布式的必要条件就是网络,这可能对性能甚至服务能力造成一定的影响。其次,一个集群中的服务器数量越多,服务器宕机的概率也就越大。另外,由于服务在集群中分布是部署,用户的请求只会落到其中一台机器上,所以,一旦处理不好就很容易产生数据一致性问题。

分布式系统的挑战

分布式架构系统使模块重用度更高,开发和发布速度变得更快。但新的架构模式在解决问题的同时,也会带来新的问题。分布式架构首先就面临着高复杂度的问题,这主要体现在以下三个方面:

  • 协作模式。多台机器之间如何协作是非常重要的,选择主从模式、对等模式还是其他协作方式,直接决定了系统最后的运行效率。
  • 数据一致性。单体架构中,数据的存储、读取和计算等都在一处,处理起来很方便,但在分布式架构中,会有多处进行数据处理,那如何保证服务器间数据在同一时刻是一致的、客户端读取的都是最新结果?
  • 效率问题。限制效率的因素有很多,除了跨机房、跨地域的分布式架构自带的物理限制,还有节点规模越来越大而带来的沟通效率等问题。