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

 更新时间:2024年09月13日 09:55:32   作者:小时候的阳光  
采用Docker部署Tengine和Keepalived,实现了一种适用于小型应用场景的高可用负载均衡解决方案,本方案需要两台Ubuntu服务器、Docker软件以及三个IP地址,适合需要简易而可靠的负载均衡和高可用性的小型应用部署,感兴趣的朋友跟随小编一起看看吧

采用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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用Docker作为PaaS的替代方案是否完美无缺

    用Docker作为PaaS的替代方案是否完美无缺

    Docker的出现似乎又带来了一种新的选择,而且对于开发者来说更加灵活、便捷、易用。既然用户可以直接在Docker上运行,PaaS是否还有应用场景?面对企业繁杂的应用环境,用Docker作为PaaS的替代方案是否完美无缺
    2016-11-11
  • docker-compose快速搭建docker私有仓库的步骤

    docker-compose快速搭建docker私有仓库的步骤

    这篇文章主要介绍了docker-compose快速搭建docker私有仓库的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 数据卷(Data Volumes)及dockefile详解

    数据卷(Data Volumes)及dockefile详解

    在生产环境中使用Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作,今天给大家介绍下数据卷(Data Volumes)及dockefile的相关知识,感兴趣的朋友一起看看吧
    2023-01-01
  • docker创建中间件环境的实现步骤

    docker创建中间件环境的实现步骤

    本文主要介绍了docker创建中间件环境的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • 让非root用户构建Docker镜像的三种方法

    让非root用户构建Docker镜像的三种方法

    在默认情况下,Docker 需要 root 权限或 sudo 才能运行,这对于日常开发和 CI/CD 流水线可能不够方便,那么,如何让 非 root 用户 也能构建和运行 Docker 容器呢?本篇文章将介绍 三种方法 来实现这一目标,需要的朋友可以参考下
    2025-04-04
  • 云原生自动化应用于docker仓库私有凭据secret创建

    云原生自动化应用于docker仓库私有凭据secret创建

    这篇文章主要为大家介绍了云原生自动化应用于docker仓库私有凭据secret创建,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 基于Docker部署Dubbo+Nacos服务的过程

    基于Docker部署Dubbo+Nacos服务的过程

    这篇文章主要介绍了基于Docker部署Dubbo+Nacos服务,本文介绍基于 Docker 部署一套 Dubbo + Nacos 的微服务环境,并解决容器里的 IP 及端口的访问问题,需要的朋友可以参考下
    2023-02-02
  • 在docker上安装运行mysql实例

    在docker上安装运行mysql实例

    Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。
    2017-01-01
  • 一台虚拟机基于docker搭建大数据HDP集群的思路详解

    一台虚拟机基于docker搭建大数据HDP集群的思路详解

    这篇文章主要介绍了一台虚拟机基于docker搭建大数据HDP集群 ,本篇文章主要讲了大数据集群搭建的架构设计和实现思路部分,后面文章会探讨上层应用的构建,需要的朋友可以参考下
    2022-11-11
  • docker中搭建overlay 网络实验环境

    docker中搭建overlay 网络实验环境

    这篇文章主要介绍了docker中搭建overlay 网络实验环境的相关资料,需要的朋友可以参考下
    2017-08-08

最新评论