分布式——一个高大上的名词,是计算机软件设计中人民群众喜闻乐见的“逼格满满”、“不明觉厉”的几个名词之一。这个逼格满满的名词总是让我望而止步,小心翼翼的有点不敢触碰,但最近在我眼前,耳朵前出现的频率太高了,让我不得不寻找相关资料,了解一些相关概念,来揭开它的遮羞布。
概念
简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
- 分布式:一个业务分拆多个子业务,部署在不同的服务器上,解决高性能、高并发的
- 集群:同一个业务,部署在多个服务器上,集群是解决高可用的
事实上,分布式很多时候都开不了集群的,在Dubbo、Hadoop、Elasticsearch都有体现。
业务量大常见的升级办法
- 机器升级
- 系统拆分
- 技术升级
- 分布式
分布式最主要的问题:一致性问题
常见的分布式集群的架构
- 纯负载均衡形式——硬件层面的 F5、软件层面的 nginx
- 领导选举型——ElasticSearch、zookeeper
- 区块链型——Bit Coin、Hyperledger
- master-slaver 型—— Hadoop 集群、HBase 集群、Redis 集群
- 规则型一致性 Hash
集群
集群主要分成三大类
高可用集群
高可用集群解决的是保障用户的应用程序持续对外提供服务的能力。
负载均衡集群
集群中所有的节点都处于活动状态,它们分摊系统的工作负载。一般Web服务器集群、数据库集群和应用服务器集群都属于这种类型。
负载均衡集群一般用于相应网络请求的网页服务器,数据库服务器。这种集群可以在接到请求时,检查接受请求较少,不繁忙的服务器,并把请求转到这些服务器上
科学计算集群
高性能计算(High Perfermance Computing)集群,简称HPC集群。致力于提供单个计算机所不能提供的强大的计算能力。
高性能计算分类
- 高吞吐计算:有一类高性能计算,可以把它分成若干可以并行的子任务,而且各个子任务彼此间没有什么关联。
- 分布计算:另一类计算刚好和高吞吐计算相反,它们虽然可以给分成若干并行的子任务,但是子任务间联系很紧密,需要大量的数据交换。
分布式
简单来说,你只要遵循下述步骤即可将任何一个软件拆分为“分布式”的:
- 将你的整个软件视为一个系统(不管它有多复杂)
- 将整个系统分割为一系列的 Process(进程), 每个 Process 完成一定的功能
- 将这些 Process 分散到不同的机器上。分散后,选择若干种(没错一种可能不够)通信协议把他们连接起来
拆分+连接是分布式系统的本质
本质上而言,实现一个分布式系统,最核心的部分无非有两点:
- 如何拆分——可以有很多方式,核心依据一是业务需求,二是成本限制。这是实践中构建分布式系统时最主要的设计依据。
- 如何连接——光把系统拆开成 Process 还不够,关键是拆开后的 Process 之间还要能通信,因此涉及通信协议设计的问题,需要考虑的因素很多,好消息是这部分其实成熟方案很多
为什么使用分布式呢?
解决问题的关键还是看你对问题本身的了解。通常我们需要使用分布式的常见理由是:
- 为了性能扩展——系统负载高,单台机器无法承载,希望通过使用多台机器来提高系统的负载能力
- 为了增强可靠性——软件不是完美的,网络不是完美的,甚至机器本身也不可能是完美的,随时可能会出错,为了避免故障,需要将业务分散开保留一定的冗余度
分布式学习入门-基础要点
- Process(进程)。在分布式系统中,进程是基本单元
- 通信协议。Process 间需要相互配合才能完成工作,因此通信协议是最基本要解决的问题。
- 命名法。两个 Process 要通信,必须相互知道对方的名字,名字可以是数字,也可以是结构化的字符串。
- 协作。上面都在谈 Process 之间的通信,可是为什么要通信?因为要协作。协作是个复杂的主题,其中最基本最基本的一个问题就是同步问题。
分布式学习入门-进阶
- 一致性。数据存储时,最基本的问题。
- 容错。冗余是容错的基础,但并不是全部,分布式本身为实现容错提供了一些便利,这也是实际设计系统时常常需要考虑的问题
实战
其实你早已接触过:你有没有开发过简单的增删改查软件?这类软件通常都需要搭配一个独立的数据库管理系统共同完成功能。实际上,只要你开发过这么简单的软件,那么你就已经开发过分布式系统了。因为具备分布式的基本特点如下:
- 整个系统中,你写的代码跑在 A 进程里,而数据库管理系统则跑在另外一个进程 B 里
- A 进程与 B 进程通过某种通信协议连接
- 既可以使 A 进程与 B 进程运行在同一台机器上,也可以将它们分开运行于不同的机器上,并且系统依然可以照常运行