Nginx 負載均衡 ip_hash , hash key(consistent) url_hash, least_conn

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

 

 

請求地址發生改變有可能就請求另一臺服務器了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章