一种基于负反馈机制的TCP长连接负载均衡调度方法及系统
技术领域
本发明属通信技术与信息化技术领域,涉及到网络通信中的一种基于负反馈机制的TCP长连接负载均衡调度方法及系统。
背景技术
目前,5G时代已经加速到来,物联网通过互联网连接大规模的低功耗交互式设备,这些设备会产生海量数据,数据的交换处理变得越来越繁重。设备端与服务器端通过建立TCP长连接进行通信,设备端收发消息的大小、频度、服务质量等因素都会对服务器带来压力,如TCP连接数、网络带宽以及系统资源利用率等。集群和负载均衡技术为此提供了思路,如Linux内核集成的LVS(Linux Virtual Server)即Linux虚拟服务器,LVS在内核中实现了10种调度算法。而已有的LVS调度算法未选择合适的负载指标、未考虑节点的实时负载的实时变化,未能解决TCP长连接上socket buffer读写队列拥塞变化带来的负载倾斜的问题。
LVS提供了10种负载均衡算法:轮询调度、加权轮询调度、最小连接调度、加权最小连接调度、基于局部性的最少连接、带复制的基于局部最少连接、目标地址散裂调度、源地址散裂调度、最短的期望延迟和最少队列调度。
现对上述均衡算法介绍如下:
轮询调度(Round-Robin Scheduling,简称RR)为静态负载均衡算法,负载调度器会为集群节点创建一个序列,新的请求总是被发给当前位于序列中最靠前的节点,并按序列顺序发送随后到来的请求。
加权轮询调度(Weighted Round-Robin Scheduling,简称WRR),考虑到了各节点处理能力的差异,引入了“权”值,改进了简单轮询调度算法。管理员根据服务器的处理能力为每个节点分配权重,集群按请求到达的顺序分配节点。
最小连接数(Least-Connection Scheduling,简称LC)根据当前节点打开的连接数,将新的用户连接请求分配到活跃连接数最少的节点。
加权最小连接调度(Weighted Least-Connection Scheduling,简称WLC)将新来的连接请求发给当前连接数占集群连接数的百分比并除以自身权值后值最小的节点。
基于局部性的最少连接调度(Locality-Based Least Connections Scheduling,简称LBLC)是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。
带复制的基于局部性最少连接调度(Locality-Based Least Connections withReplication Scheduling,简称LBLCR)针对目标IP地址的负载均衡,目前主要用于Cache集群系统。
目标地址散列调度(Destination Hashing Scheduling,简称DH),根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
源地址散列调度(Source Hashing Scheduling,简称SH),根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
最短的期望的延迟调度(Shortest Expected Delay,简称SED),基于WLC算法,使用SED算法后会进行一个运算,把请求交给得出运算结果最小的服务器。
最少队列调度(Never Queue,简称NQ)该算法无需队列,如果有节点的连接数等于0就直接分配过去,不需要在进行SED运算。
LVS提供的10种调度算法中RR、LC、WRR、WLC、SED都未考虑节点实时负载;NQ基本不存在;LBLC、LBLCR、DH和SH不适用于大规模TCP长连接负载均衡场景。其中RR和LC适用于集群各节点处理能力相似,请求任务较轻的情况。如果各节点性能差距较大,RR和LC算法容易造成负载倾斜;WRR在负载较轻的集群中运行较好,如果运用在负载较重的集群上或偶尔计算量较大的连接请求被分配到同一个节点上也会造成负载倾斜;WLC未考虑节点实时变化的负载,建议在低流量的场景下使用该算法,在高流量场景下也会造成负载倾斜;LBLC和LBLCR主要用于Cache集群系统;DH和SH实际可以运用在防火墙集群中,以保证整个系统的唯一出入口。在某些场景下,针对LVS调度方法未考虑节点实时负载引入负载倾斜和未考虑集群节点实时负载变化和性能差异问题,无法支撑大规模TCP长连接和高频消息收发的场景,目前尚未提出有效的解决方案。
发明内容
发明目的:针对LVS提供的调度方法未考虑节点实时负载变化可能引起的负载倾斜问题,本发明提供了一种基于负反馈机制的TCP连接负载均衡调度方法及系统。
技术方案:一种基于负反馈机制的TCP长连接负载均衡调度方法,包括以下步骤:
步骤1:通过部署在集群每个节点上的采集代理,周期性收集节点负载指标;
步骤2:根据节点负载指标,计算得到节点综合负载,并采用计算得到的节点综合负载对上一采集周期得到的节点综合负载进行更新;
步骤3:基于当前节点综合负载,采用负反馈机制计算得到节点权重;
步骤4:将客户端请求分配到节点权重大的节点上。
进一步的,步骤2中的节点负载指标包括:CPU平均负载、内存利用率、集群在线连接率和socket buffer数据堆积量变化;
根据节点负载指标,根据下式计算得到节点综合负载:
AL(S)=lamda(C)*L(C)+lamda(M)*L(M)+lamda(T)*L(T)+lamda(sb)*L(SK) (5)
式中,AL(S)为节点综合负载指标,L(C)为CPU平均负载,lamda(C)为CPU平均负载的权重因子,L(M)为内存利用率,lamda(M)为内存利用率的权重因子,L(T)为集群在线连接率,lamda(T)为集群在线连接率的权重因子,L(SK)为socket buffer负载,lamda(sb)为socket buffer负载的权重因子。
进一步的,所述集群在线连接率表示单位时间内节点连接数与集群平均连接数的比例,根据式(1)计算得到:
其中,Ti表示第i个节点的连接数,N表示集群节点数。
进一步的,所述socket buffer数据堆积量变化通过socket buffer平均离散系数进行表征;所述socket buffer平均离散系数根据式(2)计算得到:
其中,CV(SKr)和CV(SKw)分别为socket的读队列和写队列的离散系数:
CV(SK)=S(SK)/Qmax (3)
式中,S(SK)为L(Q
k)的标准差,Q
max为socket buffer队列的最大值,L(Q
k)为第k个采用间隔上socket buffer队列的负载,
为socket buffer队列的平均值,N(kT)为第k个采样间隔上socket buffer队列的个数。
进一步的,步骤3中,采用负反馈机制,根据式(6)计算得到节点权重:
其中,A为可动态调整的系数,其值为统计指标的项数;SU为系统利用率。
本发明还公开了一种基于负反馈机制的TCP长连接负载均衡调度系统,包括:
采集代理,分布式部署在集群中的每个节点上,用于周期性收集节点负载指标;
节点综合负载计算模块,用于根据采集代理采集到的节点负载指标计算得到节点综合负载;
权重计算模块,用于根据节点综合负载计算模块输出的节点综合负载计算节点权重系数;
调度器,用于根据各节点的节点权重系数,将客户端请求分配到节点权重系数大的节点上。
进一步的,还包括:
监视器,与集群的每个节点均建立长连接,用于侦听节点健康状态,并根据节点健康状态,对服务不可达的节点从集群中剔除。当节点恢复健康状态后,再通知监视器并加入集群。
进一步的,还包括:
缓存模块,用于缓存节点信息、节点负载指标、节点综合负载和节点权重系数。
有益效果:本发明与现有相比,具有以下优点:
1、本发明以内核socket buffer为重点负载指标,通过采集代理收集节点上的负载指标计算综合负载,再根据综合负载计算节点权重,由调度器将客户端请求分配到负载较轻的节点上,避免有节点超载时却依然收到大量请求以此减小集群平均响应时间、提升系统吞吐率;
2、本发明的调度器基于负反馈机制计算权重,采用集中式控制监视节点健康状态,综合考虑集群节点的实时负载和响应情况,不断调整各个节点间处理连接请求的比例,平衡集群中各节点负载,有效解决了集群中的负载倾斜问题,缩短了集群平均响应时间,大大提升了集群吞吐率。
附图说明
图1为本发明的调度方法框架图;
图2为未采样和被采样集群响应时间对比;
图3为最小连接数和CMTS算法集群平均响应时间对比。
具体实施方式
现结合附图和实施例进一步阐述本发明的技术方案。
实施例1:
在Linux系统中,TCP/IP以及通用网络驱动软件是内核的核心组件,数据包以socket buffer即套接字缓存穿过这些内核组件,socket buffe负责在源和汇点之间传递报文数据,针对现有负载均衡算法未能解决负载倾斜的问题,本实施例引入内核的socketbuffer的数据堆积量作为重点指标、综合考虑CPU性能、CPU平均负载、内存利用率以及集群在线连接率作为负载指标,提出了一种基于负反馈机制的TCP长连接负载调度方法,以集群中的一个节点为例,结合图1,说明本实施例的调度方法的步骤:
步骤1:在集群上的每个节点上部署代理检测程序,检测到采集代理进程停止后重新拉起以保证其高可用;
步骤2:采集代理运用Linux的Crontab做周期性任务,采样间隔T需要在集群部署前经过压测获得,过小会对集群造成额外开销;过大则不能真实反映集群当前负载状况,采集代理周期性收集节点负载,在本实施例中,节点负载具体包括CPU平均负载、内存利用率、集群在线连接率,集群在线连接率表示单位时间内节点连接数与集群平均连接数的比例:
其中,Ti表示第i个节点的连接数由采集代理通过侦听服务器的一个或多个端口统计ESTABLISHED状态的TCP连接数得到,N表示集群节点数。Ti是通过执行示例命令(1884为待监听的端口号):ss|grep-E 1884后对记录数求和得到。如果待监听端口为1884和1885则命令格式为ss|grep-E 1884|1885。
采集代理读取Linux文件系统/proc/loadavg计算CPU平均负载L(C),读取/proc/meminfo计算内存利用率L(M),并计算根据式(2)计算socket buffer平均离散系数:
其中,CV(SKr)和CV(SKw)分别为socket的读队列和写队列的离散系数;
本实施例中的CV(SKr)和CV(SKw)计算时以socket buffer的读队列的最大值和写队列的最大值代替队列的平均值,计算公式为:
CV(SK)=S(SK)/Qmax (3)
式中,S(SK)为L(Q
k)的标准差,Q
max为socket buffer队列的最大值,L(Q
k)为第k个采用间隔上socket buffer队列的负载,
为socket buffer队列的平均值,N(kT)为第kT个采样间隔上socket buffer队列的个数。
本实施例通过socket buffer平均离散系数来表征内核的socket buffer数据堆积量变化,平均离散系数越小,说明数据堆积量变化较小,反之亦然。数据堆积量变化的快慢真实反映了节点的空闲和繁忙程度。
步骤3:通过为每个负载指标设置一个初始权重因子lamda,lamda随节点负载变化由调度器自动调整,根据以下公式计算节点综合负载:
AL(S)=lamda(C)*L(C)+lamda(M)*L(M)+lamda(T)*L(T)+lamda(sb)*L(SK) (5)
式中,AL(S)为节点综合负载指标,L(C)为CPU平均负载,lamda(C)为CPU平均负载的权重因子,L(M)为内存利用率,lamda(M)为内存利用率的权重因子,L(T)为集群在线连接率,lamda(T)为集群在线连接率的权重因子,L(SK)为socket buffer负载即平均离散系数,,lamda(sb)为socket buffer负载的权重因子;
步骤4:将步骤3计算得到的节点综合负载对上一采集周期得到的节点综合负载进行更新;
步骤5:基于当前节点综合负载,采用负反馈机制计算得到节点权重:
其中,A为可动态调整的系数,其值为统计指标的项数;SU为system utilization的缩写即系统利用率大于0小于1,需清楚,权值计算的前提是各节点至少有一次采样,且为避免权重过大,本实施例对权重做了一个限制:权重上限为C*w,C默认为10;若新权重大于上限,权重被重置为上限权重;否则取新权重;
步骤6:通过心跳机制监视集群中各节点的健康状态,由于网络拥塞或节点高负载,节点可能仅暂时不可用,这种情况节点可能会快速恢复,如果是其它类型故障,采用指数退避策略,尝试一定次数后如果服务还不可达,则将该节点踢出集群,同时该节点信息。
步骤7:根据集群中各节点的权重大小,选择节点权重大的节点进行客户端请求分配,节点的权重越大表示该节点负载较轻。
集群在正常工作之前,需要保证采集代理至少采集过一个周期T上的负载指标,以计算节点权重并重置初始权重。
本实施例从步骤1开始,重复执行步骤2、步骤3、步骤4、步骤6,直到集群节点全部下线,以上过程可具体参见图1。
现通过以下实验来证明本实施例的调度方法能够有效解决集群中的负载倾斜问题,大大提升集群吞吐率。
实验环境:3台配置相同的消息服务器,1台压力测试程序服务器和1台搭载了负载代理、调度控制、缓存和负载均衡器的综合服务器。压力测试程序模拟设备以指定的连接数向服务器批量发送消息(每条消息100字节)。
表1服务器配置
为验证算法设计的合理性及性能,设计了2种测试方案。
方案1:测试集群在未被采样和采样场景下集群连接的总体平均响应时间。该方案以指定的连接数5000,10000,...,35000向消息服务器发送消息,消息发送速率为1万条消息每秒。结果见附图2。
方案2:测试调度算法的合理性,调度控制器分别使用最小连接数算法和CMTS算法以指定的连接数5000,10000,...,35000向消息服务器发送消息,消息发送速率为3万条消息每秒。结果见附图3。
由图2可知:在连接数较少的情况下,采样代理占用了一部分计算机资源,与未被采样的集群对比后发现集群响应时间并未提高。
由图3可知:随着终端请求连接数的增大,CMTS算法总体平均响应时间明显地低于最小连接数算法。并且在连接数为32000时,CMTS算法对节点负载均衡效果更为理想。最小连接数算法在持续测试8小时的过程中,集群中的一个节点上的连接数远少于其它两个节点,终端请求的连接全部分配到了连接数较小的节点上。
实施例2:
在实施例1的基础上,本实施例公开了一种基于负反馈机制的TCP长连接负载均衡调度系统,包括:
采集代理,分布式部署在集群中的每个节点上,用于周期性收集节点负载指标;
节点综合负载计算模块,用于根据采集代理采集到的节点负载指标计算得到节点综合负载;
权重计算模块,用于根据节点综合负载计算模块输出的节点综合负载计算节点权重系数;
调度器,用于根据各节点的节点权重系数,将客户端请求分配到节点权重系数大的节点上。
监视器,与集群的每个节点均建立一个长连接,用于侦听节点健康状态,并根据节点健康状态,对服务不可达的节点从集群中剔除,当节点恢复健康状态后,再通知监视器并加入集群。。
缓存模块,用于缓存节点信息、节点负载指标、节点综合负载和节点权重系数。
本实施例中,调度器和监视器独立部署。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求保护范围之内。