这篇论文主要研究了如何在云平台负载均衡集群中保持会话。如我们所知,现如今大多数网站都采用部署在服务器集群中,为了应对随时可能会产生的大量交互请求,采用负载均衡来调度请求,从而实现每个服务节点高效快速的处理请求,这个技术方案固然是好的,但在部署中仍然会遇到一些难点。例如像电商这类需要在用户使用过程中一直保持会话的网站,如果采用负载均衡在一些时候可能会造成会话信息的丢失,严重影响用户体验。这篇文章的重点就是提出了一种会话共享模型,并设计了其实现方案。我i这篇博客主要内容是这篇论文中的内容加自己的理解。

      这个会话共享模型,主要分为三个部分:负载均衡模块、会话管理模块和会话存储模块。负载均衡模块的最主要职责是对请求内容进行分类、根据节点负载指标计算节点权重、依据权重进行请求调度;会话管理模块负责会话数据的创建、管理和维护,其中会话数据会在本地和会话存储集群各存一份;会话存储模块的主要职责就是备份采用粘性会话技术保存在本地内存中的会话数据,提高会话数据的可靠性,该模块使用redis数据库作为会话存储方式,并配置相应的持久化机制,同时为便于以后扩容和保证访问可靠性,采用Codis分布式方案作为Redis集群部署方案。

        其实他这个会话共享模型的主要思路类似于缓存技术,将会话数据保存在本地内存和会话存储集群中,保存在本地内存中是为了保证访问的速度,保存在会话存储集群中是为了保证数据的可循性,如果出现数据丢失的情况仍能够从会话存储集群中得到数据。当负载均衡模块处理新的请求时,会优先选择性能更高的节点(性能高的节点被选中的概率大些)来处理该请求,同时会话产生的数据会由会话管理模块保存在本地内存同时异步保存在会话存储集群中;如果负载均衡模块处理的请求是旧请求的话,会使用会话粘性技术得到之前处理该请求的服务节点,并更具其性能余量来判断其能否继续处理该请求,如果无法继续处理,则反馈给负载均衡模块,负载均衡模块会为该请求选择新的服务节点,并且新的服务节点会从会话存储集群中获取该请求的会话数据。主要就是以上的流程,当前其中仍然掺杂着一些技术细节,比如为避免后端节点过载,设计了一种阈值触发机制,该机制采用双阈值细化节点状态的判断;又如在选择节点时采用基于分发权重的随机转发机制,其根据随机数所处的位置确定转发的目标节点,避免了两次分发间的关联,使任务分配更加平衡。

      接下来解释一下这个阙值触发机制和基于分发权重的随机转发机制。

      这个阙值触发机制的目的是为了防止服务器集群失衡,因为负载均衡模块处理旧请求时会默认的调度之前处理它的服务器,这样可能会造成该服务器在极端环境下会失衡。这样我们就需要一个类似于“哨兵”的角色来监控当前服务器的性能余量,及时调整服务器节点的负载,当余量低于某一个值时不再接受任务或者直接停止处理任务来保护服务器。这种机制的关键是设置好阈值,这里阈值主要有2类:单项参数阈值和权重阈值。单项参数阈值是针对节点的关键几项参数而设置的,主要是Cpu剩余率、内存空闲率、磁盘I/O空闲率和进程数剩余率,一般设置为10%,调度器将节点上报的参数与参数阈值对比,若低于预设的参数阈值,则认为该节点已超负荷,将不再分配请求至该节点直至参数上升至阈值以上;权重阈值则是针对节点权重P(Si)而设置,权重阈值共有2个,分别是临界负载阈值T和严重负载阈值H,其中T>H,用于判断节点当前状态。严重负载阈值H的目的在于判断节点是否处于超负载状态,是否触发请求重新分配并清除会 话数据,设置临界负载阈值T主要是为了空出负载余量T-H,防止在节点信息收集的时间间隔T突然有大量的访问请求到来以及缓和请求重 新分配造成的会话连接抖动,T同时也作为是否将本节点加入调度器分发序列的判断依据,权重小于等于T的节点将不加入分发序列。这个负载余量相当于缓冲空间,在这个空间里节点不会发生问题但这个余量用完就会严重负载。所以正如下图流程图所示,当检测到当  >H&&<T时打断关联不再接受任务请求(节点内的任务仍会继续处理),<H直接清除会话数据并打断关联(节点内正在处理的任务 也立即打断,分配给其他节点处理)。

                                             

负载均衡不配会话保持_负载均衡不配会话保持

        模块采用的节点选择方式有两种:会话信息表转发和负载转发。其中会话信息表转发属于粘性会话技术,只对处理过的且会话信息表中有记录的请求起效,按照会话信息表中的记录转发,其特点是效率高,时延短,但容易负载失衡;负载转发则针对新请求及需要重新分配的旧请求,按照负载计算的分发权重转发,其特点是能较好的保证集群的负载均衡,但效率相对低一些。

        负载转发机制首先要计算节点的分发权重W(Si),了解节点的负载情况。之前我们已经得到了权重P(Si),且将权重小于等于T的节点全部 剔除出分发队列,权重越大,表示节点的负载余量越大,相应的分发权重也越大,即分发权重W(Si)与权重P(Si)是正相关的,但由于P(Si)的总和可能不为1,不能直接使用权重P(Si)作为分发权重,为此,通过以下计算公式3-4将分发权重W(Si)与权重P(Si)关联起来:

                                                  

负载均衡不配会话保持_权重_02

       在得出所有节点的分发权重W(Si)后,调度器根据每个后端节点的分发权重W(Si)为其分配相适应的任务负载。传统的任务分配方法是将节点的分发权重排序后取权重最大的作为任务分配节点,这种方法虽然简单易用,但是会带来一定的问题。之前介绍过节点负载信息的 获取是周期性的,在单个周期t内,节点的负载信息是上一次获取的,不是当前负载信息,而分发权重W(Si)是依据负载信息得出的,这意味着在时间t内,分发权重W(Si)是固定不变的,导致这段时间内的任务会集中到相同的服务节点上。为了避免这种两次分配之间关联 的影响,我们采用一种基于分发权重的随机转发机制。首先,由分发权重公式可知所有节点的分发权重之和为1,这样可以定义集群的整个概率空间为1,各节点依据分发权重的大小占据相应比例的空间,分发权重越大,其概率空间也越大。

具体的看论文吧,内容细节还是比较多的。在开头的百度盘里面,我已经转换为ptf了。