最近,需要实现一个用于将POST请求转发到指定的后端服务的小工具。由于我一直想学习杜松子酒框架,因此我使用此框架来尝试它。预计将生成几篇文章。本文研究了某些负载平衡算法的实施。
本文实施的负载平衡纯粹是为了作者的思想,并且没有实际的指导意义。
本文假设有一个后端服务URL的数组,因此,就实现而言,它只是输出数组的索引值。权重的EAST索引值对应于后端服务。例如,”1 3 3“表示有3个服务器,第一个正确的重量为1,第二和第三单元的权重为3。
负载平衡有多种类型,例如:随机,加权随机;简单旋转,加权旋转,平滑的加权旋转等。本文仅实现多种旋转算法,并根据请求顺序增加,并且不使用随机数。
算法描述:
向服务器询问以下内容-up server.receive第一个请求,转到第一个服务器,第二个请求,转发到第二服务器,然后按顺序推动。如果询问最终服务器,则将第一个服务器转发。
代码:
体重的迹象:
3台机器(a,b,c),权重分别为5、3、2。
一个较大的范围表示服务器的重量。设置一个数字,值在1到10之间,即,范围在总权重,与5、3和2的比较,如果小在间隔,如果它很大,则减去上一个数字,然后比较哪个区域。例证:设置3个数字,与5相比,小,然后掉落到第一个范围,也就是说,选择服务器。数字7,相比5,大,删除该部分,即负5,获得2和3比较,小,跌至第二范围,即SELECT Server B.设置该数字9,而不是5,大,负5获得4,与3,大,减3的比较,以获胜1,与2,小,第三范围(即选择服务器C)进行比较。
请注意,我们担心在一定间隔中出现的次数,并且我们不关注它的索引。仅访问A,B和C服务器的时间为10倍。分别为5、3和两次。最简单的算法是将其10次分配给A,B和C。
代码:
实验结果:
对于可靠的数据,我问了两次。
上述算法不考虑服务器处理的效率。例如,A服务器中的前5次以及其他服务器是空闲的,从而导致了平稳而加权的旋转算法。作者尚未渗透算法的证明过程,因此本文不涉及。
设置以下变量:总量,值是固定的。固定功率数组:权重,其值是固定的。当前重量的当前权重数组,其值是可变的。当前权重数组最大值的最大值,最大值,最大值当前重量阵列。
算法步骤:0。请求提出。1。确定当前的重量阵列(对应于下表1的当前重量)是否为0。如果是,则用固定权重初始化。2。抓住当前的重量数组,获取最大值,相应的索引是需要返回的服务器3。将减少与步骤2索引相对应的值,并且其他索引的值保持不变。(对应于下表2的当前权重)4。相应的固定重量值5。返回步骤1并重复。
假设有3个服务器a,b和c,顺序为5、1、1,总重量为7。计算过程如下:
一开始,当前重量为[0,0,0],固定重量[5,1,1]初始化。这次,最大值为5,索引为0,服务器A IS IS返回。重量[3,2,2]。这次,最大值为3,索引为0,返回了服务器A。避免[3,2,2]的索引的总重量来获取[ -4,2,2] .add [-4,2,2]至[5,1,1]以获得新的当前重量[1,3,3]。
总体过程如下:
0 [0,0,0] - 初始化[5,1,1] 1 [5,1] a [-2,1,1] 2 [3,2,2] a [-4,2,2] 3 [1,3,3] B [1,-4,3] 4 [6,-3,4] a [-1,-3,4] 5 [4,-2,5] C [1]a [-2、1、1]代码:
实验结果:
从结果来看,权重仍然成比例,但是响应服务器的分布相对平衡,也就是说,对于集中式服务器,将没有明显的服务请求。这种测试NGINX的负载平衡的方法似乎是相同的方法默认情况下,但是算法实现是不同的。该测试发现,在维持重量比的情况下,不同服务器的顺序似乎有所不同,原因没有加深。
本文主要根据网络的相关信息进行编译,并使用Golang代码来实现算法的负载平衡部分。
https://www.cnblogs.com/wsw-seu/11336634.htmlhttps://juejin.cn/post/68449037930768781