1. 什么是分布式系统

分布式系统是相对于单机系统或者是集中式系统的一个概念,再明确分布式系统的概念之前,先来看下集中式系统的定义

1.1 集中式系统

集中式系统通常由一台性能超强的大型计算机来构成,构成一个中心节点,数据集中存储于这个中心节点上,并且整个系统的所有业务单元都集中部署在这个中心节点上,所有的业务逻辑都集中在这个中心节点上处理

图1

1.1.1 特点

这种集中式系统的最大特点就是结构简单,因为它一般是在一台高性能的单机节点上实现的,这台主机往往价格十分昂贵。由于是单机部署,所以不用考虑各个节点之间的分布式协作问题,所有的逻辑都由这个节点一体化处理。也正是由于单机部署,导致整个单机系统庞大而复杂,难以维护,并且还会存在单点故障,扩展性差等问题。单机系统要扩展,只能选用性能更高的主机,这往往意味着更高的成本,而且单机性能总有上限,也不容易达到性能要求

1.2 分布式系统

分布式系统可以看作是针对单机系统的瓶颈而产生的,采用的是“分治”的思想,将计算和存储分散到不同的网络节点上,彼此协调服务。可以给分布式系统下一个定义:分布式系统是硬件和软件都分布在不同的网络主机上,这些网络主机之间通过传递消息进行通信和协调,共同完成一个任务的系统

图2

1.2.1 特点

  1. 分散性:分布式系统中的节点都是独立运行的,并且可以在空间任意分布,而且可以随时变动。这种分散特性可以有效的提高分布式系统的可用性和伸缩性,并且具备很强的容错能力

  2. 并发性:分布式系统中有多个进程并发的运行,从而实现更高的性能

  3. 异构性:分布式系统中的节点可能具有不同的硬件和操作系统,甚至不同的进程可能有不同的编程语言完成

  4. 容错性:分布式系统可以通过备份、复制以及一些容错算法来避免单点故障,提高系统的可靠性

  5. 可扩展性:分布式系统可以灵活的增加和删减系统资源来适应不同的业务场景

  6. 透明性:分布式系统对外是无感知的,对用户而言感觉系统就是一个整体

2. 单机和集群以及分布式的关系

2.1 单机

单机其实很好理解,如上面集中式系统的图示,比如一个电商系统,最基本的需求,用户需要查看商品,所以需要对外提供商品服务,用户还需要查看物流信息,以及一些售后处理,所以系统还需要提供订单服务和物流服务。除了这些业务服务之外,系统还有一些提供基础功能的服务,比如文件服务,缓存服务等,在单机系统中这些服务都集中在一台机器上运行,这就是单机架构

图3

2.2 集群

单机架构的缺陷和明显,就是单机硬件资源瓶颈,有限的单机资源无法支撑大的业务量。那既然一台机器不行,就用多台机器不就可以了嘛,这样就催生出了集群架构。所以集群可以认为是单机的多副本模式,将原本的单机系统复制多分部署在多台机器上,这样就构成了一个集群。每台机器就称为集群的一个节点,注意集群中的每个节点干的是相同的工作,提供的是相同的服务

图4

在构建集群模式之后,很快就发现一个问题,当一个请求来到的时候,由于多个节点都是提供相同的服务,不可能这个请求在所有节点都跑一遍,那样就没有解决性能瓶颈问题了,只需要让这次请求打到某一个节点上,让这个节点来处理就可以了,这就是后面会详细讨论的负载均衡策略

2.3 分布式

集群的方式虽然可以有效解决单机资源瓶颈的问题,但是在单台机器上所有的业务都在一起,耦合度太高,这个系统庞大而复杂,维护起来也很麻烦。所以以应用系统的业务功能作为出发点,并将每个业务功能拆分成一个完全独立子系统,这些子系统之间通过传递消息进行通信和协调,共同完成一个任务的系统。可以看出,集群是相同应用的多备份部署,同一份代码,功能相同。而分布式是将业务拆成了不同的子业务,每个子业务有单独的服务部署,功能都不一样,这些子业务一起组成一个完整的系统。所以相比于集群,分布式的每个子系统是有区别的

图5

上图所示就是一个分布式系统,并且是一个分布式集群,将电商业务拆成了多个服务部署到了不同的服务器上,并且订单服务,物流服务,还有商品服务都是集群化部署,部署了多份。当然这个例子只是为了说明分布式和集群的关系,现在真正的业务场景一般不会这样部署了,不会一台服务器部署一个应用服务,都是容器化多实例部署

2.4 生活场景类比

比如说有一家饭店,刚开业的时候,由于客户量不大,所以只聘请了一位厨师,这位厨师承包了所有的工作,既负责配菜,又负责炒菜,还负责上菜,由于客户不多,完全能够应付,这种场景就相当于是最开始的单体架构 后来随着饭店名气越来越大,来的客人越来越多,此时一位厨师不够用了,所以聘请了多位厨师,但是每位厨师还是跟以前一样,干所有的活儿,只是加大了人手,并没有分工。这种场景就相当于是集群架构 再后来,饭店规模进一步扩大,为了便于管理和扩张,对厨师岗位进行了分工,有专门配菜的厨师,也有负责炒菜的厨师,有的专门负责上菜。这种场景就相当于是分布式架构

3. 分布式与微服务

熟悉了分布式的概念,这里需要强调一下分布式和微服务的关系 首先看一下微服务的定义,微服务是一种软件设计理念,它是面向服务的,将大的系统或者是服务,拆分成一组小的且相互独立的服务。这些小的服务都是都是独立运行的,并且每个小服务有自己的数据库、业务逻辑,服务之间通过网络进行通信和协作。这组小服务一起协作对外提供服务,共同完成一个系统的任务。 看定义其实微服务和分布式很像,都是分治的思想,加大系统拆成小单元,共同对外提供服务。他们之间的关系可以这样概括: 微服务其实是一种特定的分布式系统架构风格,分布式是一种系统架构的范畴,而微服务是分布式系统的一种具体实现方式,微服务将应用程序拆分成小的、自治的服务单元,通过网络进行通信和协作来完成系统任务。分布式有很多种实现方式,微服务并不是它唯一的实现方式

4. 为什么需要分布式系统

前面简单提到过,分布式系统是针对单机系统的瓶颈而产生的,这里就详细分析下,分布式系统究竟可以解决哪些单机系统解决不了的问题

4.1 高性能

面对现在如今这种海量规模的互联网业务,其实单机的物理硬件已经无法再有效支撑系统的高性能了。虽然说现在也有了一些超级计算机,拥有多核cpu,本身有着很强的计算能力,但是即便是这种超级计算机依然无法突破物理限制,并且随着机器性能越高,其成本也会迅速上升,所以,分布式就自然而然成了解决高性能的一种有效手段。分布式系统通过将多个廉价的计算机组合起来,形成一个拥有足够的cpu,内存以及物理磁盘的系统,可以轻松突破物理瓶颈,实现对高性能的需求,并且更廉价

4.2 可扩展性

现今,很多的业务场景都海量级的,所以很多的应用都是数据密集型的,有着海量的数据存储需求。并且随着业务规模的扩张,用户增长迅速,再加上已有的历史数据,单机的存储根本就无法满足存储需求,所以存储上也需要构建一套分布式存储系统,可以让数据量方便的扩展

4.3 高可用性

前面也分析过,单机系统一个很重大的缺陷就是单点故障,这对于业务而言是完全不可接受的。尤其在现在,基本上都要求服务能够7*24小时不间断的提供服务,这就要求我们的服务必须具备高可用性,显然单机系统无法做到。而分布式系统,可以通过冗余数据备份来保证数据的可用性,同时通过冗余计算实例(跑两个相同的计算任务),一个实例挂掉之后,可以迅速切换到另一个,达到计算高可用

5. 分布式架构与单机架构对比

对比项 单机架构 分布式架构
部署难易程度 简单 复杂
架构设计难度 难度小 难度大
系统隔离性 故障影响范围大 故障影响范围小
可用性 存在单点故障,无法保证高可用 高可用
扩展性 很差 易扩展
系统性能 吞吐量小,响应时间快 吞吐量大, 响应时间略慢
开发维护 系统庞杂,维护复杂 系统解藕,子系统相对独立,易于维护
错误排查 简单 链路长,问题追踪复杂
技术栈 系统技术栈统一 系统技术栈多样

从表格的对比分析不难发现,分布式其实也存在不少的问题,比如在系统性能上,虽然提高了吞吐量,但是由于服务见的调用链,导致一次请求的路径变长了,有多段网络通信,所以导致响应时间肯定是延长的,所以对于一些响应时间要求很高的业务往往很少用微服务架构,比如在某些游戏领域,后台有的还是单体架构,只是用了集群模式。另外,由于分布式设计到服务拆分,其设计难度也加大了,对于系统故障的排查的难度也比单体上有所增加。 所以,综合来看,分布式系统并非银弹,它和单体架构都有各自的使用场景,在做系统设计的时候要根据实际的业务场景出发,选择合适的架构

Logo

更多推荐