Docker部署tenine实现后端应用的高可用与负载均衡(推荐)
作者:小时候的阳光
采用Docker方式的Tengine 和 keepalived 组合模式可以实现小应用场景的高可用负载均衡需求
网络架构
一、环境准备
两台物理主机: 22.04.3-Ubuntu Linux
Docker版本:24.0.9
3个IP地址 192.168.30.191 192.168.30.192 192.168.30.190(作为虚拟IP)
二、软件安装
两台机器上都执行
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镜像
根据各自应用需要创建镜像
三、软件配置
两台机器上都执行
1. 创建应用容器
假设 SpringBoot 各物理主机上创建了,SpringBoot端口为 9166
2. 代理访问应用
使用Tengine 代理访问SpringBoot
创建必要映射目录
mkdir -p /apps/tengine/cfg /apps/tengine/logs /appstengine/vue
在目录 /apps/tengine/cfg 创建 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; # 当设置为 on 时,Nginx 会在发送响应时,尽量将数据合并成一个大的 TCP 数据包进行发送。这可以减少 TCP 包的数量,从而提高网络传输效率,尤其是在发送大文件时 #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代理的所有请求实体的大小限制为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; # 统一走代理访问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"; } } }
有关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应用有安全拦截(Shiro 或者 SpringSecurity)记得放行这个URL
创建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. 创建Keepalived
在 两台主机上 创建必要映射目录
mkdir -p /apps/keepalived
在主机191目录下创建
在目录/apps/keepalived下创建配置文件 keepalived.conf 内容如下:
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 } }
在主机192目录下创建
在目录/apps/keepalived下创建配置文件 keepalived.conf 内容如下:
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秒执行一次
weight -5 脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级减5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) 默认值为 3
rise 1 #检测1次成功就算成功。但不修改优先级 默认值为 2
interface 当前节点服务器的网卡名称
priority 优先级,每一个节点上不一样
virtual_ipaddress 虚拟ip
virtual_router_id 共享相同虚拟IP的节点上该参数值必须一样 ,
keepalived可以代理多个虚拟IP,每一个虚拟IP对应的virtual_router_id值不可一样。
state 指定当前keepalived的初始状态,这个可用是 MASTER 或者 BACKUP ,如果是BACKUP 则作为从节点,但是这个值会根据监控脚本运行状态改变优先级从而导致状MASTER /BACKUP 态切换
三台主机上执行:
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 是指当前节点服务器的网卡名称,如果不想开启debug模式去掉–loglevel debug
4. 测试高可用
两台都启动了keepalived后,目前 192.168.30.190 IP应该是绑定在 191 这台物理主机上,
可以 浏览器访问 http://192.168.30.190/nginx_check_status
可以看到如下页面显示:
192.168.30.190 是 keepalived的虚拟IP, 然后可以访问SpringBoot应用接口看下是否负载均衡了
关闭 191上面的SpringBoot 看下 访问情况
关闭 191 上面的 Tengine 看下 访问情况
到此这篇关于Docker部署tenine实现后端应用的高可用与负载均衡的文章就介绍到这了,更多相关Docker部署tenine内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!