nginx的6种负载均衡策略

在服务器集群中,Nginx起到一个反向代理服务器的做用。为了不单独一个服务器压力过大致使服务器奔溃,就须要将不一样用户的请求转发给不一样给不一样的服务器,保证集群中的每一台服务器都能正常运做,这种机制就叫作负载均衡。算法

下面说一下Nginx支持的6种负载均衡策略。后端

轮询(默认)跨域

轮询是Nginx支持的默认负载均衡策略,轮询策略就是指每一个请求会按时间顺序逐一分配到不一样的后台服务器上。好比说一个集群中只有服务器A和服务器B,第一次访问是服务器A,第二次访问就是服务器B,第三次访问就是服务器A...以此类推。缓存

upstream balanceServer {
    server localhost:8081;
    server localhost:8082;
    server localhost:8083;
    server localhost:8084;
}

轮询策略提供以下参数:服务器

fail_timeout 与max_fails结合使用,表示max_fails次失败后服务器暂停的时间。
max_fails
设置在fail_timeout参数设置的时间内最大失败次数,默认是1,若是在这个时间内,全部针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,返回proxy_next_upstream模块定义的错误。
fail_time 服务器会被认为停机的时间长度,默认为10s。
backup 标记该服务器为备用服务器。当主服务器中止时,请求会被发送到它这里,当其余全部的非backup机器down掉或者繁忙的时候才会请求backup服务器,所以这台机器压力会最低。
down 标记服务器永久停机了,表示当前的server暂时不参与负载。
weight 负载的权重,默认为1。weight越大,表示这台服务器被访问的概率就越大。

在轮询策略下,若是集群中的某个服务器挂掉了,就会自动剔除该服务器。并发

轮询策略适合服务器配置至关,无状态且短平快的服务使用。负载均衡

权重(weight,加权轮询)ide

权重策略是在轮询策略的基础上,另外指定了轮询的概率。url

upstream balanceServer {
    server localhost:8081;
    server localhost:8082 backup;
    server localhost:8083 max_fails=3 fail_timeout=20s;
    server localhost:8084 weight=2;
}

在上面的例子中,weight参数用来指定轮询的概率,weight的默认值为1,weight的数值与访问比率成正比,好比8084端口的服务器被访问的概率是其余服务器的两倍。spa

权重越高,分配到须要处理的请求就越多。

权重策略能够与least_conn和ip_hash结合使用。

权重策略比较适合服务器的硬件配置差异较大的状况。

根据IP分配(ip_hash)

这种策略是按照客户端的IP去分配服务器,使同一个客户端的请求都转发到同一个后台服务器,保证了Session的统一性,能够用来解决Session的跨域问题。

upstream balanceServer {
    ip_hash; # 指定负载均衡策略为ip_hash
    server localhost:8081;
    server localhost:8082 backup;
    server localhost:8083 max_fails=3 fail_timeout=20s;
    server localhost:8084 weight=2;
}

在Nginx的1.3.1版本以前,不能在这种策略种使用权重(weight)。

ip_hash不能和backup参数同时使用。

这个策略适用于有状态服务,好比说Session会话。

当有服务器须要剔除的时候,必须手动down掉。

最少链接(least_conn)

这个策略是把请求转发给链接数较少的后端服务器。前面的轮询策略是把请求平均地转发给集群中的每一个后台服务器,使得它们的负载大体相同,可是有些请求可能占用的时间会很长,可能致使所在的后端负载太高。这种状况下选用least_conn策略就能达到更好的负载均衡效果。

upstream balanceServer {
    least_conn; # 指定负载均衡策略为least_conn
    server localhost:8081;
    server localhost:8082 backup;
    server localhost:8083 max_fails=3 fail_timeout=20s;
    server localhost:8084 weight=2;
}

这个策略适合用在请求处理时间长短不一形成服务器过载的场景。

响应时间(fair)

这种策略是按照服务器的响应时间来分配请求,响应时间短的优先分配。

upstream balanceServer {
    fair; # 指定负载均衡策略为fair
    server localhost:8081;
    server localhost:8082;
    server localhost:8083;
    server localhost:8084;
}

fair策略是一种第三方策略,须要安装第三方插件。

根据URL分配(url_hash)

这种策略是按照访问url的hash结果来分配请求,使得每一个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源屡次请求,可能会到达不一样的服务器上,致使没必要要的屡次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash的话,就可使得同一个url(也就是同一个资源请求)到达同一台服务器,一旦缓存住了资源,再次收到请求,就能够从缓存中读取。

upstream balanceServer {
    url_hash; # 指定负载均衡策略为url_hash
    server localhost:8081;
    server localhost:8082;
    server localhost:8083;
    server localhost:8084;
}

url_hash策略是一种第三方策略,须要安装第三方插件。

配置实例

# user yanggb;
worker_processes  4;

events {
    # 最大并发数
    worker_connections  1024;
}

http {
    # 待选服务器列表
    upstream balanceServer {
        server 10.1.40.129:8099 fail_timeout=60s;
        server 10.1.40.23:9088;
        server 10.1.40.77:7086;
    }

    server {
        # 监听端口
        listen 80;
        
        # 根目录下
        location / {
            # 选择哪一个服务器列表
            proxy_pass http://balanceServer;
        }
    }
    
}

总结

Nginx的负载均衡其实也能够看做是5种,由于其中的权重轮询其实能够归类到轮询策略中。除了轮询策略(包括权重轮询)外的其余负载均衡策略都是使用不一样的算法实现的,在实际的运用中,须要根据不一样的场景有针对性地去选择不一样的负载均衡策略(能够多种策略组合使用),来响应实际的需求。

 

"有没有那么一个特别的场景,能让你想起我。"

相关文章
相关标签/搜索