欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Docker部署tenine实现后端应用的高可用与负载均衡

Docker部署tenine实现后端应用的高可用与负载均衡

2024/10/23 0:26:58 来源:https://blog.csdn.net/gzt19881123/article/details/142023680  浏览:    关键词:Docker部署tenine实现后端应用的高可用与负载均衡

采用Docker方式的Tengine 和 keepalived 组合模式可以实现小应用场景的高可用负载均衡需求

目录

  • 网络架构
  • 一、环境准备
  • 二、软件安装
    • 1. 下载Tenine镜像
    • 2. 下载Keepalived镜像
    • 3. 制作SpringBoot镜像
  • 三、软件配置
    • 1. 创建应用容器
    • 2. 代理访问应用
    • 3. 创建Keepalived
    • 4. 测试高可用

网络架构

在这里插入图片描述

一、环境准备

两台物理主机: 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代理的所有请求实体的大小限制为20mclient_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 2weight -3
}vrrp_instance VI_2 {state MASTERinterface enp10s0virtual_router_id 54priority 101advert_int 1authentication {auth_type PASSauth_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 2weight -3
}vrrp_instance VI_2 {state BACKUPinterface enp9s0virtual_router_id 54priority 100advert_int 1authentication {auth_type PASSauth_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 看下 访问情况

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com