nginx 一致性负载的两三个问题

78 阅读1分钟

应用背景:

    在服务负载的过程中我们除了使用ip_hash进行负载外,根据项目的不同往往需要有不同的负载条件,例如根据URL路由负载,参数路由负载等。

在这些场景中ip_hash 很显然不能满足我们的业务需求,目前nginx提供了两种hash一致性负载方式。其一使用一致性hash模块插件ngx_http_consistent_hash ,其二在nginx1.18.0版本后可以直接使用hash 一致性指令。

释义:

  nginx的一致性hash负载均衡算法通过使用客户端信息(如:ip,ip, uri, $args等变量)作为参数将客户端映射到服务节点,如果路由的节点宕机,请求会被迁移到hash环上离宕机节点最近的节点。

算法原理:

将每个server虚拟成n个节点,均匀分布到hash环上,每次请求会根据配置的参数计算出一个hash值,在hash环上查找离这个hash值最近的虚拟节点作为该次请求的服务节点。

upstream server 配置 :

 id:  如果配置id了字段,则使用id字段作为server标识,否则使用server ip和端口作为server标识。

  • 使用id字段可以手动设置server的标识,比如一台机器的ip或者端口变化,id仍然可以表示这台机器。
  • 使用id字段可以减低增减服务器时hash的波动。
  1. weight:  轮询权值 ,默认为1 值越大分配到的访问概率越高,主要用于服务器性能不均衡的情况下设置不同的权值,以达到合理有效的地利用资源。

  2. max_fails:允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

  3. fail_timeout:默认10s,max_fails次失败后,暂停的时间。

  4. backup:备用服务器, 其它所有的非backup机器down或者忙的时候,请求backup机器,所以这台机器压力会最轻。

  5. down:表示单前的server暂时不参与负载

ngx_http_consistent_hash 模块

  下载:

     项目地址:  github.com/replay/ngx_…

     下载地址:    github.com/replay/ngx_…

   编译安装:

    ./configure --add-module=/home/ngx_http_consistent_hash-master

注释:module=下载解压的模块在服务器中的绝对路径;

 ./configure --prefix=/home/nginx目录 --with-pcre=../pcre-8.40 --with-stream --with-ngx_http_consistent_hash

ps: 关闭使用参数 --without-http_upstream_consistent_hash_module

 make && make install

指令示例:

http {
     upstream test { 
         #主要配置onsistent_hash指令  
         consistent_hash $request_uri; 
         server 127.0.0.1:9001 id=1001 weight=3;
         server 127.0.0.1:9002 id=1002 weight=20;
      } 
}

nginx 1.18.0版本后支持的hash一致性指令

 ps:  指令支持故障转移

指令示例:

upstream testHash {
      #  指令关键字 hash xxx  consistent; xx 代表需要计算hash 的字符串
    hash $http_token consistent;   

    server 127.0.0.1:8290;
    server 127.0.0.1:8090;
}

四层代理  stream 与http 平级

stream{
  log_format proxy '$remote_addr $remote_port - [$time_local] $status $protocol "$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"';
   access_log logs/stream-access.log proxy;

    upstream 4vProxy {
        server 127.0.0.1:8290;
        server 127.0.0.1:8090;

    }

    server{
        listen 5671;
        proxy_pass 4vProxy;
    }

}