负载均衡策略

负载均衡算法作用

轮询

逐一轮询,默认方式如果服务器down掉了,会自动剔除该服务器。

  • 此策略适合服务器配置相当,无状态且短平快的服务使用

  • 业务无特殊要求时使用

  • 也适用于图片服务器集群和纯静态页面服务器集群

weight

加权轮询weight越大,分配的几率越高。 适用业务场景:用于后端服务器硬件性处理能力不平均的情形

ip_hash

按照访问IP的hash值进行分配,会导致来自同一IP的请求访问固定的一个后台服务器。

适合需要状态保持的服务,例如需要账号登录的系统,会话连接保持的业务。

url_hash

按照访问URL的hash结果分配,适用于后端服务器为缓存服务器时比较有效

(需编译安装第三方模块 ngx_http_upstream_hash_module)

least_conn

按HTTP连接数来分配请求,连接数少的优先分配。

适合请求处理时间长短不一造成服务器过载的业务场景。

fair

按后端服务器的响应时间来分配请求,响应时间短的优先分配。 适合对访问响应速度有一定要求的业务。

(需编译安装第三方模块 ngx_http_upstream_fair_module)

ip_hash 的配置示例

# 动态服务器组
upstream dynamic_server {
  ip_hash;  # 保证每个访客固定访问一个后端服务器
  server localhost:8080  weight=2; # jdk 8
  server localhost:8081; # jdk 17
  server localhost:8082; # jdk 16
  server localhost:8083  max_fails=3 fail_timeout=20s; # jdk 15
}
  • ip_hash不能与backup同时使用

  • 由于ip_hash技术主要根据客户端IP地址分配服务器,因此在整个系统中,Nginx服务器应该是处于最前端的服务器,这样才能获取到客户端的IP地址,否则它得到的IP地址将是位于它前面的服务器地址,从而就会产生问题

url_hash配置示例

按目标url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。

# 动态服务器组
upstream dynamic_server {
  hash $request_uri;  # 实现每个url定向到同一个后端服务器
  server localhost:8080;
  server localhost:8081; 
  server localhost:8082 max_fails=3 fail_timeout=20s; # jdk 15
}

least_conn配置示例

有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

# 动态服务器组
upstream dynamic_server {
  least_conn;  # 把请求优先转发给连接数较少的后端服务器
  server localhost:8080  weight=2; #jdk 8
  server localhost:8081; #jdk 17
  server localhost:8082  backup; #jdk 16
  server localhost:8083  max_fails=3 fail_timeout=20s; #jdk 15
}

fair配置示例

特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配。

适用业务场景:对访问响应速度有一定要求的业务

# 动态服务器组
upstream dynamic_server {
  fair;  # 把请求转发给连接数较少的后端服务器
  server localhost:8080;
  server localhost:8081;
  server localhost:8082;
  server localhost:8083 max_fails=3 fail_timeout=20s;
}

Last updated