负载均衡算法--最小连接数法(Least Connections)

接上一篇博文:负载均衡算法–源地址哈希法(Hash)

最小连接数法是根据服务器当前的连接情况进行负载均衡的,当请求到来时,会选取当前连接数最少的一台服务器来处理请求。由此也可以延伸出,根据服务器 CPU 占用最少,根据单位时间内处理请求的效率高低等进行服务器选择。最小连接数法只是动态分配服务器的一种算法,通过各种维度的参数计算,可以找到适合不同场景的更均衡的动态分配服务器的方案。

算法描述

假设有 N 台服务器 S = {S0, S1, S2, …, Sn},算法可以描述为:
1、实时记录每台服务器的连接数
2、查找当前连接数最小的服务器

假定我们现在有如下四台服务器:

服务器地址连接数
192.168.1.11
192.168.1.22
192.168.1.33
192.168.1.44

进行 10 次访问后, 被分配的服务器如下:

服务器地址序号连接数
192.168.1.112
192.168.1.113
192.168.1.223
192.168.1.114
192.168.1.224
192.168.1.234
192.168.1.115
192.168.1.225
192.168.1.235
192.168.1.345

代码实现

1、服务器连接数 bean 类

package org.learn.loadbalance;

import java.io.Serializable;

public class ConnectionsServer implements Serializable {
    private static final long serialVersionUID = 7246747589293111189L;

    private String server;
    private Integer connnections;

    public ConnectionsServer(String server, Integer connnections){
        this.server = server;
        this.connnections = connnections;
    }

    public String getServer() {
        return server;
    }

    public void setServer(String server) {
        this.server = server;
    }

    public Integer getConnnections() {
        return connnections;
    }

    public void setConnnections(Integer connnections) {
        this.connnections = connnections;
    }
}

1、服务器管理类

package org.learn.loadbalance;

import java.util.Map;
import java.util.TreeMap;

/**
 * @author zhibo
 * @date 2019/5/16 16:25
 */
public class ConnectionsServerManager {
    public volatile static Map<String, ConnectionsServer> serverMap = new TreeMap<>();

    static {
        serverMap.put("192.168.1.1", new ConnectionsServer("192.168.1.1",1));
        serverMap.put("192.168.1.2", new ConnectionsServer("192.168.1.2",2));
        serverMap.put("192.168.1.3", new ConnectionsServer("192.168.1.3",3));
        serverMap.put("192.168.1.4", new ConnectionsServer("192.168.1.4",4));
    }
}

2、最小连接数类

package org.learn.loadbalance;

import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

/**
 * @author zhibo
 * @date 2019/5/16 16:28
 */
public class LeastBalance {

    public static String getServer() {
        Map<String, ConnectionsServer> serverMap = new TreeMap<>(ConnectionsServerManager.serverMap);
        Iterator<String> iterator = serverMap.keySet().iterator();

        ConnectionsServer minConnectionsServer = null;
        while (iterator.hasNext()){
            ConnectionsServer server = serverMap.get(iterator.next());
            if(minConnectionsServer == null){
                minConnectionsServer = server;
            }

            if(minConnectionsServer.getConnnections() > server.getConnnections()){
                minConnectionsServer = server;
            }
        }

        minConnectionsServer.setConnnections(minConnectionsServer.getConnnections() + 1);
        ConnectionsServerManager.serverMap.put(minConnectionsServer.getServer(), minConnectionsServer);
        System.out.println(String.format("ip=%s, connections=%s",minConnectionsServer.getServer(), minConnectionsServer.getConnnections()));
        return minConnectionsServer.getServer();
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            String server = getServer();
        }
    }
}


执行 main 方法输出结果如下:
在这里插入图片描述
最小连接数法是一个简单的动态分配服务器的方案,它提供了一个站在服务器角度思考动态分配服务器的简单方案。在实际的使用过程中,通过单一的连接数进行服务器运行状态的判定可能不太科学的,还需要针对使用场景进行分析。

文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。

四层和七层负载均衡算法负载均衡器用于决策流量分发的两种常见算法。它们的区别在于负载均衡的粒度和侧重点。 1. 四层负载均衡算法(Layer 4 Load Balancing):四层负载均衡算法基于传输层(Transport Layer)的信息进行流量分发。常见的四层协议是TCP和UDP。四层负载均衡器根据源IP、目标IP、源端口、目标端口等信息来做出决策。常见的四层负载均衡算法包括: - 轮询(Round Robin):按照顺序将请求分发给每个后端服务器,循环往复。 - 加权轮询(Weighted Round Robin):根据后端服务器的权重分配请求,权重高的服务器获取到的请求数更多。 - 最少连接(Least Connections):将请求发送到当前连接数最少的后端服务器,以实现负载均衡。 - IP散列(IP Hashing):根据客户端IP地址进行散列计算,将同一客户端的请求分发到同一台后端服务器。 2. 七层负载均衡算法(Layer 7 Load Balancing):七层负载均衡算法基于应用层(Application Layer)的信息进行流量分发。它不仅考虑传输层的信息,还深入解析应用层的请求报文,以便更精细地决策流量分发。常见的七层负载均衡算法包括: - 轮询(Round Robin) - 加权轮询(Weighted Round Robin) - 最少连接(Least Connections) - URL散列(URL Hashing):根据请求的URL进行散列计算,将相同URL的请求分发到同一台后端服务器。 - Cookie(Cookie-based):根据请求中的Cookie信息来决定流量分发。 - SSL会话(SSL Session):根据SSL会话信息来决定流量分发。 七层负载均衡算法相比于四层负载均衡算法,具有更高的灵活性和精细度,因为它可以基于应用层的信息做出决策。然而,七层负载均衡器的性能开销相对较大,适用于对请求处理要求较高的场景。四层负载均衡算法则更加轻量和高效,适用于大规模流量分发的场景。选择使用哪种负载均衡算法应根据具体的业务需求和系统特点做出权衡。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值