ip_hash
upstream colony {
ip_hash;
server 192.168.1.20;
server 192.168.1.37;
server 192.168.1.26;
keepalive 32;
}
我本机访问只会落在 26这台服务器上
本质上是 根据用户的ip hash 之后值分配 到指定的一台服务器里面
可以保证只要ip 不变,每次请求回话 Session 不会跑到其他的服务器
但是ip 发生了更改就会有可能请求到其他的服务器
Hash 算法
hash(ip) % node_counts(服务器节点数量) = index
分库分表的hash 算法也是类似的,例如 分为三张表 根据主键id 的值进行求模 分配到这三张表的其中一张
ip_hash算法的源码目录
/nginx-1.16.1/src/http/modules
ip_hash 算法中,请求是基于客户端IP地址分布在服务器之间的。客户端 IPv4 地址的前三个字节,或整个 IPve 地址,用作散列键。ip_hash 算法确保来自同一客户机的请求总是被传递到同一服务器,除非该服务器不可用,如果不可用,客户机请求将被传递到另一个服务器,很可能,它也总是相同的服务器
从版本1.3.2 和 1.2.2 开始支持IPv6地址
如果需要临时删除其中一个服务器,则应该使用 down 参数标记它,以保留当前客户端IP 地址的散列
ip_hash 算法 ,会把IP段前三段进行分割 192.168.1.001 分割成192.168.1
这样会导致在用虚拟机多台测试的时候, 因为我们前三段都是一样的 所以无法起到ip_hash 的效果
hash key(consistent) 一致性hash 算法
数值范围类型于一个圆形 用户hash 之后的值按照 顺时针就近原则 指定落到哪一台节点服务器
当服务器节点减少时 原来客户机落在节点3 附近的 ,按照顺时针就近原则 落在节点4.
但是其他 客户机取值范围不在节点3的 不受影响, 如果是 ip_hash 就会全部调整 hash
同理,新增服务器会根据范围把原来分配到节点3的用户 按照顺时针就近原则 分配到新的节点服务器
这个指令出现在版本1.7.2中指定服务器组的负载平衡方法,其中客户端-服务器映射基于散列键值。该键可以包含文本、变量及其组合。注意,从组中添加或删除服务器可能会导致将大多数密钥重新映射到不同的服务器。该方法与缓存::Memcached Perl库兼容如果指定了一致参数,则将使用ketama一致哈希方法,该方法确保在向组添加或从组删除服务器时,只有少数键会被重新映射到不同的服务器。这有助于为缓存服务器实现更高的缓存命中率。该方法与Cache:Memcached:Fast Perl库兼容,ketama-point参数设置为160,
upstream colony {
hash $request_uri;
#根据每次请求的url地址,hash后访问到固定服务器节点
server 192.168.1.20;
server 192.168.1.37;
server 192.168.1.26;
keepalive 32;
}
server {
listen 8088;
server_name xxx;
location / {
proxy_pass http://colony;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
请求地址发生改变有可能就请求另一台服务器了