关于负载均衡loadbalanace

负载均衡简介

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。

负载均衡分为客户端负载均衡和服务器端负载均衡

服务器端负载均衡:例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。它的一个特点是调用的客户端不知道具体是哪一个Server提供的服务,只需要将请求发送给Nginx,再由Nginx转发给 Tomcat,客户端只需要记住Nginx的地址即可。即对于客户端来说,他不关心到底是哪一个server提供服务。

客户端负载均衡:例如spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。客户端从自身已知的Server列表中,根据提前配置的负载均衡策略,自己挑选一个服务端来调用,此时客户端知道自己调用的是哪一个 Server。因此从概念上可以叫做客户端负载均衡。

从实现的角度来看,以及负载均衡策略的角度来看,客户端负载均衡和服务端负载均衡背后实现的思想没有本质区别。只是使用哪一个service的决定权不同。

nginx实现负载均衡

首先建立一个Spring Boot的项目对外提供服务,来模拟实际的服务,还可以配置其它可以提供网络请求处理的框架来提供服务,这里具体由什么来提供服务和nginx配置并不相关,nginx只需要配置这些服务的url即可。

假设我们有如下controller

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class TestApplication {

    @Value("${server.port:}")
    private String port;

    public static void main(String[] args) {
        SpringApplication.run(TestApplication .class, args);
    }

    @GetMapping("")
    public String hello() {
        System.out.println("call me " + port);
        return "Port of this instance is" + port;
    }

}

将项目打包并部署两次到不同的端口号上,模拟有多个instance的情况

java -jar test.jar --server.port=8001
java -jar test.jar --server.port=8002

然后再打开本地的nginx配置文件,配置服务器信息:

http {
    upstream upstream_name{
        server 192.168.0.28:8001;
        server 192.168.0.28:8002;
    }

    server {
        listen       8080;
        server_name  localhost;

        location / {
            proxy_pass http://upstream_name;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

关于配置的更多内容可以参考官方文档:http://nginx.org/en/docs/beginners_guide.html

当nginx配置好之后,多访问几次 localhost:8080。就会发现返回的东西是会变化的。

nginx的负载均衡策略有下面这几种:

轮询 默认方式
weight 权重方式
ip_hash 依据ip分配方式
least_conn 最少连接方式
fair(第三方) 响应时间方式
url_hash(第三方) 依据URL分配方式

1.轮询

  最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。

  有如下参数:

fail_timeout 与max_fails结合使用。
max_fails

设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,

fail_time 服务器会被认为停机的时间长度,默认为10s。
backup 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
down 标记服务器永久停机了。

  注意:

  • 在轮询中,如果服务器down掉了,会自动剔除该服务器。
  • 缺省配置就是轮询策略。
  • 此策略适合服务器配置相当,无状态且短平快的服务使用。

2.weight

  权重方式,在轮询策略的基础上指定轮询的机率。例子如下:

    
    upstream dynamic_zuoyu {
        server localhost:8080   weight=2;  #tomcat 7.0
        server localhost:8081;  #tomcat 8.0
        server localhost:8082   backup;  #tomcat 8.5
        server localhost:8083   max_fails=3 fail_timeout=20s;  #tomcat 9.0
    }

  在该例子中,weight参数用于指定轮询机率,weight的默认值为1,;weight的数值与访问比率成正比,比如Tomcat 7.0被访问的机率为其他服务器的两倍。

  注意:

  • 权重越高分配到需要处理的请求越多。
  • 此策略可以与least_conn和ip_hash结合使用。
  • 此策略比较适合服务器的硬件配置差别比较大的情况。

3.ip_hash

  指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

4.least_conn

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

高可用与负载均衡

高可用的定义是:高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。白话来讲,高可用对于系统来说就是让这个系统在大多的时间里都是可以使用的。一个反例是12306系统,12306在每天11点之后就不能再进行操作,从这个角度来说其系统不具备高可用的特征。

高可用集群中的节点一般是一主一备,或者一主多备,通过备份提高整个系统可用性。
而负载均衡集群一般是多主,每个节点都分担流量

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章