Nginx-3 Nginx 的負載均衡策略

Nginx-3 Nginx 的負載均衡策略

Nginx 的負載均衡其實就是指將請求按照一定的策略轉發給服務集群中的一臺,提高了服務集群的可用性,解決數據流量過大、網絡負荷過重的問題。

AKF 擴展立方體

image-20250616165359356

分為 3 個方向負載:

  • x 軸:增加實例數量,一般要求應用是無狀態的,通過增加應用數量來提高應用程序性能和可用性,但是由于數據庫等資源的限制,所以并不是無限制的
  • y 軸:基于業務功能拓展,不同的業務領域擴展成不同的應用,通過 url 或其他方式將請求轉發給不同的應用,同時每個應用還可以進行 x 軸拓展
  • z軸:按數據屬性分區,比如應用有多個數據中心,可以基于用戶的 ip 選擇比較近的數據中心進行服務

順便一提,一般來講,nginx 與后端應用服務通常部署在同一內網環境中,且后端服務一般是有限的,開啟 keepalive 長連接對于性能(提升吞吐量,降低時延)的提升會更明顯

Syntax:	keepalive connections;
Default:	—
Context:	upstreamSyntax:	keepalive_requests number;
Default:	
keepalive_requests 1000;
Context:	upstreamSyntax:	keepalive_time time;
Default:	
keepalive_time 1h;
Context:	upstreamSyntax:	keepalive_timeout timeout;
Default:	
keepalive_timeout 60s;
Context:	upstream

round-robin

策略:加權輪詢訪問 server 指令指定的上游服務

指令:

weight 			# 服務器權重,默認 1
max_conns 		# server 的最大并發連接數,僅作用于單 worker,默認為 0 沒有限制
max_fails		# 在 fail_timeout 時間段內,允許的最大失敗次數# 如果達到該次數則在 fail_timeout 這段時間內不再選擇此服務器
fail_timeout	# 到達 max_fails 后,該 server 的不能再次訪問時間				

配置兩臺 nginx

# 模擬兩臺后端服務
server {listen       8011;server_name  localhost;return 200 '8011 server response \n';
}server {listen 8012;server_name localhost;return 200 '8012 server response \n';
}
# 反向代理服務器
upstream rrups {server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;keepalive 32;
}server {listen 9001;location / {proxy_pass http://rrups;proxy_http_version 1.1;proxy_set_header Connection "";}
}

測試

[root@node-17 ~]# curl 123.207.214.107:9001
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9001
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9001
8012 server response
[root@node-17 ~]# curl 123.207.214.107:9001
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9001
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9001
8012 server response

抓下包進行分析:

tcpdump -i lo port 8011
09:14:30.666190 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [S], seq 976418546, win 43690, options [mss 65495,sackOK,TS val 1034055580 ecr 0,nop,wscale 7], length 0
09:14:30.666208 IP VM-16-11-centos.8011 > VM-16-11-centos.60192: Flags [S.], seq 1448846227, ack 976418547, win 43690, options [mss 65495,sackOK,TS val 1034055580 ecr 1034055580,nop,wscale 7], length 0
09:14:30.666219 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [.], ack 1, win 342, options [nop,nop,TS val 1034055580 ecr 1034055580], length 0
09:14:30.666253 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [P.], seq 1:70, ack 1, win 342, options [nop,nop,TS val 1034055580 ecr 1034055580], length 69
09:14:30.666266 IP VM-16-11-centos.8011 > VM-16-11-centos.60192: Flags [.], ack 70, win 342, options [nop,nop,TS val 1034055580 ecr 1034055580], length 0
09:14:30.666349 IP VM-16-11-centos.8011 > VM-16-11-centos.60192: Flags [P.], seq 1:185, ack 70, win 342, options [nop,nop,TS val 1034055580 ecr 1034055580], length 184
09:14:30.666356 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [.], ack 185, win 350, options [nop,nop,TS val 1034055580 ecr 1034055580], length 0
09:14:32.105110 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [P.], seq 70:139, ack 185, win 350, options [nop,nop,TS val 1034057019 ecr 1034055580], length 69
09:14:32.105183 IP VM-16-11-centos.8011 > VM-16-11-centos.60192: Flags [P.], seq 185:369, ack 139, win 342, options [nop,nop,TS val 1034057019 ecr 1034057019], length 184
09:14:32.105192 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [.], ack 369, win 359, options [nop,nop,TS val 1034057019 ecr 1034057019], length 0
09:15:32.159360 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [F.], seq 139, ack 369, win 359, options [nop,nop,TS val 1034117073 ecr 1034057019], length 0
09:15:32.159429 IP VM-16-11-centos.8011 > VM-16-11-centos.60192: Flags [F.], seq 369, ack 140, win 342, options [nop,nop,TS val 1034117073 ecr 1034117073], length 0
09:15:32.159439 IP VM-16-11-centos.60192 > VM-16-11-centos.8011: Flags [.], ack 370, win 359, options [nop,nop,TS val 1034117073 ecr 1034117073], length 0

分析 TCP 標志位

只在最開始 [S] [S.] [.] (syn syn-ack ack)建立了一次連接,兩次請求復用了同一個連接,1分鐘后連接斷開

hash

ip_hash

策略:以客戶端IP作為哈希算法的關鍵字,映射到特定的上游服務器中。

  • 對 IPV4 地址使用前3個字節作為關鍵字,對于 IPV6 地址則使用完整地址
  • 可以結合 realip 模塊修改用于執行算法的 IP 地址

配置:

upstream iphashups {ip_hash;server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;
}server {listen 9002;location / {proxy_pass http://iphashups;proxy_http_version 1.1;proxy_set_header Connection "";}
}

測試

[root@node-17 ~]# curl 123.207.214.107:9002
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9002
8011 server response
[root@node-17 ~]# curl 123.207.214.107:9002
8011 server response

可以發現如果配置了 ip_hash,及時配置了 weight 權重,也一直使用同一臺 server

nginx 中的 upstream_hash 模塊支持指定關鍵字作為 hash 算法的 key,不再局限于 ip 地址

配置:

upstream hashups {hash user_$arg_username;server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;
}server {listen 9003;location / {proxy_pass http://hashups;proxy_http_version 1.1;proxy_set_header Connection "";}
}

測試:

[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=zhangsan
8012 server response
[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=zhangsan
8012 server response
[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=zhangsan
8012 server response[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=lisi
8011 server response
[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=lisi
8011 server response
[root@VM-16-11-centos nginx]# curl 123.207.214.107:9003?username=lisi
8011 server response

一致性 hash算法

當使用 hash 算法時,如果有某臺上游服務宕機了,我們一般不能直接將其從 upstream 中移除,原因是簡單的 hash 其實就是計算一個哈希值,對服務數量取余,如果突然增加或減少一臺服務器,會有大量的正常連接受到影響,一致性 hash 算法就是用來緩解這個問題的。

具體的原理可以參考這篇文章:一致性哈希

使用的話其實比較簡單,在 hash 對應的 key 后加 consistent 即可

Syntax:	hash key [consistent];
Default:	—
Context:	upstream
upstream hashups {hash user_$arg_username consistent;server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;
}

least-conn

策略:從所有上游服務器中,找出一個當前連接數最少的,如果出現多個最少連接數相同的,就選擇 round-robin 算法

配置:

upstream hashups {least_conn;server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;
}

random

策略:從所有上游服務器中,隨機選擇一臺服務器來處理請求

配置:

upstream hashups {random;server localhost:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5;server localhost:8012 weight=1;
}

由于它沒有考慮服務器的負載情況,通常在實際生產環境中比較少用,尤其是在需要均衡負載的場景下

值得注意的一點是,如果 nginx 啟動了多臺 worker 進程,需要借助共享內存使得負載均衡策略對所有 worker 進程生效

Syntax:	zone name [size];
Default:	—
Context:	upstream
This directive appeared in version 1.9.0.

另外 upstream 之間的模塊也是有順序的,文件來源 (objs/ngx_modules.c)

ngx_module_t *ngx_modules[] = {......&ngx_http_upstream_hash_module,&ngx_http_upstream_ip_hash_module,&ngx_http_upstream_least_conn_module,&ngx_http_upstream_random_module,&ngx_http_upstream_keepalive_module,&ngx_http_upstream_zone_module,......NULL
};

從上至下的順序,worker 進程在負載均衡算法的最后會將信息維護在共享內存中:

  • 后端服務器的狀態:如健康檢查的結果、服務器是否可用等
  • 負載均衡算法:例如輪詢、最少連接、哈希算法等
  • 請求的分配情況:nginx 會將請求分配到最合適的后端服務器上,并且通過共享內存來更新各個服務器的狀態(例如連接數、響應時間等)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85004.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85004.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85004.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Wiiu平臺RetroArch全能模擬器美化整合包v1.18

這款WiiU平臺RetroArch全能模擬器美化整合包v1.18的亮點包括: 1. 18款平臺完美兼容:無論你是喜歡NES時代的經典游戲,還是鐘愛SNES、GBA等平臺的大作,這款整合包都能滿足你的需求,讓你盡情暢玩游戲。 2. 三款自制主題&a…

MyBatis原理

Mybatis執行過程為:接口代理->sqlSession會話->executor執行器->JDBC操作 一、接口代理 Mybatis根據Mapper接口,動態生成相應實現類 二、SqlSession介紹 MyBatis核心對象SqlSession介紹 - MyBatis中文官網 三、Executor執行器介紹 精通My…

升級內核4.19-腳本

#bash cd /root yum remove -y kernel-tools-3.10.0-1160.el7.x86_64 yum remove -y kernel-tools-libs-3.10.0-1160.el7.x86_64tar -xvf rhel-7-amd64-rpms.tar.gz cd /root/rhel-7-amd64-rpms #安裝依賴、包括socat&conntrack yum localinstall -y *.rpm --skip-broken#升…

全面理解 JVM 垃圾回收(GC)機制:原理、流程與實踐

JVM 的 GC(Garbage Collection)機制是 Java 程序性能的關鍵支柱。本文將從堆內存布局、回收原理、GC 算法、流程細節、并發收集器機制等維度,系統講清楚 GC 的底層運作原理和優化思路。 一、JVM 堆內存結構 Java 堆是 GC 管理的主要區域&am…

runas命令讓其他用戶以管理員權限運行程序

RUNAS 用法: RUNAS使用示例: runas /noprofile /user:mymachine\administrator cmd #本機Administrator管理員身份執行CMD,/noprofile為不加載該用戶的配置信息。runas /profile /env /user:mydomain\admin “mmc %windir%\system32\dsa.msc” #本機上…

實戰指南:部署MinerU多模態文檔解析API與Dify深度集成(實現解析PDF/JPG/PNG)

MinerU web api部署 MinerU 能夠將包含圖片、公式、表格等元素的多模態 PDF、PPT、DOCX 等文檔轉化為易于分析的 Markdown 格式。 克隆 MinerU 的倉庫 git clone https://github.com/opendatalab/MinerU.gitcd 到 projects/web-api cd projects/web-api在可以科學上網的情況下…

向量外積與秩1矩陣的關系

向量外積與秩1矩陣的關系 flyfish 向量外積是構造秩1矩陣的基本工具,其本質是用兩組向量的線性組合刻畫矩陣的行和列相關性;任意秩1矩陣必可表示為外積,而低秩矩陣(秩 k k k)可分解為 k k k 個外積矩陣的和&#x…

設計模式-創建型模式(詳解)

創建型模式 單例模式 一個類只允許創建一個對象,稱為單例。 單例體現:配置類、連接池、全局計數器、id生成器、日志對象。 懶漢式 (線程不安全) 單例:【不可用】 用到該單例對象的時候再創建。但存在很大問題,單線程下這段代…

什么是BI?有哪些應用場景

BI(Business Intelligence,商業智能)是通過技術手段對海量業務數據進行采集、整合、分析和可視化的過程,旨在幫助企業從數據中獲取洞察,支持決策。其核心是通過工具(如Quick BI)將原始數據轉化為…

從零開始:使用Vite和Vue.js搭建一個空項目

進入node.js官網 https://nodejs.org/zh-cn 下載node.js 點擊進行安裝, 完成之后,按住shift鼠標右鍵,打開powershell窗口 輸入node -v ,出現版本號就是成功了 node -v 接下來,打開設置,搜索開發者設置&…

Redis 核心數據類型及典型使用場景詳解

在日常開發中,Redis 不僅是緩存利器,更是一套高性能的數據結構服務。你是否真的了解 Redis 提供的五種核心數據類型?它們各自的底層結構和適用場景又有哪些差異?本篇博客將深入解析 Redis 的數據類型及其典型應用,助你…

threejs webVR獲取相機正前方向量

通常獲取相機正前方可以使用camera.getWorldDirection(new Vector3()) 函數來得到,但是在threejs0.139.2版本中進入VR后使用上面函數獲取的數據是固定不變的,不管是否旋轉了頭盔,經過一番研究發現必須使用renderer.xr.getCamera() 此函數獲取…

華為OD-2024年E卷-字符統計及重排[100分] -- python

問題描述: 給出一個僅包含字母的字符串,不包含空格,統計字符串中各個字母(區分大小寫)出現的次數,并按照字母出現次數從大到小的順序輸出各個字母及其出現次數。如果次數相同,按照自然順序進行排序,且小寫…

MCP(模型上下文協議)協議和Http協議對比

MCP(Model Context Protocol,模型上下文協議)和 HTTP(HyperText Transfer Protocol,超文本傳輸協議)是兩種定位完全不同的協議,主要區別如下: 1. 核心定位 HTTP 通用網絡通信協議&am…

C++打印乘法口訣表

int main()??&#xff1a; 這是C 程序的入口點。每個C 程序都必須有一個 main 函數&#xff0c;程序從這里開始執行。 ??外層 for 循環??&#xff1a; for (int i 1; i < 10; i) { int i 1&#xff1a;定義并初始化循環變量 i 為 1。這里的 i 代表乘法表中的行…

RoGBAG 與 MCAP

RoGBAG 和 MCAP 都是機器人領域常用的二進制數據格式&#xff0c;用于存儲傳感器數據、控制命令和狀態信息。兩者主要區別在于&#xff1a; RoGBAG&#xff1a;ROS 1/2 的標準日志格式&#xff0c;采用 LZF/LZ4 壓縮&#xff0c;適合中小型數據集 MCAP&#xff1a;新一代機器人…

Ubuntu 空間占用情況排查常用命令

查看當前目錄總大小及子目錄占用詳情 du -sh * | sort -hr ??du??&#xff1a;磁盤使用統計命令??-s??&#xff1a;顯示每個參數的總計&#xff08;不遞歸子目錄&#xff09;??-h??&#xff1a;以人類可讀格式&#xff08;KB/MB/GB&#xff09;顯示??*??&…

C語言編譯優化實戰與技巧

一.概述 1.C語言編譯優化介紹 C語言編譯優化是提升程序性能的核心手段&#xff0c;涉及從源代碼到機器碼的多層次轉換&#xff0c;下面從優化級別、常用技術、內存管理、指令調度等多個維度詳細介紹。 2.編譯器優化等級&#xff08;GCC/Clang&#xff09; 二.常用優化技術 1…

Seq2Seq理解

Seq2Seq理解 寫在前面&#xff1a;學習Seq2Seq由于前面底子沒打好導致理解起來非常困難&#xff0c;今天索性全部搞懂邏輯部分&#xff0c;后續我會把所學的一些算法全部以理解代碼的形式發布出來&#xff0c;課程代碼內容全部來自李沐老師的視頻&#xff0c;再次感謝&#xf…