00:00
大家好。欢迎大家继续收看上硅谷云计算视频,我是万洋老师。这节课呢,我们去讲我们的调度算法。那讲吧,大家说呢,就是我们昨天再去构建的一些LS集群,我们使用提到了一个叫使用的是默认的R,叫RO Rubin轮询算法。那如果我们想实现一些特殊的功能呢?我们需要去借助不同的算法去帮助我们实现。也就意味着其实我们这节课讲的这些算法,也就是我们决定调度策略的这么一个。呃,配置还是比较重要的,需要大家认真的去理解以及吸收。那我们先分为两个部分,第一个部分就是通用算法,也就是调度规则。那所谓的通用算法,就是在我们很多的一些负载接触器都可以去配置,比如iOS也行。Linux也能这样配?那包括还有其他的一些,嗯,什么所谓的height啊这些。
01:02
调度器的工具都能去使用的算法。比较通用。那第二部分我们讲的是一个iOS比较特殊的一个算法,它也是算法,但是优先于算,优先于我们这些所谓的通用算法,它叫持久连接。到时候会给大家详细的去介绍好。那首先我们先看第一个部分,就是通用算法部分。那通用算法一般我们会分为两个不同的分类,第一个叫固定算法,第二个叫动态算法。所谓固定算法的含义就是我们每次再去iOS这些组件,这些负载流度器组件,再去接受到用户请求以后,把它分散到每一个真实服务器的时候,怎样去决定,他只去根据自己的算法去决定,而不考虑诶,这台服务器到底压力还够不够啊?完全不考虑。没有什么人道,对吧?哪怕你累死了,这是干你的活,你依然要去干。
02:01
这个就是所谓的固定算法,该怎么拉就怎么拉。那动态算法呢,就是我每次负载电路器再去把这个请求分配至真实服务器的时候,我不仅需要去考虑你已经连接了几次,我还要需要去考虑你当前的所谓的性能的消耗。能理解我的意思吧,所以它是多方面的去考虑的。那这样的话,其实调度起来的话就更平均。当然我们也不要忘了一点,就是固定算法本身其实它消耗的资源比较小,动态算法呢,需要实时计算,对吧,所以消耗的资源也比较大,那各有利弊。那所以呢,要选择与你当前环境适合的一种算法,能有效的提高你的负载调度器的工作效率。我们先看第一种算法,就是静态调度算法。对于静态调度算法来说呢,第一个已经不陌生了,就是我们之前所说的啊,叫熔珠柄对吧,那轮循算法。
03:06
讲班来说,就是我现在有。讲明来说,现在我有这么三台服务器,三台服务器。那每一台服务器,我们把假设它是R1。S。S3。那这是我的负载联络器,比如就是LS有一个用户连接过来。第一次发送请求的时候,第一次发送请求iOS会把它分散到第一台服务器。第二次。看到他第二弹。第三次。第三台。第四次。又到了第一台,也就意味着咱们一人来一次,谁也不吃亏,谁也不刀鞘。对吧,那这个就是所谓的RR荣Rubin轮巡算法。那还有一种算法呢,叫WR。WRW的含义就是Y的意思,也就是我们的重量对吧,叫权重,叫加权轮巡。
04:06
这有什么含义呢?给大家举个例子,我们在生产环境中用到的一些服务器。理想中的状态就是所有的服务器安装的都是同一批次,操作系统安装的都是同一版本的软件,所有的性能硬件性能都基本一致,那这样的话更便于我们的负载调度它的平均性。能理解我的意思吧?好,那既然是这样的话。啊,就能满足你了。但每个企业不一定。会保证它的服务器它的性能一致,原因是什么?我有老服务器,我也有服务器对吧,那老服务器和新服务器它的性能基本上是可以说是肯定不一致的,能理解我的意思吧。那假设,假设我这里有两台新服务器,我们叫N1N2。那还有一台老服务器叫OE,假设现在新服务器和老服务器呢?它的性能比是2:1,也就是它是两倍于旧服务器的性能。
05:06
那如果我现在再把它加到我们同一个MSG群里,采用的是R算法的话,那可能它分了十个连接,它分十个连接,它分十个连接。可能他忙死了,前两者还比较闲。能理解我的意思吧,那所以这时候我们WR就可以站出来了,说,诶,看我的。那怎么去做呢?我们可以把它设为两倍的权重,两倍的权重因为性能比是2:1,所以我要设两倍权重。每一次LYS在连接的时候会判断。当前的连接数除以权重,也就是权重是分母。能听懂我的意思吧,假设第一个分配过去,那它当前的计算值就是1/2。那他现在计算过去1/2,他计算过去一。那他俩肯定是圆小的对吧,所以第三层连接不会分给。
06:01
不会分给我们的这台O1,而是直接分给N1。那下一台呢,分给他。能听懂我意思吗?那。这样的话,他俩都有两个连接了,它也有两个连接,它一个连接,所以大家的比又为1:1:1了,那是不是又重新开始了,他开始,然后他。然后他他他。对吧,然后它它它也就意味着最终的比是我们的分母之比。那最终呢,访问量分配的情况就是2:2:1的这么一种情况,这就是所谓的加权轮询。进入一点。谁的权重越高,他就应该。负载的是当年权重比。能理解为什么把权重当分母去计算。那这个就是WR。那下一个叫SH。SH叫哈西,叫原地的山恋。
07:02
将同一个IP的用户请求分配给同一台服务器。同一个IP,同一个服务器。这里可能有些同学就比较有疑惑了,对吧,说咱们负载调度器主要的功能不就是将压力请求分散至不同的服务器吗?结果现在诶,怎么发送到同一台了,那我们还要负载度干嘛呢?直接拿一台不好吗?是这个意思吧。那既然是这样的话,其实我要给大家去普及一个东西了,就是我们的。Web服务器里面的一些概念性问题。在我们的服务器领域呢,我们的itp协议是标准协议,对吧?当然还衍生了所谓的itps,只是加密TPP而已。好,那itp其实它是一种叫做无状态协议。什么叫无状态协议呢?大家可以理解为它就是所有的,呃,怎么说呢,连接都是相当于是。
08:04
嗯,如果往计算机上去靠的话,相当于是我们的内存,也就是。什么意识性存储?当这样形容不是太贴切,但只是便于大家理解,也就意味着每一次我发起连接的时候,都不知道上一次连接的信息是什么。也就是每一次我都把你当做。是第一次。能理解我的意思吗?所以呢,这就会带来一些问题,你说这会带来什么问题?那举个例子,大家都登录过淘宝对吧?都访问过淘宝服务。那他会。登录,你去购买一些商品的时候,它会让你输入所谓的用户信息。对吧,会让你输入一些用户信息,也是你用户名密码登录成功以后,他才允许你访问一些比较特殊的一些数据,比如你当前的所谓的呃,快递到哪啦,对吧,比如你买的一些商品的信息。那如果是我们的无状态协议,不加任何的技术去实现的话,那最后的结果是什么?你知道吗?就是我输入用户,输完成以后,哎,我一点刷新,咔,又让你重新输入用户。
09:10
重新输入,那我再输入成功,我一点刷新啪又回来了,就无休无止刷新刷新刷新刷新刷新一直在登。那是不是我心态都崩了?所以呢。所以呢,我们引入了两种技术,一个叫cookie。一个叫塞。这两种技术呢,就是保障我们每次在连接以后可以知道服务器知道我们之前访问过哪些数据,以及我的相关参数,那这样的话更便于我们的某些服务的访问。对吧。但是cookie和sessioning是不一样的,如果一样的话,就没必要搞两种了,对吧?能理解我的意思吧?那我们先简要一下说明cookie和session到底有什么区别。给你可以理解为是一个叫用户端。
10:02
持久化。三星,我们把它列为叫服务器端持久化。怎么去理解这两个意义呢?就是cookie。假设我们现在有一个。我们现在有个网站。这是我的客户端。这是网站。Web服务对吧,好。我每次访问的时候,如果什么数据都不加的话,其实它相当于就是一次,不管是第一次还是第二次,相当于都是第一次访问,因为他不知道之前访问过对吧,那为了保障某些存储某些数据的话,我会在我的客户端上面啊。某片分区里面,缓存里面去存储我的一些所谓的cookie信息。
11:00
那这些信息呢,会伴随着我,后来如果服务器端响应的话,我会加拿我的请求。拿我的请求。如果服务器端需要的话,我会拿我的请求加上我的cookie数据一起发送给web服务器端,外部服务器端直接解析你的cookie就知道,诶,之前这个人是不是访问过啊,他访问的信息是怎样的,都会记录上。那这里就会带来一个问题,就是cookie是存在我们客户端本机的。往前倒个十几年,大家去上一些所谓的QQ的话,那时候是不是都是web界面了,对吧?会经常容易,哎,我在网吧上完以后,如果没重启机器的话,容易耗被到了,对吧?那原理是什么呢?其实很大一部分关系都跟cookie有关。那因为我们的密码账号都是存储在cookie里的。那别人呢,可以下一个叫cookie分析器,直接从我们的缓存提取出来对应的cookie信息,以及你访问的站点,那这样的话是不是就可以把你号给盗了,就这么一个东西,对吧。
12:05
所以在某些情况下,我们会发现是不太安全的,对吧。尤其是对于我们是服务方来说。客户肯定希望他数据都放在本机,那对于服务器端来说。他更希望的是把所有的数据存储在。不断。存储在web端。那纯粹在web端的时候,它其实就不叫cookie了,还是换了一个名字叫S。也就意味着你可以理解为,啊,我塞,就是原来。客户持久化数据只是保障到了我的服务器端而已。那塞性的存储方式有很多种,比如本地磁盘啊,分布式存储啊,包括数据库都是可以存储对应的塞塞性数据的。这个是我想要去表达的一个地方。那也就意味着我给大家看,我们刚才说的是SH。
13:01
然后再延伸到了我们的cookie三星,对吧,相当相信大家现在已经对cook cookie和S星已经有了一个呃明显的认知了。那我们再去说SH为什么要强调cookie和session,那我给大家画一张图,我们看一下。假设这是我的客户端。这是我的负载接读器,比如叫is对吧。那这是我们的。它是不是也是一个外部服务器对吧。那。首先。我们客户端访问过来。访问到iOS iOS是根据自己的算法把这个请求分散到了第一台临时服务器。那再假设一下,我们现在访问的业务就是淘宝,它会让你输入你的。用户名。
14:02
加密码对吧,在我们的网网页页面里去输入你的用户名加密码,那这样的话是不是会被提交到我们的N,也就意味着如果我这里采取的什么都没有采取的话。或者是我们采取的是session的话。它是不是应该是这样存储的。能听懂我意思吗?那这样存储完毕以后。那如果我一刷新的话,诶,是不是请求被提交到了我们的N。那这台机上面是不是没有你的酷IE和三星啊?所以呢。你又要去输入一遍,好,那再假设你又刷新了。结果又没有,你又失误了一遍。也就意味着你在这里会发现,那如果我这里后台有100台1000台我们的服务器的话,你是不是要输1000次才能进行很好的网站购物,你是不是。人都疯了,谁都受不了对吧?那所以可以怎么办呢?标准的解决方案应该是不把塞性存在本机,而是放在后面共享存储。
15:06
我们之前也说过了,对吧,筛选可以存到数据库里,可以存到缓存里,可以存到我们的分布式存储里,都是可以的,也就意味着他们之间。所有的数据读取都是从这个session池里去读的,而不是从服务器本机去读,那这样的话,只要你的客户端输入过一次以后,那我在这几台服务器是不是都能读得到。这是一个标准解决方案。如果你采用了这种标准解决方案的话,我们就不需要SH算法了,也就是我们刚才所说的SH算法,将同一个IP用户请求分散到同一个服务器。我们就不需要了。那需要的原因就是。你的开发没有接触过大型的我们的分布式项目,他不会有思想把。Session存在。本机以外的地方,也就是我们的共享存处理。那如果他的代码里没有去描述的话,我们在后面搭建的再美好也是白搭的。
16:03
所以在这种情况下,我们临时的解决方案。就是将同一个IP的客户端请求直接定到我们的一台固定的真实服务器上。那这样的话,用户再去输入过用户密码以后。那是不是就下次不管怎么刷新,反正都是定到这一台服务器的,那我是不是就不需要去考虑我们的三星问题了。当然还是那句话,这只是一种,这只是一种挽救方案,那最好的方案就是你把你们的项目代码迭代,采用后端共享存储,这才是我们应该去实现的。相信大家已经对这个算法已经有了一些了解认知了,对吧?那如果遇到这种比较尴尬的情况的话,我们就可以采用我们的算法。那我们下一个。DH算法叫destination哈希。
17:02
那DH算法叫目的目标地址删列,将同一个目标地址用户请求分散给同一个真实服务器。有点不一样是吧,这是SH根据语言去判断的,这是DH根据你的目标去判断。那大家又会语文了?那SH我还很好理解,我们用cookie和sessioning,为了解决我们的session共享问题。那DH到底有什么?有什么意义所在呢?将同一个目标用户请求分散给同一个真实服务器。也就意味着我们都知道,对于网站请求来说,它是一串这样的房,这样的定位服务,对吧。比如3W100度点com下的有一个AA下有个1.gpeg,当然我这是随便写了一个串,对吧,我们去解析一下这个链接关系,首先GPS采用的是NDPS标准协议对吧?冒号反应杠,反应杠固定格式,3W100度点COM100度服务器的完整的U2。
18:05
或者我们的FQDN,对吧?那杠A代表这台web服务器下的根下有个A目录。我说到这里的根并不是我们的Linux服务器本身系统的根,而是我们的web服务器,比如阿帕奇或N它的根。能理解我意思吧,跟一下有个A目录,A目录下呢,有一个叫1.jpg的文件。那这就叫资源统一定位服务对吧。那也就意味着。如果我们现在看这种情况,我们都知道缓存对吧。我们看下这种情况。假设这是iOS,我们现在后端调度的并不是我们的阿帕奇或者恩尼斯了,而是一个缓存服务器,可能是sque,对吧?这里有很多他死的。然后呢,S只是一个缓存服务器,它后端还需要有语言服务器,也就是真正提供我们的数据存储能力的,比如叫阿帕奇。
19:04
能理解我的意思吗?那缓存的工作过程就是。有请求问缓存,缓存说没有,那他会跟后端的阿帕奇去要数据,要完数据以后,阿帕奇返回数据制,我们的s square服务器,S secret服务器会把这个数据给缓存到本机,如果策略没问题的话,那并且把这个请求反馈给用户,那如果又来一个用户请求的是同样的数据的话,那S在这里是不是就已经拥有这个数据了,所以就可以直接缓存了,不需要去到后端去要了。减轻后端服务器压力。这就是缓存服务带来的含义,对吧?那之前我们讲read和我们的my circle结合起来,其实也是这个原理。好,那现在我有一个客户。客户呢,我会发起请求。到我的iOS iOS呢去。请求至squid。
20:01
那假设现在我请求的是一个根下的,根下的一个叫1.tpeg的文件。那这个文件的请求是不是会提到了squ SK说,哎,我没有这个文件怎么办,像我们的后端的。阿帕起去索要。那阿帕奇呢,肯定会返回给他,如果有的话,对吧。返回给他,那squad相当于本身是不是就已经缓存了这个文件了。那并且依次返回给我们的。客户端。那至此客户端就完成了整个操作,那如果再来下一个请求的话。如果再来下一个请求,我们看一下到iOS。
21:02
然后。IOS分散到第二台,因为是轮巡的嘛,对吧,然后第二台又向后端去要,然后以此类推,再回回回。那这里大家也会有疑问了,对吧?明明这一台SD已经有这个1.gpg了,为什么不拿它去回呢?对吧,他已经有了,我直接利用他的不就好了吗?那这个就是我们所谓的。DH算法。那最最常见的一种情,最常见采用他的方案呢,就是在我们的缓存服务中去采用,可以大大提高我们的缓存命中率。那什么叫幻灯命中率啊?我把这个请求分散给SK服务器,我分散到这个s square服务器,诶,它到底有多大的几率可以。本机已经拥有缓存,不需要到后端去要了,这叫缓存命中率,能理解我意思吗?采用我们的D算法以后可以大大提高我们的。缓存服务负载集群的这么一个缓存命中率。
22:02
更便于我们整个的并发提升。能理解我意思吧,好。那这几个呢,就是我们所谓的。静态调度算法。那接着我们继续往后看第二个动态调度算法。动态调度算法,讲白来说就是我不仅需要去考虑算法本身,我还需要去考虑我们当前服务器的当前的状态。并且还需要注意一下。动态调度算法,它理解为的HTP连接分为两种。一个叫活动链接或者活跃连接都可以,第二叫非活动链接。这两个怎么理解呢?活动链接就是我正在传输数据。能理解我意思吗?哎,我跟他握手呢,我还正在传数据呢。好,那非活动理念呢,就是。
23:00
刚建立握手。还没传数据。或者是传输数据完毕。还没有来得及断开。这都是我们所谓的非活动连接,那这个也比较好理解,对吧,活动连接按理说应该远大于我们非活动连接的资源消耗。一边还忙呢,对吧,另一边只是我还没有来得及结束而已。所以呢,那对于我们的动态调度算法呢,它会理解为活动连接。等同于256倍的非活动连接。也就资源消耗比。这里是需要我们大家注意一下的。好,那。动态运作算法呢,我们可以分为这么几个,第一个叫LC。最小连接最小连接将新的连接请求分散给连接数最少的服务器。
24:04
那它的算法就是活动连接乘上256加非活动连接。这个应该比较好算对吧,那可能大家以后去出去面试,可能会遇到这么一个面试题,假设现在它采用的是LC算法。然后第一台服务器。那他的活动链接是十个。非活动链接是,呃,多少个呢,100个。别100个了,1000个吧,好,第二台服务器。他的活动链接是,呃。五个啊,八个吧,那非活动理念是8000个,让计算下一次零点请求应该分散给哪一台服务器。那这个时候什么我们就开可以开始计算了,那它的LC算法是不是就是我们刚才也讲过了,活动里面乘二百五六加非活对吧,也就是十乘二百五六二五六零。
25:07
加1000。也就三千五百六对吧。那8256。加8000。从这里也可以看出来它的压力,第二台服务器的压力是远大于我们第一台的,所以下期的请求应该分散给第一台服务器,对吧?所以只有我们掌握了LC的相关的它的算法原理以后,你才能去判断我下一次使用分散给谁。你说这个在真正的生产环境中到底有没有意义啊?有意义便于你理解服务。那除此以外呢,没了。这个很好理解对吧,因为这些算法的分配是不是服务器本身去完成的。根本不需要你去计算,如果需要你去计算的话,那iOS的压力频率应该就在你对吧,因为咱们人肯定是处理这种数据,肯定是干不过机器的,这个很好理解对吧?好,那这是我们的第一种LC算法,叫最小连接。
26:07
那第二种叫WLC。W是不是又是权重的含义啊,对吧?他又再一次的站了出来,那它的算法就是类似于LC除以权重。能理解我意思吗?LC除以权重。那这样的话,你会发现一个结果就是。还是跟我们之前的。R和WR一样,如果他们的数据量都是一样的话,那他们会承重一个,呈现一个权重比的概念,对吧,因为它是分母。那这个我们就不再去演示了,等同于R和WR,那重新讲解没有什么含义,大家只需要记住它的算法即可。好,下一个叫sed,叫最短切望延时,我们把它叫做特殊的WLC算法。其实WLC算法有个小小的问题所在,或者LC也是一样。
27:04
还是第一台服务器,这里还是第二台。好,那假设现在我们的连接数都为零。我再假设一下第二台服务器,它的性能是第一台的两倍,也就是它们的权重比是1:2。那先问大家第一个问题,如果是WLC的话,他应该把请求分散给第几台?那怎么去计算啊,二百五六乘零还是零,零加零还是零,零除以零还是零,对吧?那最终结果就是零,那第二台是不是也是一致的。那既然大家都是一致的话,我我就会把请求分散给第一台服务器,因为它排在第一个。那我们就是怎么说呢,人嘛,我们就想要去把它给完美化,对吧,好,那怎么办呢?其实我们现在看来,它的权重比它的性能比应该是第二台更高。
28:00
那这时候我是不是应该拿第二台去分散给他,而不是拿第一台去承接用户的请求压力?这个比较好理解对吧,有好的我当然先用好的啊。那怎么去解决这个问题呢?解决的问题点就是我们不再是。活动成二百五六加飞活,而是活动加一以后。活动加一以后再去乘二百六二百五十六,再去除以权重。那这样有什么好处啊,大家都等于零的时候,零加一,哎,是不是一一乘二百五六除以权重,那是不是一定是这一台第二台服务器它的。值小,值小是不是就代表我们的压力小,压力小,所以就要把。资源分散给第二台。所以数学是很好玩的这么一个东西,对吧?只是简简单单的加一就解决了我们的很多问题。那这是我们的SE算法,那我们继续往后看。
29:01
下一叫NQ叫永不排队,它的描述方式叫特殊的SE算法,无需等待。如有真实服务器连接数等于零,那就直接分配,不需要运算。那这个是什么含义呢?讲白来说就是我每一台服务器每次再去进行我们的连接的时候,我的iOS是不是都需要去计算啊,把这个请求分散给哪一台服务器?那如果我is能确定哪一台服务器当前连接数等于零的话,我就直接分过去,我不计算。这个比较好理解对吧。那为什么说好理解啊?那举个例子,我现在有十个员工。他们的每个人的个人能力都不一样。但是哪怕最差的那个员工,我让他干一件事情,他是不是也应该能干掉啊,那不然的话,我要他干嘛呢?对于服务器是不是也一样?如果一个用户的压力你都承担不了的话,我还要你干嘛?能理解我的意思吧,那这就是NQ。
30:02
下一个。LBLC叫特殊的DHDH是干嘛的,叫D哈希对吧,目标。好,那讲白来说,既能提高缓存命中率,又要考虑服务器性能,这是什么含义啊,我们回到我们之前给大家画的这么一个DH图,给大家看一下。好,那C去连接。1.gpeg,找is los分到第一台squid squid找阿帕奇,然后缓存,对吧?假设我现在开启了我们的。DH。那对于一个新C来说,他依然找的是1.7PG,所以依然请求会被分散到我们的SD第一台S。能听懂我的含义吧,那第一代实惠的,因为我们已经缓存过数据,以后是不是就直接回回回客户端。那其实表面上看来没有问题。没有问题的原因是我没有考虑并发。
31:01
那前一段时间也不能讲前一段了,对吧,应该有大半年了,鹿晗和关晓彤在微博爆料他俩什么呃,在一起了,瞬间是不是服务器微博的服务器炸了。那如果我想表达的是,如果有类似的情况的话,你们公司这张1.gpg。他们的访量很大。如果你采用了D对算法,也就意味着你把所有的用户访问1.gpt的压力全部集中到死,这一台可能很可能就被压死了。能理解我的意思吗?那如果又不采用DH的话,那是不是又不能提高我们的缓存命中率,所以我们有一种比较好的方案就是采用我们的。LBLC算法。这是什么含义呢?就是我先把访问量集中到第一台squad,当我发现它的squad压力比较大的时候,我就再选一台服务器当做。他们两个轮流。也就他量轮巡,那如果它量压力都比较大的时候,我再加入一台服务器,加入到咱们的缓存队列来,一点一点的提升缓存队列,也就意味着既能保障我们的缓冲命中率。
32:11
又不会让哪一台s square服务器压力过大而崩溃。能理解我的意思吧?好,那其实我们看到还有一个叫LBLCR的算法啊,代表的是K写的意思,对吧,那尽可能提高负载又。能够缓存命中率的折中方案。这是什么含义呢?加了一个R代表缓存对吧。也就意味着我们不管把请求分散到哪一台S服务器,其实它要数据的话,都是向后端的阿帕奇去要的。那其实数据不仅仅只有阿帕奇有,还有谁有,还有S有。也就意味着,其实我开启了ibcr的话,那我的数据可以在多达十之间进行同步的,而不再需要从后端的阿帕奇去要。你说至于吗?不就一张图片吗?你还不让阿帕奇要你?别忘了,咱们这里可是单个元素。
33:04
对于我们整个公司网站来说,可能有上亿个不同的子元素。那每个子元素是不是都有对应的缓存啊,去要啊,那都集中到一台阿帕奇上,它的压力是不是也是非常大的。那这个呢,就是我们的。调度算法,也就是比较通用的调度算法,静态的和动态的。那大家呢,好好把它理解一下,尤其是跟我们的session和cookie加上我们的缓存去叠加以后,还是需要动动脑子的。那这节课呢,我们就先讲到这里。下节课我们再见。
我来说两句