基础原理和算法解析 nginx的负载均衡算法有哪些( 三 )


Syntax: hash key [consistent];Default: —Context: upstream实战配置文件如下所示:
log_formatvarups'$upstream_addr $upstream_connect_time $upstream_header_time $upstream_response_time ''$upstream_response_length $upstream_bytes_received ''$upstream_status $upstream_http_server $upstream_cache_status';upstream iphashups {ip_hash;#hash user_$arg_username;server 127.0.0.1:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server 127.0.0.1:8012 weight=1;}server {set_real_ip_from127.0.0.1;real_ip_recursive on;real_ip_header X-Forwarded-For;server_name iphash.ziyang.com;listen 80;error_log myerror.log info;access_log logs/upstream_access.log varups;location /{proxy_pass http://iphashups;proxy_http_version 1.1;proxy_set_header Connection "";}}实际验证一下,会发现不同的 ip 地址实际上是会被不同的上游服务器处理的,如果是同一个 ip 地址,那么只会被一个上游服务器处理 。
?nginx curl -H 'X-Forwarded-For: 10.200.20.20' iphash.ziyang.com8012 server response.?nginx curl -H 'X-Forwarded-For: 1.200.20.20' iphash.ziyang.com8011 server response.基于 IP 或者基于自定义 key 的 hash 算法有一个严重的问题,那就是当上游服务器挂掉的话,Nginx 依然会向这台服务器发请求,这是因为,如果负载的不同的服务器上去,可能会得到异常的响应,同时还可能导致大量的路由变更 。下面的一致性哈希可以解决这个问题 。
一致性哈希算法:hash 模块刚才说了基于 IP 的哈希算法存在一个问题,那就是当有一个上游服务器宕机或者扩容的时候,会引发大量的路由变更,进而引发连锁反应,导致大量缓存失效等问题 。那么为什么会造成这种情况呢?
假设我们基于 key 来做 hash,现在有 5 台上游服务器,如果基于最简单的 hash 算法对 key 取模,会将 key 和 server 一一对应起来 。当有一台服务器宕机的时候,就需要重新对 key 进行 hash,最后会发现所有的对应关系全都失效了,从而会引发缓存大范围失效 。而一致性 hash 算法则可以解决这个问题 。
一致性哈希算法的原理是,将一个环分成了 2^32 个区间范围,四个节点将这个环划分成为了四个区间,每个区间的请求都由对应的节点去处理 。来看看当扩容的时候会发生什么 。
假设这时候发现 node4 负载过高,因此决定再添加一个节点进去分担压力,那么影响的也只是这个节点之后的请求,可能会缓存失效,而其他的三个节点是不会有任何影响的 。
这就是一致性 hash 算法的原理,一致性 hash 算法使用也很简单,只需要将上一节指令中的参数打开即可:
Syntax: hash key [consistent];Default: —Context: upstream这里只需要指明 consistent 参数即可 。
最少连接数算法再来看一个最少连接数算法 。这个算法顾名思义,它会优先选择连接最少的上游服务器,是由 upstream_least_conn 模块提供的 。
功能:从所有上游服务器中,找出当前并发连接数最少的一个,将请求转发到它如果出现多个最少连接服务器的连接数都是一样的,使用 rr 算法模块: ngx_http_upstream_least_conn_module ,通过 –without-http_upstream_ip_hash_module 禁用模块指令的用法也很简单,直接在 upstream 模块中开启 least_conn 指令即可 。
Syntax: least_conn;Default: —Context: upstream负载均衡策略对所有 worker 进程生效:upstream_zone 模块上面说的所有的负载均衡算法对于 worker 进程来说都是独立的,每个 worker 进程之间并不互通,这样在很多时候并不是我们期望的 。
我们期望的应该是负载均衡算法对所有的 worker 进程生效 。
功能:分配出共享内存,将其他 upstream 模块定义的负载均衡策略数据、运行时每个上游服务器的状态数据存放在共享内存上,以对所 Nginx worker 进程生效模块: ngx_http_upstream_zone_module ,通过 –without-http_upstream_ip_hash_module 禁用模块一个指令,指定 zone 的名字以及对应的大小:


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: