Docker Nginx 負載均衡搭建(服務宕機-配置高可用) - 附(Python案例,其它語言同理)

目錄

一 . 概要

1. 什么是負載均衡

2.?負載均衡有哪些優勢?

(1)應用程序可用性

(2)應用程序可擴展性

(3)應用程序安全

(4)應用程序性能

3 . Nginx負載均衡調度策略

二 . 搭建案例

1. 創建項目目錄

2. 創建三個py文件,啟動三個服務

3. 編寫 Nginx.conf

4.?編寫 Dockerfile

三 .?鏡像打包運行

四 .?個人小結


一 . 概要

1. 什么是負載均衡

負載均衡是在支持應用程序的資源池中平均分配網絡流量的一種方法。現代應用程序必須同時處理數百萬用戶,并以快速、可靠的方式將正確的文本、視頻、圖像和其他數據返回給每個用戶。為了處理如此高的流量,大多數應用程序都有許多資源服務器,它們之間包含很多重復數據。負載均衡器是位于用戶與服務器組之間的設備,充當不可見的協調者,確保均等使用所有資源服務器。

2.?負載均衡有哪些優勢?

目的:提升吞吐率, 提升請求性能, 提?高容災

負載均衡可以定向和控制應用程序服務器與其訪客或客戶端之間的互聯網流量。因此,它可提高應用程序的可用性、可擴展性、安全性和性能。

(1)應用程序可用性

服務器故障或維護可能會增加應用程序停機時間,使訪客無法訪問您的應用程序。負載均衡器可以通過以下方式提高您的系統的容錯能力:自動檢測服務器問題并將客戶端流量重定向到可用服務器。您可以使用負載均衡來簡化以下任務:

  • 運行應用程序服務器維護或升級而無需使應用程序停機
  • 為備份站點提供自動災難恢復
  • 執行運行狀況檢查并防止出現可能導致停機的問題

(2)應用程序可擴展性

您可以使用負載均衡器在多個服務器之間智能地定向網絡流量。您的應用程序可以處理數千個客戶端請求,因為負載均衡會執行以下操作:

  • 防止任何一臺服務器出現流量瓶頸
  • 預測應用程序流量,以便您可以在需要時添加或移除不同服務器
  • 為您的系統增加冗余度,使您可以放心擴展

(3)應用程序安全

負載均衡器具有多項內置的安全功能,可為您的互聯網應用程序的安全保駕護航。它們是應對分布式拒絕服務攻擊的有用工具,在這種攻擊中,攻擊者會用數百萬個并發請求淹沒應用程序服務器,從而導致服務器故障。負載均衡器還可以執行以下操作:

  • 監控流量并阻止惡意內容
  • 將攻擊流量自動重定向到多個后端服務器,以最大限度減少影響
  • 通過一組網絡防火墻路由流量,以提高安全性

(4)應用程序性能

負載均衡器通過增加響應時間和減少網絡延遲來提高應用程序性能。它們可以執行諸如以下幾項關鍵任務:

  • 在服務器之間平均分配負載以提高應用程序性能
  • 將客戶端請求重定向到地理位置較近的服務器以減少延遲
  • 確保物理和虛擬計算資源的可靠性和性能

3 . Nginx負載均衡調度策略

調度算法概述
輪詢逐一輪詢,默認方式
weight加權輪詢,weight越大,分配的幾率越高
ip_hash按照訪問IP的hash結果分配,會導致來自同一IP的請求訪問固定的一個后臺服務器
fair按后端服務器的響應時間來分配請求,響應時間短的優先分配。
url_hash按照訪問URL的hash結果分配
1、輪詢(默認)
每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。upstream backserver {server 192.168.0.14;server 192.168.0.15;
}
2、權重 weight
指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況。upstream backserver {server 192.168.0.14 weight=3;server 192.168.0.15 weight=7;
}
3、ip_hash( IP綁定)
上述方式存在一個問題就是說,在負載均衡系統中,假如用戶在某臺服務器上登錄了,那么該用戶第二次請求的時候,因為我們是負載均衡系統,每次請求都會重新定位到服務器集群中的某一個,那么已經登錄某一個服務器的用戶再重新定位到另一個服務器,其登錄信息將會丟失,這樣顯然是不妥的。我們可以采用ip_hash指令解決這個問題,如果客戶已經訪問了某個服務器,當用戶再次訪問時,會將該請求通過哈希算法,自動定位到該服務器。每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。upstream backserver {ip_hash;server 192.168.0.14:88;server 192.168.0.15:80;
}
4、fair(第三方插件)
按后端服務器的響應時間來分配請求,響應時間短的優先分配。upstream backserver {server server1;server server2;fair;
}
5、url_hash(第三方插件)
按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。upstream backserver {server squid1:3128;server squid2:3128;hash $request_uri;hash_method crc32;
}

二 . 搭建案例

1. 創建項目目錄

mkdir disaster_recovery

2. 創建三個py文件,啟動三個服務

main1.py ,main2.py,main3.py? 端口號分別為 4000,4001,4002

from flask_cors import CORS
from flask import Response, jsonify, Flask, request# 建立flask實例
app = Flask(__name__)
# 注冊CORS, "/*" 允許訪問所有api
CORS(app, resources=r'/*')# 獲取 Flask 應用的根路徑
root_path = app.root_path# 解決中文亂碼
app.config['JSON_AS_ASCII'] = False@app.route('/', methods=['GET', 'POST', 'DELETE', 'PUT', 'CATCH'])
def Start():print('啟動成功!')return jsonify({'code': 200,'msg':'測試'})@app.route('/start1', methods=['GET', 'POST', 'DELETE', 'PUT', 'CATCH'])
def Start1():print('啟動成功Start1!')return jsonify({'code': 200,'msg':'測試'})# 調用實例對象
if __name__ == '__main__':app.run(debug=True,host='0.0.0.0', port=4000)

3. 編寫 Nginx.conf

這里Nginx監聽80端口,反向代理到本地系統(也可以使用其他服務器ip及端口)的4000,4001,4002端口

這里我們使用負載均衡方案:權重,如果有其他需求,可以按照其他的方案進行修改:

events {worker_connections 1024;
}http {upstream servers_list {server 192.168.14.93:4000 weight=3;server 192.168.14.93:4001 weight=5;server 192.168.14.93:4002 weight=2;}server {listen 80;location / {proxy_pass http://servers_list;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# 服務宕機-配置proxy_connect_timeout 1;}}
}# worker_connections,單個工作進程可以允許同時建立外部連接的數量  數字越大,能同時處理的連接越多
# 1.默認:worker_connections: 1024
# 2.調大:worker_connections: 100000,(調大到10萬連接)
# upstream servers_list { ... }: 定義了一個名為backend的上游服務器組,包含了要負載均衡的后端服務器列表。
# server { ... }: 定義了一個NGINX服務器塊。
# listen 80;: 監聽80端口。
# location / { ... }: 定義了一個用于處理所有請求的位置塊。
# proxy_pass http://servers_list;: 將請求轉發到名為backend的上游服務器組中定義的服務器上,實現負載均衡。
# proxy_set_header: 設置HTTP請求頭,確保后端服務器能夠獲取到客戶端的真實IP等信息。
# 在這個配置中,NGINX會將來自客戶端的請求負載均衡地轉發到backend1.example.com、backend2.example.com和backend3.example.com中的一個。

?proxy_connect_timeout 1;

nginx提供了宕機容錯機制,當一個后端服務器由于服務器故障、網絡問題等原因不能提供服務時, nginx可以通過配置超時,超過超時時間以后,則跳過當前服務器,請求下一臺服務器
在nginx.conf文件中 配置 proxy_connect_timeout 1? 連接超過1s 則跳過當前輪詢

4.?編寫 Dockerfile

FROM yankovg/python3.8.2-ubuntu18.04# 設置時區為中國標準時間
ENV TZ=Asia/Shanghai# 安裝NGINX
RUN apt-get update && apt-get install -y nginx# 配置NGINX
COPY nginx.conf /etc/nginx/nginx.conf# 暴露端口
EXPOSE 80# 啟動NGINX
CMD ["nginx", "-g", "daemon off;"]

這里基礎鏡像選擇預裝了Python3.8的Ubuntu18,兼具了小體積和可擴展的特性,添加apt-get的安裝源后,安裝Nginx。

最后,將nginx.conf拷貝到對應的配置路徑中,啟動Nginx服務。

三 .?鏡像打包運行

在項目根目錄的終端內運行命令打包鏡像:

docker build -t . disaster_recovery_task

?首次編譯等待小會,進行下載

[+] Building 0.5s (8/8) FINISHED                                                                         docker:default=> [internal] load .dockerignore                                                                                  0.0s=> => transferring context: 2B                                                                                    0.0s=> [internal] load build definition from Dockerfile                                                               0.0s=> => transferring dockerfile: 1.25kB                                                                             0.0s=> [internal] load metadata for docker.io/yankovg/python3.8.2-ubuntu18.04:latest                                  0.5s=> [1/3] FROM docker.io/yankovg/python3.8.2-ubuntu18.04@sha256:811ad1ba536c1bd2854a42b5d6655fa9609dce1370a6b6d48  0.0s=> [internal] load build context                                                                                  0.0s=> => transferring context: 1.58kB                                                                                0.0s=> CACHED [2/3] RUN apt-get update && apt-get install -y nginx                                                    0.0s=> [3/3] COPY nginx.conf /etc/nginx/nginx.conf                                                                    0.0s=> exporting to image                                                                                             0.0s=> => exporting layers                                                                                            0.0s=> => writing image sha256:72c9a8f86c0c14d77a51d5542b7877c2d5e8b12c72a12a4b7708f7e15263ed05                       0.0s=> => naming to docker.io/library/disaster_recovery_task                                                          0.0sWhat's Next?View summary of image vulnerabilities and recommendations → docker scout quickview

?打包成功后,運行命令查看鏡像信息:

docker images

?可以看到鏡像總大小不到1g:

REPOSITORY                          TAG              IMAGE ID       CREATED              SIZE
disaster_recovery_task              latest           72c9a8f86c0c   About a minute ago   784MB

?接著讓我們來啟動容器

docker run  -d  -p 81:80 --name disaster_recovery_task  disaster_recovery_task

?顯示正在運行

CONTAINER ID   IMAGE                         COMMAND                   CREATED          STATUS          PORTSNAMES
2925cdd6a0f8   disaster_recovery_task        "nginx -g 'daemon of…"   33 seconds ago   Up 32 seconds   0.0.0.0:81->80/tcp       disaster_recovery_task

此時我們打開瀏覽器訪問 http://127.0.0.1:81

  • 訪問五次結果?
端口次數
40002
40012
40021

四 .?個人小結

nginx負載均衡是提高網站性能和可靠性的重要手段之一,合理配置和管理可以有效地提升網站的運行效率和用戶體驗,大家也可以嘗試使用監控軟件來對nginx以及服務進行宕機拉起

誠然,在我們程序開發中,大部分時間都是在書寫代碼,思考邏輯與數據清洗處理,但也要多了解其他東西,動手操作,增加自己的見識與理解,漫漫長路,學海無涯~(實踐知真知)加油!

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

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

相關文章

Java高級 / 架構師 場景方案 面試題(二)

1.雙十一億級用戶日活統計如何用 Redis快速計算 在雙十一這種億級用戶日活統計的場景中,使用Redis進行快速計算的關鍵在于利用Redis的數據結構和原子操作來高效地統計和計算數據。以下是一個基于Redis的日活統計方案: 選擇合適的數據結構: …

核密度分析

一.算法介紹 核密度估計(Kernel Density Estimation)是一種用于估計數據分布的非參數統計方法。它可以用于多種目的和應用,包括: 數據可視化:核密度估計可以用來繪制平滑的密度曲線或熱力圖,從而直觀地表…

【DOCKER】隨手記

目錄 1. 安裝1.1 LINUX1.2 Windows 2. 常用配置2.1 普通權限運行2.2 開機自啟動2.3 3 更換Docker鏡像源2.4 更改默認存儲位置 3. 顯示帶UI的軟件4. 基于DOCKER的服務4.1 FTP4.2 Portainer4.3 Watchtower4.4 SiYuan4.5 GitLab4.5.1 創建容器4.5.2 克隆路徑問題4.5.3 獲取默認密碼…

win系統下安裝php8.3版本并配置環境變量的詳細教程

本篇文章主要講解在win系統下安裝和配置php8.3版本,并配置環境變量的詳細教程。 日期:2024年2月22日 作者:任聰聰 一、下載php8.3版本包 php8.3版本官方下載地址:https://windows.php.net/download#php-8.3 步驟一、打開下載地址…

【Unity】Unity與安卓交互

問題描述 Unity和安卓手機進行交互,是我們開發游戲中最常見的場景。本教程將從一個簡單的例子來演示一下。 本教程需要用到Android Studio2021.1.1 1.Android Studio新建一個工程 2.選擇Empty Activity 然后點擊Next 3.點擊Finish完成創建 4.選擇File-New-New Mo…

【python 3.9.18】windowns安裝版

因為這個版本官方未提供,所以需要自己編譯出來,其他沒有的版本可以依據下面的進行生成一個exe也可行。 成品: https://gitee.com/greatLong/python-3.9.18/tree/master/python-3.9.18/PCbuild/amd64 1、環境準備 需要使用到 這里面還需要選…

【MATLAB GUI】 5. 圖像處理菜單(菜單編輯器)

看B站up主freexyn的freexyn編程實例視頻教程系列36Matlab GUI的學習筆記 任務要求設計一個圖像處理菜單,實現圖像的打開導入、灰度處理、存儲等功能 修改過文件名,所以運行的時候會有一點點報錯,但是不影響運行 打開工具欄下邊的菜單編輯器…

開窗Window和WindowAll的區別

在 Apache Flink 流處理框架中,窗口操作是處理流數據的重要部分。Flink 提供了時間窗口、計數窗口等多種窗口類型,用于將數據分割成不同的窗口進行聚合或其他處理。 Window 和 WindowAll 是 Flink 中窗口操作的兩種不同方式,它們分別對應不同…

GIT倉庫轉移--攜帶原分支及提交記錄

背景:最近公司倉庫位置需要移動,想保留原有的倉庫分支和提交記錄 操作: 目的位置新建倉庫(要保證創建無誤)原倉庫 git clone 到本地,git pull 保證代碼最新找到原倉庫.git/config 文件,修改 rem…

EPSON機器人與PC上位機軟件C#網絡TCP通訊

項目背景: 在非標設備PIN焊接機中用到了愛普生機器人。上位機軟件使用c#wpf開發。主要邏輯在上位機中。用愛普生機器人給焊接平臺實現自動上下料。 通訊方式:網絡TCP通訊,Socket 角色:上位機為服務端,機器人為客戶端…

Linux|centos7|錄屏神器asciinema的編譯安裝和離線化安裝使用

前言: asciinema這個錄屏軟件前面有一點研究,但它的部署安裝比較麻煩,雖然此軟件的安裝部署方式是很多的,比如yum安,apt,brew,docker,pip,rust編譯,docker等…

創建一個基于Node.js的實時聊天應用

在當今數字化社會,實時通訊已成為人們生活中不可或缺的一部分。無論是在社交媒體平臺上與朋友交流,還是在工作場合中與同事協作,實時聊天應用都扮演著重要角色。與此同時,Node.js作為一種流行的后端技術,為開發者提供了…

CrossOver虛擬機軟件2024有哪些功能?最新版本支持哪些游戲?

CrossOver由codewaver公司開發的類虛擬機軟件,目的是使linux和Mac OS X操作系統和window系統兼容。CrossOver不像Parallels或VMware的模擬器,而是實實在在Mac OS X系統上運行的一個軟件。CrossOvers能夠直接在Mac上運行Windows軟件與游戲,而不…

Java架構師之路七、大數據:Hadoop、Spark、Hive、HBase、Kafka等

目錄 Hadoop: Spark: Hive: HBase: Kafka: Java架構師之路六、高并發與性能優化:高并發編程、性能調優、線程池、NIO、Netty、高性能數據庫等。-CSDN博客Java架構師之路八、安全技術:Web安…

[前端]開啟VUE之路-NODE.js版本管理

VUE前端開發框架,以Node.js為底座。用歷史性的項目來學習,為了降低開發環境的影響因素,各種版本號最好能一致。前端項目也是一樣。為了項目能夠快速啟動,Node.js的版本管理,可以帶來很大的便利(node.js快速…

2023年全年回顧

本年度比較折騰,整體而言可以分為兩個大的階段,簡單而言,轉崗前和轉崗后。 個人收獲 據說程序員有幾大浪漫,比如操作系統、編譯器、瀏覽器、游戲引擎等。 之前參與過游戲引擎,現在有機會參與存儲業務交付&#xff0c…

LangChain支持嗶哩嗶哩視頻總結

是基于LangChain框架下的開發,所以最開始請先 pip install Langchain pip install bilibili-api-python 技術要點: 使用Langchain框架自帶的Document loaders 修改BiliBiliLoader的源碼,自帶的并不支持當前b站的視頻加載 源碼文件修改&a…

如何在 Emacs Prelude 上使用 graphviz 的 dot 繪制流程圖

文章目錄 如何在Emacs Prelude上使用graphviz的dot繪制流程圖 <2022-08-23 周二> 如何在Emacs Prelude上使用graphviz的dot繪制流程圖 標題中的Emacs Prelude是指&#xff1a;bbatsov/prelude&#xff0c;在custom.el中添加即可&#xff1a; ;;; graphviz (prelude-re…

【高德地圖】Android高德地圖繪制標記點Marker

&#x1f4d6;第4章 Android高德地圖繪制標記點Marker ?繪制默認 Marker?繪制多個Marker?繪制自定義 Marker?Marker點擊事件?Marker動畫效果?Marker拖拽事件?繪制默認 Infowindow&#x1f6a9;隱藏InfoWindow 彈框 ?繪制自定義 InfoWindow&#x1f6a9;實現 InfoWindow…

Java 中 CopyOnWriteArrayList和CopyOnWriteArraySet

什么是CopyOnWriteArrayList和CopyOnWriteArraySet CopyOnWriteArrayList和CopyOnWriteArraySet都是Java并發編程中提供的線程安全的集合類。 CopyOnWriteArrayList是一個線程安全的ArrayList&#xff0c;其內部通過volatile數組和顯式鎖ReentrantLock來實現線程安全。它采用…