ip_hash

	upstream	colony {
		ip_hash;
		server	192.168.1.20;
		server	192.168.1.37;
		server	192.168.1.26;
		keepalive	32;	
	}

 我本机访问只会落在 26这台服务器上nginx ip_hash 优化 nginx的ip_hash_服务器

 

本质上是 根据用户的ip hash 之后值分配 到指定的一台服务器里面

可以保证只要ip 不变,每次请求回话 Session 不会跑到其他的服务器

但是ip 发生了更改就会有可能请求到其他的服务器

Hash 算法

nginx ip_hash 优化 nginx的ip_hash_服务器_02

 

hash(ip) % node_counts(服务器节点数量) = index

分库分表的hash 算法也是类似的,例如 分为三张表 根据主键id 的值进行求模 分配到这三张表的其中一张

ip_hash算法的源码目录

/nginx-1.16.1/src/http/modules

 

nginx ip_hash 优化 nginx的ip_hash_服务器_03

 

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 的效果

nginx ip_hash 优化 nginx的ip_hash_其他_04

hash key(consistent) 一致性hash 算法

nginx ip_hash 优化 nginx的ip_hash_顺时针_05

数值范围类型于一个圆形 用户hash 之后的值按照 顺时针就近原则 指定落到哪一台节点服务器

nginx ip_hash 优化 nginx的ip_hash_顺时针_06

 

当服务器节点减少时 原来客户机落在节点3 附近的 ,按照顺时针就近原则 落在节点4.

但是其他 客户机取值范围不在节点3的 不受影响, 如果是 ip_hash 就会全部调整 hash

nginx ip_hash 优化 nginx的ip_hash_客户端_07

同理,新增服务器会根据范围把原来分配到节点3的用户 按照顺时针就近原则 分配到新的节点服务器

 

这个指令出现在版本1.7.2中指定服务器组的负载平衡方法,其中客户端-服务器映射基于散列键值。该键可以包含文本、变量及其组合。注意,从组中添加或删除服务器可能会导致将大多数密钥重新映射到不同的服务器。该方法与缓存::Memcached Perl库兼容如果指定了一致参数,则将使用ketama一致哈希方法,该方法确保在向组添加或从组删除服务器时,只有少数键会被重新映射到不同的服务器。这有助于为缓存服务器实现更高的缓存命中率。该方法与Cache:Memcached:Fast Perl库兼容,ketama-point参数设置为160,

 

nginx ip_hash 优化 nginx的ip_hash_客户端_08


	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 "";
		}
	}

 

nginx ip_hash 优化 nginx的ip_hash_顺时针_09

nginx ip_hash 优化 nginx的ip_hash_顺时针_10

 

请求地址发生改变有可能就请求另一台服务器了