任务目的
- 理解集群、分布式和负载均衡的概念
- 理解集群、分布式的区别
任务清单
- 任务1:分布式集群
- 任务2:负载均衡
详细任务步骤
任务1:分布式集群
从开餐馆说起:你开了一家餐馆,自己掌勺后厨(即做菜)。随着生意越来越好,发现自己忙不过来。于是你聘请了两个厨师,你们三位厨师就是一个“集群”。主要的职责是:洗菜、配菜、炒菜。你们关系如下:
随着生意越来越好,两种方式增加后厨的生产力:
(1)继续增加厨师——相当于扩大集群;
(2)引入流水线的机制,精细化分工。找人分担厨师洗菜、配菜等工作。类似下图。
分而治之的思想。即将一个大任务分解为多个小任务,提高小任务的生产力,从而提高了整体的生产力。而“分布式”解决问题的思路:正是吸取了将大任务分布为多个小任务的思想,才得到通过跨地域的分布解决大问题。
那么,集群和分布式的区别是什么?
以缩短单个任务的执行时间来提升效率的;集群则是通过提高单位时间内执行的任务数来提升效率。
(2)从软件部署的角度看:分布式是指将不同的业务分布在不同的地方;集群则是将几台服务器集中在一起,实现同一业务。
如下图,每个人都有不同的分工,一起协作干一件事情,叫做“分布式”。
再看下图,每个划桨人干的都是一样的活,叫做集群。
分布式中的每一个节点,都可以做集群,集群并不一定就是分布式的。其实这个赛龙舟的图,整体来看属于分布式,包括打鼓和划桨两个分布式节点,而划桨的节点又是集群的状态。
现实生活中例子还有很多,例如,这样的古代乐队的图就属于集群。
而现代乐队这样的图就属于分布式。
一个分布式系统,是通过多个节点组成的,各节点都是集群化,并且各集群还是分布式的。
任务2:负载均衡
负载均衡。
将请求分摊到多个操作单元也就是分开部署的服务器上,Nginx是常用的反向代理服务器,可以用来做负载均衡。集群与负载均衡之间有紧密联系,可以结合理解。
分治。由一个独立的统一入口来收敛流量,再做二次分发的过程就是负载均衡。
怎么均衡的背后是策略在起作用,而策略的背后是由某些算法或者说逻辑来组成的。
下面来罗列一下日常工作中最常见负载均衡策略:
(1)轮询
这是最常用也是最简单的策略,平均分配,人人都有、一人一次。
(2)加权轮询
在轮询的基础上,增加了一个权重的概念。权重是一个泛化后的概念,可以用任意方式来体现,本质上是能者多劳的思想。比如,可以根据宿主的性能差异配置不同的权重。
(3)最快响应
这也是一种动态负载均衡策略,它的本质是根据每个节点对过去一段时间内的响应情况来分配,响应越快分配的越多。具体的运作方式也有很多,上图的这种可以理解为:将最近一段时间的请求耗时的平均值记录下来,结合前面的加权轮询来处理,所以等价于2:1:3的加权轮询。
(4)Hash法
Hash法的负载均衡与之前的几种不同在于,它的结果是由客户端决定的。通过客户端带来的某个标识经过一个标准化的散列函数进行打散分摊。
上图中的散列函数运用的是最简单粗暴的取余法。
那么,负载均衡和分布式的区别又是什么?
请求是不可拆分的,是独立的一个请求,被服务器当中的任何一台接收并处理即可。
任何一个任务(请求)需要节点相互协作共同完成,是可以拆分的。
总结:
(1)集群
- 多个人紧密协作,来完成一个工作,就像一个人似的。
- 比如:餐馆里的所有厨师就可以看做一个集群
- 集群的好处:
* 做菜的能力比一个人时增加了
* 多招一个厨师,就能轻易增加做菜的数量(横向伸缩)
(2)分布式
- 一个任务由多个人协作完成。
- 比如:餐馆里有负责洗菜、配菜的配菜师,有专门负责做菜的厨师。
(3)负载均衡
- 将一系列任务逐项分发给多个人,完成任务的能力增加,而且让大家都不闲着(提高资源利用率),减少任务等待的时间(降低延迟)
- 比如:餐馆里做菜的厨师有多个,新的菜来了让谁做呢?
* 可以像发牌似的,一人一个轮流来(轮询)
* 有人做的快,有人做的慢,可以按照一定的比例轮流(加权轮询)