负载均衡算法概述

我们查询注册中心获得了某个服务的可用节点列表,我们需要从可用节点列表中选择一个发起调用,这就是负载均衡的所用了。

需要考虑两个因素,?个是要考虑调?的均匀性,也就是要让每个节点都接收到调?,发挥所有节点的作?,另?个是要考虑调?的性能,也就是哪个节点响应最快,优先调?哪个节点。

常见的负载均衡算法

随机算法(伪随机)

随机算法,顾名思义就是从可?的服务节点中,随机挑选?个节点来访问。

在实现时,随机算法通常是通过?成?个随机数来实现,?如服务有10个节点,那么就每?次?成?个1~10之间的随机数, 假设?成的是2,那么就访问编号为2的节点。

采?随机算法,在节点数量?够多,并且访问量?较?的情况下,各个节点被访问的概率是基本相同的。

改算法的核心就是获取一个不超过服务节点列表大小的随机整数。

int idx = (int) (ThreadLocalRandom.current().nextDouble() * servicesList.size());

如何实现真随机

霍金有句名言:“谁跟我提薛定谔的猫,我就去拿我的枪”。因为在我们的宏观世界中薛定谔的猫其实是一个很荒谬的真理,这只猫既是活着的又是死的,在没有开箱之前,一切都是不确定的,同时,我觉得这才是真随机,不同于计算机中的随机数生成,因为大多数语言的随机数生成是基于时钟的,例如c中的srand就是与计算机目前的时刻与1970年1月1日0时0分0秒之间的时间差有关。

假如说我对于时间的掌控足够强大,我就可以在某个特定时刻发起调用,这样使用随机调用的负载均衡算法到底调用了哪个节点,当然就在我的掌控之中了。

所以说在我们的宏观世界,一切所谓的随机都是不存在的,拉普拉斯妖可以根据现有的状态得到我们所谓的随机值。

那么在微观世界呢? 记得在高中物理中,我们学到过光的波粒二象性,光既是波又是粒子,仔细一想,细思极恐,你既是男人又是女人,没有验身之前你有男女太监三种状态,就好像薛定谔的猫,没有开箱前有死活两种状态。这是爱因斯坦发现的,记得课本上说的是使用了双缝实验。在探测仪观察的情况下光是粒子,只通过单缝,在没观察的情况下是波,通过双缝。至于粒子到底通过哪一夹缝,这才是真正的随机。

对于物理学家来说,这种量子随机性是宇宙唯一的随机性,是物理定律不能预测的结果。

建议各位妄图调度方便而使用随机算法的人,先去搞一个光子发射设备,放在计算机里面用来实现随机算法。

轮询算法

轮询算法,顾名思义就是按照固定的顺序,把可?的服务节点,挨个访问?次。

在实现时,轮询算法通常是把所有可?节点放到?个数组?,然后按照数组编号,挨个访问。

?如服务有10个节点,放到数组?就是?个大小为10的数组,这样的话就可以从序号为0的节点开始访问,访问后序号?动加1,下?次就会访问序号为1的 节点,以此类推。

轮询算法能够保证所有节点被访问到的概率是相同的。

当然,在我们现实生活中,可能我们不同服务节点的性能不同,我们需要根据其能力进行调度。

加权轮询算法

轮询算法能够保证所有节点被访问的概率相同,?加权轮询算法是在此基础上,给每个节点赋予?个权重,从?使每个节点被访问到的概率不同,权重?的节点被访问的概率就?,权重?的节点被访问的概率就?。

在实现时,加权轮询算法是?成?个节点序列,该序列?有n个节点,n是所有节点的权重之和。

在这个序列中,每个节点出现的次数,就是它的权重值。?如有三个节点:a、b、c,权重分别是3、2、1,那么?成的序列就是{a、a、b、c、b、a}, 这样的话按照这个序列访问,前6次请求就会分别访问节点a三次,节点b两次,节点c?次。从第7个请求开始,?重新按照这个序列的顺序来访问节点。

在应?加权轮询算法的时候,要尽可能保证?产的序列的均匀,如果?成的不均匀会造成节点访问失衡,?如刚才的例?,如果?成的序列是{a、a、a、b、b、c},就会导致前3次访问的节点都是a。

最少活跃连接算法

最少活跃连接算法,顾名思义就是每?次访问都选择连接数最少的节点。

因为不同节点处理请求的速度不同,使得同?个服务消费者同每?个节点的连接数都不相同。

连接数?的节点,可以认为是处理请求慢,?连接数小的节点,可以认为是处理请求快。所以在挑选节点时,可以以连接数为依据,选择连接数最少的节点访问。

在实现时,需要记录跟每?个节点的连接数,这样在选择节点时,才能?较出连接数最?的节点。

?致性hash算法

?致性hash算法,是通过某个hash函数,把同?个来源的请求都映射到同?个节点上。?致性hash算法最?的特点就是同?个来源的请求,只会映射到同?个节点上,可以说是具有记忆功能。只有当这个节点不可?时,请求才会被分配到相邻的可?节点上。

总结

上面五种负载均衡算法分别可以应用在不同的场景,最近正好在写Zeus的负载均衡策略,考虑之后决定使用改造后的加权轮询算法,在每一个client中会有一个定时任务,去获取所有节点的近期访问的性能统计,根据性能快慢,把服务节点按照二八分为20%慢节点80快节点,动态调整权重。

原文地址:https://www.cnblogs.com/LexMoon/p/fzjh.html

时间: 2024-11-09 02:50:34

负载均衡算法概述的相关文章

Citrix Netscaler负载均衡算法

众所周知,作为新一代应用交付产品的Citrix Netscaler具有业内领先的数据控制.应用交付的能力,然而作为根本内容之一的ADC功能,如果不具备强大的.多元化的均衡算法是不可能适应如此众多的应用场景,更无法做到好的应用交付产品.因此我们在此讨论一下比较常用的负载均衡算法就很有必要. 目前最新版本的Netscaler支持17种均衡算法,目前先讨论最常用的12种 1.轮询算法(Round Robin) 当NetScaler 使用轮询的负载均衡算法时,它会将来自客户端的请求轮流分配给后台中的服务

F5负载均衡算法及基本原理

原文:Intro to Load Balancing for Developers – The Algorithms 转载:http://blog.gesha.net/archives/205/ posted on Tuesday, March 31, 2009 11:02 PM Random: This load balancing method randomly distributes load across the servers available, picking one via ra

负载均衡算法及手段

负载均衡器 可以是专用设备,也可以是在通用服务器上运行的应用程序. 分散请求到拥有相同内容或提供相同服务的服务器. 专用设备一般只有以太网接口,可以说是多层交换机的一种. 负载均衡器一般会被分配虚拟IP地址,所有来自客户端的请求都是针对虚拟IP地址完成的.负载均衡器通过负载均衡算法将来自客户端的请求转发到服务器的实际IP地址上. 负载均衡算法 private Map<String,Integer> serverMap = new HashMap<String,Integer>(){

几种简单的负载均衡算法及其Java代码实现

什么是负载均衡 负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求.负载均衡能够平均分配客户请求到服务器阵列,借此提供快速获取重要数据,解决大量并发访问服务问题,这种集群技术可以用最少的投资获得接近于大型主机的性能. 负载均衡分为软件负载均衡和硬件负载均衡,前者的代

说一说负载均衡算法

    负载均衡算法可以分为两类:静态负载均衡算法,基于服务器的容量,就是高配置的服务器比低配置的服务器分配更多的请求:动态负载均衡算法根据服务器的状况,比如通过监控可以得到平均响应时间,或者CPU占用率,内存占用率按照某种方式进行计算,作为权重值 静态负载均衡算法 随机(Random):利用随机数生成算法选取一个服务器,然后把连接发送给他.虽然许多负载产品都支持该算法,但是它的有效性一直受到质疑,除非把服务器的可运行时间看的很重. 轮询(Round Robin):按顺序把每个新的连接请求分配给

集群负载均衡算法原理

最近打算往互联网方向发展,研究了下集群的负载均衡.其实早就应该去了解学习了.如有理解不到位的地方,还望各大神指出. 负载均衡算法是集群在调度时,选择具体调度和分发方式的逻辑. 目前流行和常用的算法有:轮询算法,Hash算法,Session,最小连接数,最大空闲等. 1.轮询算法: 实现方式:把每一次的用户请求,按顺序循环分配给集群内部的一台服务器.优点是算法简洁,无状态. 2.权重轮询算法 由于服务器的处理能力不同,可以再给服务器加权.也就是权重轮询算法. 3.Hash算法 一般就是将请求中的某

负载均衡算法类型

负载均衡算法类型 随机 (Random)-- 随机分发 轮询(Round Robin) -- 将请求依次顺序循环地分发给服务器,从1到N然后重新开始.此种均衡算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况. 权重(Weighted Round Robin)-- 根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求..此种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重. 动态比率(Dynamic Rou

常见负载均衡算法

一.概要 随着系统日益庞大.逻辑业务越来越复杂,系统架构由原来的单一系统到垂直系统,发展到现在的分布式系统.分布式系统中,可以做到公共业务模块的高可用,高容错性,高扩展性,然而,当系统越来越复杂时,需要考虑的东西自然也越来越多,要求也越来越高,比如服务路由.负载均衡等.此文将针对负载均衡算法进行讲解,不涉及具体的实现. 二.负载均衡算法 在分布式系统中,多台服务器同时提供一个服务,并统一到服务配置中心进行管理,如图1-1. 图1-1

Haproxy 负载均衡算法介绍:

一.Haproxy配置介绍: 配置文件:/usr/local/haproxy/etc/haproxy.cfg balance roundrobin    # 负载均衡算法配置 二.Haproxy负载均衡算法介绍: balance roundrobin    # 轮询,软负载均衡基本都具备这种算法 balance static-rr    # 根据权重,建议使用 balance leastconn      # 最少连接者先处理,建议使用 balance source         # 根据请求