您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

负载均衡常见算法

时间:2019-08-14 10:14:19  来源:  作者:

负载均衡常见算法

 

相关知识点

冷备与热备

  • 冷备份(cool standby),指配备平时不运行的备用设备,当运行设备发生故障时,使用备用设备替换。
  • 热备份(hot standby),指在设备运行的同时运行备用设备,当运行设备发生故障时,能够自动替换备用设备。

fail-over与fail-back

  • fail-over,在空余结构中,停止运行设备,使用备用设备进行工作的过程称为替换,英文称为fail-over或者switch-over。
  • fail-back,替换后再次恢复到原来的运行设备,也就是从运行状态的备用设备再切换到原来的运行设备的过程,称为回退,英文称为fail-back或switch-back。

冗余类型

  • 1.主备方式(Active-Standby)
  • 准备两台路由器,其中一台作为正常运行业务的活跃设备(active),也可以称为主设备(master)或者首要设备(primary)。另一台作为发生故障时替换的备用设备(standby),也可以称为备机(backup)、从设备(slave)、必要设备(secondary)。活跃设备和备用设备必须共享关于设备的设置信息。
  • 2.双活方式(Active-Active)
  • 准备两台路由器,其中一台作为首要设备(primary),另一台作为次要设备(secondary),二者同时运行来组成冗余结构。这种方式可以通过与负载均衡设备并用或者设置DNS、客户端一侧的路由信息来达到负载均衡的目的。
  • 3.集群方式(Cluster)
  • 在主备方式或双活方式中,使用3台以上的硬件协同组成冗余结构的方式。

 

什么是负载均衡

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

负载均衡算法在很多地方都有使用,无论是在服务治理中或者是在分布式缓存中都大量的使用,本文主要介绍几种常见的负载均衡的算法.

1.轮询法

 

轮询法,很好理解,将请求按照顺序轮流的分配到服务器上,他均衡的对待每一台后端的服务器,不关心服务器的的连接数和负载情况.以下代码演示了这种算法.

 1public class BalanceServer {
 2 public static List<String> servers = 
 3Arrays.asList("192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4",
 4 "192.168.0.5");
 5 public static int pos = 0;
 6 public static String getServer() {
 7 String server = null;
 8 if (pos >= servers.size()) {
 9 pos = 0;
10 }
11 server = servers.get(pos);
12 pos++;
13 return server;
14 }
15 public static void main(String[] args) {
16 for(int i=0;i<10;i++){
17 System.out.println(BalanceServer.getServer());
18 }
19 }
20}

 

轮询的策略目的在于请求的绝对均衡,但是在实际的情况下,可能服务器并不是完全一样,导致有些性能高的服务器不能完全发挥出来.

2.随机法

 

通过系统的随机函数,根据后端服务器列表的大小来随机获取其中的一台来访问,随着调用量的增大,实际效果越来越近似于平均分配到没一台服务器.和轮询的效果类似, 代码如下:

 1public class BalanceServer {
 2 public static List<String> servers = Arrays.asList("192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4",
 3 "192.168.0.5");
 4 public static int pos = 0;
 5 public static String getServer() {
 6 String server = null;
 7 Random random = new Random();
 8 int randomPos = random.nextInt(servers.size());
 9 server = servers.get(randomPos);
10 return server;
11 }
12}

 

和轮询算法比较,在并发的场景下,轮询需要加锁,随机法想比而言性能好点.

3.源地址hash法

源地址hash法的思想是获取客户端访问的ip地址,通过hash函数计算出一个hash值,用该hash值对服务器列表的大小进行取模运算,得到的值就是要访问的服务器的序号,代码如下:

 1public class BalanceServer {
 2 public static List<String> servers = Arrays.asList("192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4",
 3 "192.168.0.5");
 4 public static int pos = 0;
 5 public static String getServer(String ip) {
 6 String server = null;
 7 int hashCode = ip.hashCode();
 8 pos = hashCode % servers.size();
 9 server = servers.get(pos);
10 return server;
11 }
12}

 

hash法的好处是,在服务器列表不变的情况下,每次客户端访问的服务器都是同一个服务器.利用这个特性可以有状态的session会话.无需额外的操作就可以实现粘性会话.

4.加权轮询法

刚刚有说道过,不同的服务器性能不同,所以不能一概而论,需要给性能低的服务器给比较低的权重,性能高的给跟高的权重,代码如下:

 1public class BalanceServer {
 2 public static Map<String, Integer> serverMap = new HashMap<String, Integer>();
 3 public static int pos = 0;
 4 static {
 5 serverMap.put("192.168.0.1", 1);
 6 serverMap.put("192.168.0.2", 1);
 7 serverMap.put("192.168.0.3", 4);
 8 serverMap.put("192.168.0.4", 3);
 9 serverMap.put("192.168.0.5", 3);
10 serverMap.put("192.168.0.6", 2);
11 }
12 public static String getServer() {
13 Set<String> keySet = serverMap.keySet();
14 Iterator<String> it = keySet.iterator();
15 List<String> servers = new ArrayList<String>();
16 while (it.hasNext()) {
17 String server = it.next();
18 Integer weight = serverMap.get(server);
19 for (int i = 0; i < weight; i++) {
20 servers.add(server);
21 }
22 }
23 String server = null;
24 if (pos >= servers.size()) {
25 pos = 0;
26 }
27 server = servers.get(pos);
28 pos++;
29 return server;
30 }
31 public static void main(String[] args) {
32 for(int i=0;i<14;i++){
33 System.out.println(BalanceServer.getServer());
34 }
35 }
36}

 

5.加权随机法

 

与加权轮询法类似,加权随机法也是根据后端服务器不同的配置和负载情况来配置不同的权重。不同的是,它是按照权重来随机选择服务器的,而不是顺序。加权随机法的代码实现如下:

 1public class WeightRandom
 2{
 3 public static String getServer()
 4 {
 5 // 重建一个Map,避免服务器的上下线导致的并发问题
 6 Map<String, Integer> serverMap = 
 7 new HashMap<String, Integer>();
 8 serverMap.putAll(IpMap.serverWeightMap);
 9 // 取得Ip地址List
10 Set<String> keySet = serverMap.keySet();
11 Iterator<String> iterator = keySet.iterator();
12 List<String> serverList = new ArrayList<String>();
13 while (iterator.hasNext())
14 {
15 String server = iterator.next();
16 int weight = serverMap.get(server);
17 for (int i = 0; i < weight; i++)
18 serverList.add(server);
19 }
20 JAVA.util.Random random = new java.util.Random();
21 int randomPos = random.nextInt(serverList.size());
22 return serverList.get(randomPos);
23 }
24}


Tags:负载均衡   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
负载均衡是将客户端请求访问,通过提前约定好的规则转发给各个server。其中有好几个种经典的算法,下面我们用Java实现这几种算法。 轮询算法轮询算法按顺序把每个新的连接请求...【详细内容】
2021-09-27  Tags: 负载均衡  点击:(52)  评论:(0)  加入收藏
什么是NginxNginx(engine x)是一个高性能的HTTP和反向代理服务器,具有内存少,高并发特点强。1、处理静态文件,索引文件以及自动检索打开文件描述符缓冲2、无缓冲的反向代理加速...【详细内容】
2021-09-02  Tags: 负载均衡  点击:(70)  评论:(0)  加入收藏
1.安装依赖环境yum -y install wget gcc-c++ ncurses ncurses-devel cmake make perl bison openssl openssl-devel gcc* libxml2 libxml2-devel curl-devel libjpeg* libpn...【详细内容】
2021-08-03  Tags: 负载均衡  点击:(63)  评论:(0)  加入收藏
域名解析是客户端访问系统的第一步。在架构设计中,DNS Server除了解析域名,还能干点什么呢?又有哪些“挖坑”的用法需要避免呢?典型的互联网架构中,我们通过nginx的反向代理来做...【详细内容】
2021-07-29  Tags: 负载均衡  点击:(264)  评论:(0)  加入收藏
均衡算法也是多种多样,常见的两大类:即静态负载均衡法和动态负载均衡法。静态算法也是比较简单,主要有有一般轮询算法,基于比例的加权轮询算法,以及基于优先级的轮询算法。动态算...【详细内容】
2021-07-27  Tags: 负载均衡  点击:(72)  评论:(0)  加入收藏
今天总结一下负载均衡中LVS与Nginx的区别,好几篇博文一开始就说LVS是单向的,Nginx是双向的,我个人认为这是不准确的,LVS三种模式中,虽然DR模式以及TUN模式只有请求的报文经过Director,但是NAT模式,Real Server回复的...【详细内容】
2021-06-08  Tags: 负载均衡  点击:(114)  评论:(0)  加入收藏
之前有很多朋友问关于 Nginx 的 upstream 模块中 max_fails 及 fail_timeout,这两个指令,分别是配置关于负载均衡过程中,对于上游(后端)服务器的失败尝试次数和不可用时间,很多...【详细内容】
2021-04-15  Tags: 负载均衡  点击:(206)  评论:(0)  加入收藏
需求在Linux SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列)。如果一个进程处于TASK_RUNNING状态(可执行状态),则它会被加入到其中一个run_queue(且同一时刻仅会被加...【详细内容】
2021-04-01  Tags: 负载均衡  点击:(225)  评论:(0)  加入收藏
分层模型,每一层实现各自的功能和协议,并完成与相邻层的接口通讯。OSI 的服务定义详细说明了各层所提供的服务,某一层的服务就是该层及其下各层的一种能力,通过接口提供给更高一层。各层所提供的服务与这些服务是怎么实现...【详细内容】
2021-03-16  Tags: 负载均衡  点击:(257)  评论:(0)  加入收藏
Nginx的安装及负载均衡配置在安装完分布式文件系统之后,就可以在应用程序中进行调用了。注意需要在 Web端的页面上进行访问,还必须借助Nginx 提供访问服务。使用Nginx 不仅可...【详细内容】
2021-03-11  Tags: 负载均衡  点击:(159)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(5)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(9)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(21)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(17)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(17)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条