一、配置
http { upstream http_backend { hash $remote_addr consistent; server 192.168.10.131:3306 max_fails=2 fail_timeout=10s weight=1; server 192.168.10.132:3306 max_fails=2 fail_timeout=10s weight=1; keepalive 32; keepalive_timeout 60s; } server { listen 8000; location /http/ { proxy_pass http://http_backend; proxy_http_version 1.1; proxy_set_header Connection ""; }}
二、说明
1、hash一致性
hash $remote_addr consistent;在一个upstream配置块中,如果有hash指令,且它只带一个参数,则使用的负载均衡算法为哈希算法,比如:hash $remote_addr;在一个upstream配置块中,如果有hash指令,且它带了两个参数,且第二个参数为consistent,则使用的负载均衡算法为一致性哈希算法,比如:hash $remote_addr consistent;如果consistent指定了参数,则将使用ketama 一致的哈希方法。该方法确保在将服务器添加到组或从组中删除时,只有少数密钥将重新映射到不同的服务器。这有助于为缓存服务器实现更高的缓存命中率hash nginx的负载均衡时有一个hash $request_uri的选项,这个是类似于LVS的dh。是针对客户端访问的uri来做的绑定。这样客户端访问同一个uri的时候,会被分配到同一个服务器上去。这样提高了缓存的命中率。过程:每个uri进行hash计算得到一个数值,这个数值除以整个节点数量取余数。(取模算法)缺点:如果一个节点挂了,那么整个全局都会乱掉。因为整个的节点数变了,因为除数变了一致性hash 一致性hash的采用的是除数特别大,假设有一个hash环。是个闭环。把32位二进制的整数转换为十进制后均匀分布在整个环上。hash结果是除以2的32次方-1(hash是除以). 那么结果一定是落在环上的。那么,这个点靠近谁,就缓存在谁那里。假设a节点坏了。那么下一次的计算结果就是旁边的邻居。但是邻居的缓存不会受到影响。只是坏掉的A节点会从新去缓存。一致性哈希算法能够帮助我们缓解由于宕机或者扩容时我们的路由不发生大规模的变化,当我们的上游服务使用缓存的时候,不会导致大范围的缓存失效.它不能使得扩容或者宕机之后所有的路由都不发生变化,但是能使得小范围的缓存失效而缓解由于扩容或宕机带来的问题.2、其他参数
1、keepalive 激活缓存以连接到上游服务器。该connections参数设置每个工作进程的缓存中保留到上游服务器的最大空闲保持连接数。当超过这个数字时,最近最少使用的连接将被关闭。需要特别注意的是,该keepalive指令并没有限制一个nginx worker进程可以打开的上游服务器的连接总数。该connections参数应设置为足够小的数字,以使上游服务器也能处理新的传入连接。使用默认循环方法以外的负载平衡方法时,需要在keepalive指令之前激活它们。配置keepalive的主要意图:解决在高延迟网络上建立TCP连接的延迟问题。当nginx与上游服务器之间需要持续保持一定数量的连接时,keepalive很有用。开启Keep-Alive连接对性能有很大的影响:减少了打开和关闭连接所需的CPU和网络开销。通过在nginx中启用HTTP keepalive,降低了nginx连接上游服务器的延迟,从而提高了性能,并减少了nginx耗尽临时端口的可能性。nginx将重用现有的TCP连接,而不创建新的TCP,这可以极大地减少繁忙服务器上TIME_WAIT TCP连接中的套接字数量(减少操作系统建立新连接的工作,减少网络上的数据包)注意: 仅在HTTP/1.1时支持Keep-Alive连接。2、keepalived_requests 设置可以通过一个保持连接提供服务的最大请求数。发出最大请求数后,连接将关闭。定期关闭连接对于释放每个连接的内存分配是必要的。因此,使用过高的最大请求数可能会导致过多的内存使用,因此不推荐使用。在 1.19.10 版本之前,默认值为 100,最新版本默认值是10003、keepalive_timeout设置超时,webserver在处理完一个请求后保持这个TCP连接的打开状态。指定每个TCP连接最多可以保持多长时间。4、proxy_http_version因为http 1.0协议是不支持keepalive长连接的,为了防止用户发来的是http 1.0协议我们需要重置http_version为1.1,这样一直可以使用keepalive长连接5、proxy_set_header Connection "";为了防止用户connection头部给我们传入的是closed而不是keepalived,我们需要主动设置向上游发的Connection值为Connection ""。