Introduction

分布式系统

随着移动互联网的发展智能终端的普及,计算机系统早就从单机独立工作过渡到多机器协作工作。计算机以集群的方式存在,按照分布式理论的指导构建出庞大复杂的应用服务,也已经深入人心。分布式(Distributed)是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务。集群(Cluster)是指在多台不同的服务器中部署相同应用或服务模块,构成一个集群,通过负载均衡设备对外提供服务。

本篇主要讨论分布式系统核心理论的相关内容。

mindmap

分布式系统定义

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

分布式系统中最基础的单元就是节点与网络,节点就是能提供单位服务的逻辑计算资源的集合,网络则将节点聚合起来,形成可协同工作的有机系统。传统的节点也就是一台单体的物理机,所有的服务都揉进去包括服务和数据库;随着虚拟化的发展,单台物理机往往可以分成多台虚拟机,实现资源利用的最大化,节点的概念也变成单台虚拟机上面服务;近几年容器技术逐渐成熟后,服务已经彻底容器化,也就是节点只是轻量级的容器服务。

网络将节点联接起来,但是网络也带来了一系列的问题。网络消息的传播有先后,消息丢失和延迟是经常发生的事情,典型的网络模式有如下三种:

  • 同步网络:节点同步执行,消息延迟有限,高效全局锁

  • 半同步网络:锁范围放宽

  • 节点独立执行:消息延迟无上限,无全局锁,部分算法不可行

分布式系统特性

在分布式系统概念与设计一书中,对分布式系统做了如下定义:分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。简单来说就是一群独立计算机集合共同对外提供服务,但是对于系统的用户来说,就像是一台计算机在提供服务一样。分布式意味着可以采用更多的普通计算机(相对于昂贵的大型机)组成分布式集群对外提供服务。计算机越多,CPU、内存、存储资源等也就越多,能够处理的并发访问量也就越大。

从分布式系统的概念中我们知道,各个主机之间通信和协调主要通过网络进行,所以,分布式系统中的计算机在空间上几乎没有任何限制,这些计算机可能被放在不同的机柜上,也可能被部署在不同的机房中,还可能在不同的城市中,对于大型的网站甚至可能分布在不同的国家和地区。这种分布性能够有效规避单点故障,即单个点发生故障的时候会波及到整个系统或者网络,从而导致整个系统或者网络的瘫痪。

标准的分布式系统会具备以下特性:

  • 分布式系统中的多台计算机之间在空间位置上可以随意分布,系统中的多台计算机之间没有主、从之分,即没有控制整个系统的主机,也没有受控的从机。

  • 系统资源被所有计算机共享。每台计算机的用户不仅可以使用本机的资源,还可以使用本分布式系统中其他计算机的资源,包括 CPU、文件、打印机等。

  • 系统中的若干台计算机可以互相协作来完成一个共同的任务,或者说一个程序可以分布在几台计算机上并行地运行。

  • 系统中任意两台计算机都可以通过通信来交换信息。

分布式系统应用

分布式系统的常见应用包括了:

  • 分布式应用和服务:将应用和服务进行分层和分割,然后将应用和服务模块进行分布式部署。这样做不仅可以提高并发访问能力、减少数据库连接和资源消耗,还能使不同应用复用共同的服务,使业务易于扩展。

  • 分布式静态资源:对网站的静态资源如 JS、CSS 、图片等资源进行分布式部署可以减轻应用服务器的负载压力,提高访问速度。

  • 分布式文件系统:单台计算机的存储始终有上限,随着网络的出现,多台计算机协作存储文件的方案也相继被提出来。最早的分布式文件系统其实也称为网络文件系统,现代分布式文件系统则出自由 The Google File System 这篇论文奠定了分布式文件系统的基础。几个常用的文件系统譬如 HDFS, FastDFS, CephmooseFS 等。

  • 分布式数据库:大型网站常常需要处理海量数据,单台计算机往往无法提供足够的内存空间,可以对这些数据进行分布式存储。传统关系型数据库为了兼顾事务和性能的特性,在分布式方面的发展有限,非关系型数据库摆脱了事务的强一致性束缚,达到了最终一致性的效果,从而有了飞跃的发展,NoSql(Not Only Sql)也产生了多个架构的数据库类型,包括 KV,列式存储,文档类型等。

  • 消息中间件:分布式消息队列系统是消除异步带来一系列的复杂步骤的一大利器,多线程高并发场景先我们常常要谨慎的去设计业务代码,来保证多线程并发情况下不出现资源竞争导致的死锁问题。而消息队列以一种延迟消费的模式将异步任务都存到队列,然后再逐个消化。

  • 分布式计算:随着计算技术的发展,有些应用需要非常巨大的计算能力才能完成,如果采用集中式计算,需要耗费相当长的时间来完成。分布式计算将该应用分解成许多小的部分,分配给多台计算机进行处理。这样可以节约整体计算时间,大大提高计算效率。分布式计算系统在场景上分为离线计算,实时计算和流式计算。

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