Docker部署tenine實(shí)現(xiàn)后端應(yīng)用的高可用與負(fù)載均衡(推薦)
采用Docker方式的Tengine 和 keepalived 組合模式可以實(shí)現(xiàn)小應(yīng)用場景的高可用負(fù)載均衡需求
網(wǎng)絡(luò)架構(gòu)
一、環(huán)境準(zhǔn)備
兩臺物理主機(jī): 22.04.3-Ubuntu Linux
Docker版本:24.0.9
3個IP地址 192.168.30.191 192.168.30.192 192.168.30.190(作為虛擬IP)
二、軟件安裝
兩臺機(jī)器上都執(zhí)行
1. 下載Tenine鏡像
docker pull axizdkr/tengine:3.1.0
本次鏡像來源 https://github.com/Axizdkr/tengine
2. 下載Keepalived鏡像
docker pull osixia/keepalived:2.0.20
3. 制作SpringBoot鏡像
根據(jù)各自應(yīng)用需要創(chuàng)建鏡像
三、軟件配置
兩臺機(jī)器上都執(zhí)行
1. 創(chuàng)建應(yīng)用容器
假設(shè) SpringBoot 各物理主機(jī)上創(chuàng)建了,SpringBoot端口為 9166
2. 代理訪問應(yīng)用
使用Tengine 代理訪問SpringBoot
創(chuàng)建必要映射目錄
mkdir -p /apps/tengine/cfg /apps/tengine/logs /appstengine/vue
在目錄 /apps/tengine/cfg 創(chuàng)建 nginx.conf
#user nobody; worker_processes 8; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; # 當(dāng)設(shè)置為 on 時,Nginx 會在發(fā)送響應(yīng)時,盡量將數(shù)據(jù)合并成一個大的 TCP 數(shù)據(jù)包進(jìn)行發(fā)送。這可以減少 TCP 包的數(shù)量,從而提高網(wǎng)絡(luò)傳輸效率,尤其是在發(fā)送大文件時 #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; gzip on; gzip_min_length 2k; gzip_buffers 4 32k; gzip_http_version 1.1; gzip_comp_level 6; gzip_types text/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml; gzip_vary on; gzip_proxied any; # 將Nginx代理的所有請求實(shí)體的大小限制為20m client_max_body_size 100m; upstream cluster1 { server 192.168.30.191:9166; server 192.168.30.192:9166; check interval=3000 rise=2 fall=5 timeout=1000 type=http; check_http_send "HEAD / HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; error_page 404 /404.html; # 統(tǒng)一走代理訪問vue前端頁面 xxxx/dist location ~ /([A-Za-z0-9_-]+)/dist { root /vue/; index index.html index.htm; } #代理SpringBoot訪問 location /api/ { proxy_redirect off; 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_set_header X-Nginx-Proxy true; proxy_pass http://cluster1/; } location /nginx_basic_status { stub_status on; } location /nginx_check_status { check_status; } # 主要用于keepalived 檢查 location /health_check { access_log off; return 200 "OK"; } } }
有關(guān)Tengine的 健康檢查配置說明,請參考官方文檔:
https://tengine.taobao.org/document_cn/http_upstream_check_cn.html
注意:
Tengine 健康檢查會不停的訪問 http://192.168.30.191:9166/ http://192.168.30.192:9166/ 這兩個地址
,如果你的SpringBoot應(yīng)用有安全攔截(Shiro 或者 SpringSecurity)記得放行這個URL
創(chuàng)建Tengine容器
sudo docker run --network=host \ --privileged \ --restart=always \ --name tengine \ -v /apps/tengine/cfg/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /apps/tengine/logs:/var/log/nginx \ -v /apps/tengine/vue:/vue/ \ -d axizdkr/tengine:3.1.0
3. 創(chuàng)建Keepalived
在 兩臺主機(jī)上 創(chuàng)建必要映射目錄
mkdir -p /apps/keepalived
在主機(jī)191目錄下創(chuàng)建
在目錄/apps/keepalived下創(chuàng)建配置文件 keepalived.conf 內(nèi)容如下:
vrrp_script chk_nginx { script "curl -s http://172.17.0.1/health_check" interval 2 weight -3 } vrrp_instance VI_2 { state MASTER interface enp10s0 virtual_router_id 54 priority 101 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.30.190 } track_script { chk_nginx } }
在主機(jī)192目錄下創(chuàng)建
在目錄/apps/keepalived下創(chuàng)建配置文件 keepalived.conf 內(nèi)容如下:
vrrp_script chk_nginx { script "curl -s http://172.17.0.1/health_check" interval 2 weight -3 } vrrp_instance VI_2 { state BACKUP interface enp9s0 virtual_router_id 54 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.30.190 } track_script { chk_nginx } }
主要是如下幾個變量要注意:
interval 2 每隔2秒執(zhí)行一次
weight -5 腳本結(jié)果導(dǎo)致的優(yōu)先級變更,檢測失?。_本返回非0)則優(yōu)先級減5
fall 2 #檢測連續(xù)2次失敗才算確定是真失敗。會用weight減少優(yōu)先級(1-255之間) 默認(rèn)值為 3
rise 1 #檢測1次成功就算成功。但不修改優(yōu)先級 默認(rèn)值為 2
interface 當(dāng)前節(jié)點(diǎn)服務(wù)器的網(wǎng)卡名稱
priority 優(yōu)先級,每一個節(jié)點(diǎn)上不一樣
virtual_ipaddress 虛擬ip
virtual_router_id 共享相同虛擬IP的節(jié)點(diǎn)上該參數(shù)值必須一樣 ,
keepalived可以代理多個虛擬IP,每一個虛擬IP對應(yīng)的virtual_router_id值不可一樣。
state 指定當(dāng)前keepalived的初始狀態(tài),這個可用是 MASTER 或者 BACKUP ,如果是BACKUP 則作為從節(jié)點(diǎn),但是這個值會根據(jù)監(jiān)控腳本運(yùn)行狀態(tài)改變優(yōu)先級從而導(dǎo)致狀MASTER /BACKUP 態(tài)切換
三臺主機(jī)上執(zhí)行:
docker run -d --name keepalived \ --cap-add=NET_ADMIN \ --cap-add=NET_BROADCAST \ --cap-add=NET_RAW \ --net=host \ -e KEEPALIVED_INTERFACE=eth0 \ -v /apps/keepalived/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \ osixia/keepalived:2.0.20 --loglevel debug --copy-service
變量 KEEPALIVED_INTERFACE 是指當(dāng)前節(jié)點(diǎn)服務(wù)器的網(wǎng)卡名稱,如果不想開啟debug模式去掉–loglevel debug
4. 測試高可用
兩臺都啟動了keepalived后,目前 192.168.30.190 IP應(yīng)該是綁定在 191 這臺物理主機(jī)上,
可以 瀏覽器訪問 http://192.168.30.190/nginx_check_status
可以看到如下頁面顯示:
192.168.30.190 是 keepalived的虛擬IP, 然后可以訪問SpringBoot應(yīng)用接口看下是否負(fù)載均衡了
關(guān)閉 191上面的SpringBoot 看下 訪問情況
關(guān)閉 191 上面的 Tengine 看下 訪問情況
到此這篇關(guān)于Docker部署tenine實(shí)現(xiàn)后端應(yīng)用的高可用與負(fù)載均衡的文章就介紹到這了,更多相關(guān)Docker部署tenine內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- docker安裝nginx實(shí)現(xiàn)對springboot項(xiàng)目的負(fù)載均衡的操作方法
- docker swam集群如何實(shí)現(xiàn)負(fù)載均衡
- Docker安裝Nacos容器并根據(jù)Nginx實(shí)現(xiàn)負(fù)載均衡
- docker搭建nginx實(shí)現(xiàn)負(fù)載均衡的示例代碼
- 基于Docker部署Tomcat集群、 Nginx負(fù)載均衡的問題小結(jié)
- docker swarm外部驗(yàn)證負(fù)載均衡時不生效的解決方案
- Docker Nginx容器和Tomcat容器實(shí)現(xiàn)負(fù)載均衡與動靜分離操作
- 使用Docker Compose 實(shí)現(xiàn)nginx負(fù)載均衡的方法步驟
- 詳解Docker Swarm服務(wù)發(fā)現(xiàn)和負(fù)載均衡原理
- 詳解利用nginx和docker實(shí)現(xiàn)一個簡易的負(fù)載均衡
相關(guān)文章
Docker安裝Redis并使用Another?Redis?Desktop?Manager連接的方法
Redis?是一個使用C語言編寫的、開源的(遵守?BSD?協(xié)議)、高性能的、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value的NoSQL數(shù)據(jù)庫,這篇文章主要介紹了Docker安裝Redis并使用Another?Redis?Desktop?Manager連接,需要的朋友可以參考下2022-09-09基于Kubernetes和Docke實(shí)現(xiàn)留言簿案例
這篇文章主要介紹了基于Kubernetes和Docke實(shí)現(xiàn)留言簿案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10