负载均衡原理及其算法

什么是负载均衡

将用户请求分摊到不同服务器去处理,来提高系统并发能力和可靠性

负载均衡算法

随机算法
权重相同的时候,随机选择一台服务器处理。
带权重的随机算法
比如有3个IP,A-2,B-3,C-5。获得一个随机数rand,去判断rand是否在[0,2),如果在就执行A,否则rand=rand-2;继续判断。

List<Integer> arr= new ArrayList<>();
        arr.add(2);
        arr.add(3);
        arr.add(5);
        Random r = new Random();
        int rand= r.nextInt(10);
        for(Integer i:arr){
            if(rand>=0&&rand<i){
                break;
            }
            rand-=i;
        }

轮询算法
逐一询问每一个服务器
带权重的轮询算法
最小连接数算法
最小活跃算法
哈希算法
将请求的参数信息通过哈希函数转换成一个哈希值,然后根据哈希值来决定请求被哪一台服务器处理。
在服务器数量不变的情况下,相同参数的请求总是发到同一台服务器处理,比如同个 IP 的请求、同一个用户的请求。
一致性哈希算法
当服务器数量改变的时候,同一个请求就不一定能到同一个服务器来处理了。
可以用hash环来处理。
在这里插入图片描述
已知P4>P3>P2>P1,如果新节点的哈希值落入P1->P2,则找第一个比他大的P2去处理,如果落在P4->P1,则找P1。但是有一个问题,如果网络请求的哈希频繁落入一个区间段,某个服务器的压力就会很大,其他服务器又太空闲,所以可以对区间内部进行再细分。

TreeMap<Integer,String> tm =new TreeMap<>();
        tm.put(2,"A");
        tm.put(4,"B");
        tm.put(6,"C");
        Random rand = new Random();
        int max=6;//记录当前环中的最大值
        int hmValue= rand.nextInt(100);
        if(tm.containsKey(hmValue)) return tm.get(hmValue);
        SortedMap<Integer,String> sm = tm.tailMap(hmValue);
        if(sm.size()==0) return tm.get(max);
        return tm.get(sm.firstKey());//返回第一个大于hmValue的服务器

在这里插入图片描述
这里对区间内部进行了再细分(再散列),使得服务器的负载更加均衡。

负载均衡实现

  • 四层负载均衡工作在 OSI 模型第四层,也就是传输层,这一层的主要协议是TCP/UDP,负载均衡器在这一层能够看到数据包里的源端口地址以及目的端口地址,会基于这些信息通过一定的负载均衡算法将数据包转发到后端真实服务器。也就是说,四层负载均衡的核心就是IP+端口层面的负载均衡,不涉及具体的报文内容。
  • 七层负载均衡工作在 OSI 模型第七层,也就是应用层,这一层的主要协议是 HTTP。这一层的负载均衡比四层负载均衡路由网络请求的方式更加复杂,它会读取报文的数据部分(比如说我们的 HTTP部分的报文),然后根据读取到的数据内容(如 URL、Cookie)做出负载均衡决策。也就是说,七层负载均衡器的核心是报文内容(如URL、Cookie)层面的负载均衡,执行第七层负载均衡的设备通常被称为反向代理服务器

负载均衡的七层实现

  • DNS实现:DNS服务器为每个主机配备多个IP,每个IP对应不同的服务器。
  • Ngix反向代理实现:客户端将请求发送到代理,由代理去分配服务器,对客户端是透明的,安全性比较高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值