分布式系统,广义上来说就是一个系统,它运行在多台计算机上,共同完成任务。
比如现在比较流行的kafka。
单体应用
早年前,所有应用程序和数据均部署在一台电脑或服务器上,由一台计算机完成所有的处理。
对于计算机应用程序的最初样子,大多数人的印象应该都是这样,也就是所谓的单应用。
应用部署在单独的计算机上,必然受制于单机的性能,因为一台计算机的CPU、内存、硬盘都是固定的,有他自身的能力上限,而且存在单点故障问题
横向扩展
对于单机性能总是会有上限,不可能无限叠加,所以对于系统发展,只有一种解决方法,那就是横向扩展。
“人多力量大”在计算机系统发展中, 也适用,通过新机器的加入,运行相同或者不同的软件部分,实现系统整体的计算交付能力。
比如早期时候web应用,Nginx+多个tomcat,通过多个tomcat实现应用能力提升。
再比如,单机性能有限,为了能够承载更大的连接,存储更多的数据,很多系统采用分库分表,不管如何划分,系统总的数据存储量以及tps 必然是远超出一台计算机。
当然,这些场景又叫做集群,从逻辑角度广义的看,我认为集群就是分布式系统的一种。
细致比较的话,集群是个物理形态,分布式是个工作方式。
知乎有一个回答,说的比较严谨
[分布式与集群的区别是什么? - 知乎 (zhihu.com)](https://www.zhihu.com/question/20004877)
从干预式管理到自管理
比如第一幅图中的,Nginx+多tomcat,对于多个tomcat 他们之间并没有协调相关的任务,各自是独自运行的;
比如某台服务器宕机,其他机器也不会关注,也不涉及主从切换,也不涉及选主等。
如果想要对他们进行管理,比如某机器宕机后,自动拉起,可能需要安装一个看门狗程序等,诸如此类都是额外需要我们人工干预的。
三个server并不会有什么协作配合,各自独立运行的,也没有什么数据共享。
现在的一些中间件,比如redis,他们对外统一整体的提供服务,高内聚,对于使用者来说到底有几台机器,数据如何分布,并不需要很关注,只要按照提供的方法、逻辑进行访问就可以了,他们之间的选主、主从切换都是自管理的,对于使用者来说无需关注。
当下主流的中间件或者系统,比如ES、HBASE、kafka、rocketMQ等等,都是这种自管理的分布式系统。
ps:此处的自管理指的是整个系统多个节点之间,可以自行协作,不需要外部的干预,这整个系统是自治的。
分布式系统定义
定义:
分布式系统是其组件分布在连网的计算机上,组件之间通过传递消息进行通信和协调的系统。
分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个相关系统。
这句话突出了两个重点,集合与透明。
分布式系统必然是运行于多台计算机,而这些计算机上面的程序组成了一个整体,对外提供整体的服务,是透明的。计算机技术中,透明一词经常出现,意味着无需关注。
从进程的角度来看,两个程序分别运行在两个台主机的进程上,它们相互协作最终完成同一个服务(或者功能),那么理论上这两个程序所组成的系统,也可以称作是“分布式系统”。
这些程序可能是相同的,也可能是不同的。
回到上面提到的集群和分布式系统区别的问题,那么如果这一组进程是相同的,那就可以称之为集群。
基本特性
分布性
分布式系统的可能运行在不同国家、地区、房间等等,仅仅依靠网络进行通信、协调以完成任务,在物理上他们是不同的节点,是独立的。
自治性
因为是独立的,包含自己的处理器与内存,他们能够独立的处理任务,也会有自身独立的资源等。
并行性
分布式系统中, 存在多个节点,这些节点完全运行于不同的系统上,所以任务自然能够分发到不同的机器进行处理。
全局性
有全局的进程通信机制,系统的所有调用对外是一致的,这也是透明性的保障,因为统一,所以透明。
因为分布式系统屏蔽了底层的细节,所以对外呈现很多东西都内部通信、管理、协调,尽可能的对最上层的应用、用户提供简洁、一致、统一的服务,所以很多东西对用户层应用都是透明的,这也是分布式系统设计比较复杂的原因,因为你需要屏蔽大量细节,如同操作系统对我们屏蔽了大量细节一样。
特点
分布式系统的缺点很明显,就是两个字,复杂。
不管是从设计还是开发,或者是维护、测试、运维等都会变得很复杂。
优点也很明显,能够弹性扩容,提供远远超过单机的计算、存储、并发能力。支撑复杂的、海量的业务场景。
而且通过分布式系统,单机节点对于计算机硬件要求降低,也节约了很多的成本。
应用
从场景上来说,大致分为两类,一种是底层支撑的中间件性质的,比如存储、通信、消息队列、配置中心、搜索引擎等;还有一类是分布式的业务应用。
互联网巨头那些能够承载海量用户、并发的系统,全都是分布式系统,不存在这样的单机可以胜任这样的任务。
日常学习中,也主要是这两部分,练好基本功,学好各种分布式系统的中间件,提升能力,能够设计出自己业务的分布式应用。
分布式系统设计
分布式系统很多的场景下,需要解决的问题并不是完全相同的,比如分布式存储、分布式消息队列,他们必然有很多差异,但是根本来讲,他们也都是不同的分布式系统应用,也会有很多共同点。
下面大致列举一些,大多数中间件设计开发时,经常会面临的一些问题,并不全面,也并不是学术角度的分析
做一个简单了解,后续学习分布式相关的中间件时,就会发现他们的身影。
中间件
由于分布式系统把多个应用程序以及本地计算机操作系统,封装对外呈现出一致的逻辑功能特性,逻辑上位于用户与和应用程序组成的高层次,以及与操作系统组成的低层次之间,所以又叫做中间件。
转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-223-1-1.html