应用背景:
在服务负载的过程中我们除了使用ip_hash进行负载外,根据项目的不同往往需要有不同的负载条件,例如根据URL路由负载,参数路由负载等。
在这些场景中ip_hash 很显然不能满足我们的业务需求,目前nginx提供了两种hash一致性负载方式。其一使用一致性hash模块插件ngx_http_consistent_hash ,其二在nginx1.18.0版本后可以直接使用hash 一致性指令。
释义:
nginx的一致性hash负载均衡算法通过使用客户端信息(如:uri, $args等变量)作为参数将客户端映射到服务节点,如果路由的节点宕机,请求会被迁移到hash环上离宕机节点最近的节点。
算法原理:
将每个server虚拟成n个节点,均匀分布到hash环上,每次请求会根据配置的参数计算出一个hash值,在hash环上查找离这个hash值最近的虚拟节点作为该次请求的服务节点。
upstream server 配置 :
id: 如果配置id了字段,则使用id字段作为server标识,否则使用server ip和端口作为server标识。
- 使用id字段可以手动设置server的标识,比如一台机器的ip或者端口变化,id仍然可以表示这台机器。
- 使用id字段可以减低增减服务器时hash的波动。
-
weight: 轮询权值 ,默认为1 值越大分配到的访问概率越高,主要用于服务器性能不均衡的情况下设置不同的权值,以达到合理有效的地利用资源。
-
max_fails:允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
-
fail_timeout:默认10s,max_fails次失败后,暂停的时间。
-
backup:备用服务器, 其它所有的非backup机器down或者忙的时候,请求backup机器,所以这台机器压力会最轻。
-
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;
}
}