我的编程空间,编程开发者的网络收藏夹
学习永远不晚

服务器的负载均衡算法怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

服务器的负载均衡算法怎么实现

这篇文章主要介绍“服务器负载均衡算法怎么实现”,在日常操作中,相信很多人在服务器的负载均衡算法怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”服务器的负载均衡算法怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

负载平衡(Load balancing)是一种在多个计算机(网络、CPU、磁盘)之间均匀分配资源,以提高资源利用的技术。使用负载均衡可以最大化服务吞吐量,可能最小化响应时间,同时由于使用负载均衡时,会使用多个服务器节点代单点服务,也提高了服务的可用性。

负载均衡的实现可以软件可以硬件,硬件如大名鼎鼎的 F5 负载均衡设备,软件如 NGINX 中的负载均衡实现,又如 Springcloud Ribbon 组件中的负载均衡实现。

如果看到这里你还不知道负载均衡是干嘛的,那么只能放一张图了,毕竟没图说个啥。

服务器的负载均衡算法怎么实现

负载均衡要做到在多次请求下,每台服务器被请求的次数大致相同。但是实际生产中,可能每台机器的性能不同,我们会希望性能好的机器承担的请求更多一些,这也是正常需求。

如果这样说下来你看不懂,那我就再举个例子好了,一排可爱的小熊(服务器)站好。

服务器的负载均衡算法怎么实现

这时有人(用户)要过来打脸(请求访问)。

服务器的负载均衡算法怎么实现

那么怎么样我们才能让这每一个可爱的小熊被打的次数大致相同呢?

又或者熊 4 比较胖,抗击打能力是别人的两倍,我们怎么提高熊 4 被打的次数也是别人的两倍呢?

又或者每次出手的力度不同,有重有轻,恰巧熊 4 总是承受这种大力度啪啪打脸,熊 4 即将不省熊事,还要继续打它吗?

这些都是值的思考的问题。

说了那么多,口干舌燥,我双手已经饥渴难耐了,迫不及待的想要撸起代码了。

随机访问

上面说了,为了负载均衡,我们必须保证多次出手后,熊 1 到熊 4 被打次数均衡。比如使用随机访问法,根据数学上的概率论,随机出手次数越多,每只熊被打的次数就会越相近。代码实现也比较简单,使用一个随机数,随机访问一个就可以了。


private static List<String> serverList = new ArrayList<>();
static {
   serverList.add("192.168.1.2");
   serverList.add("192.168.1.3");
   serverList.add("192.168.1.4");
   serverList.add("192.168.1.5");
}


public static String random() {
   // 复制遍历用的集合,防止操作中集合有变更
   List<String> tempList = new ArrayList<>(serverList.size());
   tempList.addAll(serverList);
   // 随机数随机访问
   int randomInt = new Random().nextInt(tempList.size());
   return tempList.get(randomInt);
}

因为使用了非线程安全的集合,所以在访问操作时操作的是集合的拷贝,下面几种轮训方式中也是这种思想。

写一个模拟请求方法,请求10w次,记录请求结果。

public static void main(String[] args) {
   HashMap<String, Integer> serverMap = new HashMap<>();
   for (int i = 0; i < 20000; i++) {
       String server = random();
       Integer count = serverMap.get(server);
       if (count == null) {
           count = 1;
       } else {
           count++;
       }
       // 记录
       serverMap.put(server, count);
   }
   // 路由总体结果
   for (Map.Entry<String, Integer> entry : serverMap.entrySet()) {
       System.out.println("IP:" + entry.getKey() + ",次数:" + entry.getValue());
   }
}

运行得到请求结果。

IP:192.168.1.3,次数:24979
IP:192.168.1.2,次数:24896
IP:192.168.1.5,次数:25043
IP:192.168.1.4,次数:25082

每台服务器被访问的次数都趋近于 2.5w,有点负载均衡的意思。但是随机毕竟是随机,是不能保证访问次数绝对均匀的。

轮训访问

轮训访问就简单多了,拿上面的熊1到熊4来说,我们一个接一个的啪啪 - 打脸,熊1打完打熊2,熊2打完打熊3,熊4打完打熊1,最终也是实现了被打均衡。但是保证均匀总是要付出代价的,随机访问中需要随机,轮训访问中需要什么来保证轮训呢?


private static List<String> serverList = new ArrayList<>();
static {
   serverList.add("192.168.1.2");
   serverList.add("192.168.1.3");
   serverList.add("192.168.1.4");
   serverList.add("192.168.1.5");
}
private static Integer index = 0;


public static String randomOneByOne() {
   // 复制遍历用的集合,防止操作中集合有变更
   List<String> tempList = new ArrayList<>(serverList.size());
   tempList.addAll(serverList);
   String server = "";
   synchronized (index) {
       index++;
       if (index == tempList.size()) {
           index = 0;
       }
       server = tempList.get(index);;
   }
   return server;
}

由代码里可以看出来,为了保证轮训,必须记录上次访问的位置,为了让在并发情况下不出现问题,还必须在使用位置记录时进行加锁,很明显这种互斥锁增加了性能开销。

依旧使用上面的测试代码测试10w次请求负载情况。

IP:192.168.1.3,次数:25000
IP:192.168.1.2,次数:25000
IP:192.168.1.5,次数:25000
IP:192.168.1.4,次数:25000

轮训加权

上面演示了轮训方式,还记的一开始提出的熊4比较胖抗击打能力强,可以承受别人2倍的挨打次数嘛?上面两种方式都没有体现出来熊 4 的这个特点,熊 4 窃喜,不痛不痒。但是熊 1 到 熊 3 已经在崩溃的边缘,不行,我们必须要让胖着多打,能者多劳,提高整体性能。


private static HashMap<String, Integer> serverMap = new HashMap<>();
static {
   serverMap.put("192.168.1.2", 2);
   serverMap.put("192.168.1.3", 2);
   serverMap.put("192.168.1.4", 2);
   serverMap.put("192.168.1.5", 4);
}
private static Integer index = 0;


public static String oneByOneWithWeight() {
   List<String> tempList = new ArrayList();
   HashMap<String, Integer> tempMap = new HashMap<>();
   tempMap.putAll(serverMap);
   for (String key : serverMap.keySet()) {
       for (int i = 0; i < serverMap.get(key); i++) {
           tempList.add(key);
       }
   }
   synchronized (index) {
       index++;
       if (index == tempList.size()) {
           index = 0;
       }
       return tempList.get(index);
   }
}

这次记录下了每台服务器的整体性能,给出一个数值,数值越大,性能越好。可以承受的请求也就越多,可以看到服务器 192.168.1.5 的性能为 4,是其他服务器的两倍,依旧 10 w 请求测试。

IP:192.168.1.3,次数:20000
IP:192.168.1.2,次数:20000
IP:192.168.1.5,次数:40000
IP:192.168.1.4,次数:20000

192.168.1.5 承担了 2 倍的请求。

随机加权

随机加权的方式和轮训加权的方式大致相同,只是把使用互斥锁轮训的方式换成了随机访问,按照概率论来说,访问量增多时,服务访问也会达到负载均衡。


private static HashMap<String, Integer> serverMap = new HashMap<>();
static {
   serverMap.put("192.168.1.2", 2);
   serverMap.put("192.168.1.3", 2);
   serverMap.put("192.168.1.4", 2);
   serverMap.put("192.168.1.5", 4);
}

public static String randomWithWeight() {
   List<String> tempList = new ArrayList();
   HashMap<String, Integer> tempMap = new HashMap<>();
   tempMap.putAll(serverMap);
   for (String key : serverMap.keySet()) {
       for (int i = 0; i < serverMap.get(key); i++) {
           tempList.add(key);
       }
   }
   int randomInt = new Random().nextInt(tempList.size());
   return tempList.get(randomInt);
}

依旧 10 w 请求测试,192.168.1.5 的权重是其他服务器的近似两倍,

IP:192.168.1.3,次数:19934
IP:192.168.1.2,次数:20033
IP:192.168.1.5,次数:39900
IP:192.168.1.4,次数:20133

IP-Hash

上面的几种方式要么使用随机数,要么使用轮训,最终都达到了请求的负载均衡。但是也有一个很明显的缺点,就是同一个用户的多次请求很有可能不是同一个服务进行处理的,这时问题来了,如果你的服务依赖于 session ,那么因为服务不同, session 也会丢失,不是我们想要的,所以出现了一种根据请求端的 ip 进行哈希计算来决定请求到哪一台服务器的方式。这种方式可以保证同一个用户的请求落在同一个服务上。

private static List<String> serverList = new ArrayList<>();
static {
   serverList.add("192.168.1.2");
   serverList.add("192.168.1.3");
   serverList.add("192.168.1.4");
   serverList.add("192.168.1.5");
}


public static String ipHash(String ip) {
   // 复制遍历用的集合,防止操作中集合有变更
   List<String> tempList = new ArrayList<>(serverList.size());
   tempList.addAll(serverList);
   // 哈希计算请求的服务器
   int index = ip.hashCode() % serverList.size();
   return tempList.get(Math.abs(index));
}

到此,关于“服务器的负载均衡算法怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

服务器的负载均衡算法怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

服务器的负载均衡算法怎么实现

这篇文章主要介绍“服务器的负载均衡算法怎么实现”,在日常操作中,相信很多人在服务器的负载均衡算法怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”服务器的负载均衡算法怎么实现”的疑惑有所帮助!接下来,请跟
2023-06-03

hadoop负载均衡算法怎么实现

Hadoop负载均衡算法的实现可以通过以下几种方式:数据均衡:Hadoop中的数据均衡是通过HDFS的数据均衡来实现的。HDFS会将数据均匀地分布在不同的数据节点上,从而实现数据的负载均衡。任务调度:Hadoop中使用YARN(Yet An
hadoop负载均衡算法怎么实现
2024-04-18

Java怎么实现负载均衡算法

这篇文章主要讲解了“Java怎么实现负载均衡算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么实现负载均衡算法”吧!什么是负载均衡(Load balancing)?在网站创立初期
2023-06-02

ssr服务器负载均衡怎么实现

要实现SSR服务器的负载均衡,可以采用以下几种方法:1. DNS轮询:在DNS服务器上设置多个SSR服务器的IP地址,并采用轮询算法将流量分发到不同的服务器上。这种方法简单易行,但效果有限,无法根据服务器的实际负载情况做出动态调整。2. 反
2023-09-02

多个服务器负载均衡怎么实现

实现多个服务器负载均衡的方法有以下几种:1. 硬件负载均衡器:使用专门的硬件设备,如F5 BIG-IP等,将流量按照一定的算法(如轮询、加权轮询、最少连接数等)分发到多个服务器上,实现负载均衡。2. 软件负载均衡器:使用软件实现负载均衡,常
2023-09-07

负载均衡的实现方法

这篇文章主要讲解了“负载均衡的实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“负载均衡的实现方法”吧! 客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,
2023-06-20

dubbo负载均衡怎么实现

Dubbo负载均衡可以通过以下方式实现:1. 随机负载均衡(Random Load Balance):每次从可用的服务提供者中随机选择一个进行调用。2. 轮询负载均衡(Round Robin Load Balance):按照顺序依次从可用的
2023-10-20

tomcat的负载均衡怎么实现

Tomcat的负载均衡可以通过以下几种方式来实现:1. 使用Apache HTTP Server:将Tomcat作为后端服务器,使用Apache作为反向代理服务器,通过配置mod_jk或mod_proxy_balancer模块来实现负载均衡
2023-09-04

springcloud怎么实现负载均衡

Spring Cloud中实现负载均衡,可以使用Ribbon和Feign两种方式。1. Ribbon负载均衡:Ribbon是一个客户端负载均衡器,可以与Spring Cloud中的服务发现组件(如Eureka)结合使用。通过在应用程序中引入
2023-08-26

Teradata怎么实现负载均衡

在Teradata中,负载均衡可以通过以下几种方式实现:使用Teradata负载模块(TASM):TASM是Teradata的性能管理工具,可以帮助用户控制和调整负载均衡。通过TASM,用户可以设置优先级和资源限制,以确保系统在高负载时仍能
Teradata怎么实现负载均衡
2024-04-09

socket怎么实现负载均衡

Socket负载均衡是通过将网络流量分发到多个服务器来实现的。以下是一种基于Socket的负载均衡实现方法:1. 设置一个负载均衡器(load balancer),它是一个中间层服务器,用于接收来自客户端的连接请求。2. 在负载均衡器上创建
2023-09-07

springcloud负载均衡怎么实现

Spring Cloud提供了多种方式来实现负载均衡,常用的有以下几种方式:1. Ribbon:Ribbon是Spring Cloud中默认的负载均衡组件,它可以集成到RestTemplate和Feign中。通过在配置文件中配置服务名和服务
2023-09-02

nacos怎么实现负载均衡

Nacos 可以通过以下几种方式实现负载均衡:1. 服务注册与发现:Nacos 可以作为服务注册中心,将服务实例注册到 Nacos 上,并通过 Nacos 提供的服务发现功能,实现对服务实例的自动发现和管理。服务消费者可以通过 Nacos
2023-08-26

dubbo怎么实现负载均衡

Dubbo实现负载均衡主要有以下几种方式:默认的负载均衡策略:Dubbo内置了一些默认的负载均衡策略,例如随机、轮询、一致性哈希等。可以通过配置文件或注解指定使用哪种负载均衡策略。自定义负载均衡策略:Dubbo也支持自定义负载均衡策略,用户
dubbo怎么实现负载均衡
2024-04-03

apache怎么实现负载均衡

要实现负载均衡,可以使用Apache的代理模块mod_proxy和mod_proxy_balancer。以下是一个简单的步骤:1. 确保Apache已经安装,并启用了mod_proxy和mod_proxy_balancer模块。可以通过在终
2023-09-07

nginx怎么实现负载均衡

要实现负载均衡,可以通过Nginx的反向代理和负载均衡模块来完成。以下是一种常见的配置方法:1. 安装Nginx:首先需要安装Nginx服务器。2. 配置反向代理:编辑Nginx的配置文件(一般在/etc/nginx/nginx.conf)
2023-09-02

kafka的负载均衡怎么实现

Kafka的负载均衡可以通过以下几种方式来实现:1. 分区:Kafka将每个主题划分为多个分区,每个分区可以在不同的Broker上进行复制。通过增加分区数量,可以增加Kafka集群的吞吐量和并发处理能力。2. 副本:Kafka使用副本机制来
2023-09-01

怎么使用dns服务器实现负载均衡

要使用DNS服务器实现负载均衡,可以按照以下步骤操作:1. 购买或设置多个服务器:首先需要购买或设置多台服务器,并利用负载均衡软件或硬件将它们组合成一个服务器集群。2. 配置服务器集群:确保所有服务器都能够相互通信,并且在同一网络中。每台服
2023-09-07

编程热搜

目录