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代理的所有请求实体的大小限制为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 看下 访问情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/875358.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSP-J算法基础 树状结构与二叉树

文章目录 前言树状结构树状结构的基本概念:为什么需要树状结构?优点树状结构的示例 二叉树什么是二叉树?二叉树的类型什么样的树不是二叉树?二叉树的五种形态 完全二叉树相关概念完全二叉树的定义: 相关概念1. **高度&…

Xcode报错:No exact matches in reference to static method ‘buildExpression‘

Xcode报错1:No exact matches in reference to static method buildExpression Xcode报错2:Type () cannot conform to View 这两个报错都是因为在SwiftUI的View的Body里面使用了ForEach循环,却没有在ForEach循环闭包的内部返回视图,而是做了…

数据库安全性控制

‍ 在当今信息化时代,数据库安全性 对于保护数据免受非法访问和损害至关重要。无论是个人数据还是企业机密,数据库安全性控制都能有效地防范潜在的威胁。本文将为你深入浅出地介绍数据库安全性控制的关键方法和机制,帮助你轻松掌握这一重要概…

数据库基础知识---------------------------(1)

数据库分类 关系型数据库 以表格方式存储数据 例子: MySQL、Oracle、DB2、SQLserver等 特点: SQL结构程度较高、安全性高、查询效率较低 非关系型数据库 以键值方式存储数据 例子: Redis、Hbase、MongoDB等 特点: 查询效率…

深度学习的零碎知识点

显卡内存 什么是显卡内存 简单来说就是,Windows 会在物理显存/「专用 GPU 内存」不够用或只有集成显卡的情况下,将物理内存 RAM 当作 GPU 的虚拟显存/「共享 GPU 内存」来使用。 什么是 Windows「共享 GPU 内存」,它与 VRAM 有什么不同 (s…

C# 使用Socket通信,新建WinForm服务端、客户端程序

一、新建WinForm Socket服务端程序 注:rtbReceviceMsg为RichTextBox控件 服务端程序、界面 服务端代码 public partial class Form1 : Form {public Form1(){InitializeComponent();}public virtual void TriggerOnUpdateUI(string message){if (this.InvokeRequir…

软件测试学习笔记丨Pytest的使用

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22158 1. 简介 pytest是一个成熟的全功能python测试框架测试用例的skip和xfail,自动失败重试等处理能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/ap…

Hive任务优化参数整理

Hive本身是个基于hdfs的结构化数据管理工具,虽然在后面的发展中允许底层接入其他的数据源,比如第三方数据服务这种基础架构,但是它从立意上来说,它不适合用来做高性能查询引擎,反而在传统离线数据仓库中它有着自身的优…

python 函数 封装

封装 函数的参数是:变量 def 函数(参数):print(参数)if __name__ __main__:函数(参数)函数(参数2)函数的参数是: 字典 import requests# 定义一个字典 data {} 地址 "https://webdriveruniversity.com/" 请求方法 getdata["url"…

科研绘图系列:R语言宏基因组PCoA图(PCoA plot)

介绍 PCoA(主坐标分析,也称为主轴分析)是一种多维统计技术,用于分析和可视化高维数据集,如宏基因组数据。在宏基因组学中,PCoA图用于展示样本之间的相似性和差异性,通常基于样本之间的距离或相似度矩阵。PCoA图说明: 样本间关系:PCoA图通过降维技术将高维数据投影到二…

RK3588开发板TF卡槽连接WIFI模组O9201SB

RK3588平台开发板有TF卡槽,可以做为SDIO WIFI连接接入点,本文以O9201SB WIFI模组接入配置。 一、O9201SB模组放于测试架上,底板具有SDIO接口可插入TF卡卡槽。 O9201SB为2T2R SDIO 13x15mm 支持sdio3.0的wifi6模组,支持DBDC1x1或DB…

数据中台 | 数据资源管理平台介绍

01 产品概述 数据资源的盘查、集成、存储、组织、共享等全方位管理能力,无论对于企业的数字化转型,还是对企业数据资产的开发、运营、交易及入表,都具有极为关键的作用。今天,小兵就来为大家介绍我们自研数据智能平台中的核心产品…

3D云渲染农场为何怎么贵?主要消耗成本介绍

随着对高质量3D动画的需求持续增长,云渲染农场对于旨在以高效速度生产高质量视觉效果的工作室来说变得至关重要。然而,用户经常想知道为什么渲染农场的价格如此之高,理解背后的原因可以帮助艺术家做出更好的选择。 什么是云渲染农场&#xff…

YOLO配合 PYQT做自定义虚拟电子围-自定义绘制多边形虚拟电子围栏

电子围栏标注以及显示 1、目标检测: YOLO可以识别检测物体,这是众所周知的。使用YOLO来做目标检测,并获取坐标信息。 2、电子围栏 比如在监控中,指定一块区域,如果有目标进入,则发出警报,并提…

计算机网络(一) —— 网络基础入门

目录 一,关于网络 二,协议 2.1 协议是什么,有什么用? 2.2 协议标准谁定的? 2.3 协议分层 2.4 OSI 七层模型 2.5 TCP/IP 四层模型 三,网络传输基本流程 3.1 局域网中两台主机通信* 3.2 报文的封装与…

[001-03-007].第07节:Redis中的事务

我的后端学习大纲 我的Redis学习大纲 1、Redis事务是什么: 1.可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化, 按顺序地串行化执行而不会被其他命令插入,不许加塞2.一个队列中,一次性、…

2009-2023年上市公司华证esg评级、评分年度数据(含细分项)

2009-2023年上市公司华证esg评级、评分年度数据(含细分项) 1、时间:2009-2023年 2、来源:整理自wind 3、指标:证券代码、年份、证券简称、评级日期、综合评级、综合得分、E评级、E得分、S评级、S得分、G评级、G得分…

How to see if openAI (node js) createModeration response “flagged“ is true

题意:如何查看 OpenAI (Node.js) createModeration 响应中的 "flagged" 是否为 true 问题背景: Using the OpenAI createModeration feature, I am trying to see if the string gets flagged or not. 使用 OpenAI 的 createModeration 功能…

基于开源WQ装备知识图谱的智能问答优化

基于笔者之前写的博客基础上:https://blog.csdn.net/zhanghan11366/article/details/142139488【基于开源WQ装备知识图谱的智能问答全流程构建】进行优化。 优化一、 解决你提出的多武器、多关系解析问题,并确保每个武器只匹配其对应的关系&#xff0c…

百元内真无线蓝牙耳机推荐有哪些?四大百元性价比品牌公开推荐

在当今这个科技迅速发展的时代,真无线蓝牙耳机以其便携性和自由度成为了许多人日常生活中不可或缺的配件,然而,面对市场上琳琅满目的产品,消费者往往感到眼花缭乱,难以抉择,百元内真无线蓝牙耳机推荐有哪些…