首页 > 其他分享 >Docker部署tenine实现后端应用的高可用与负载均衡

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

时间:2024-09-14 14:52:06浏览次数:14  
标签:负载 http log -- keepalived 192.168 nginx tenine Docker


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


目录

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


网络架构

Docker部署tenine实现后端应用的高可用与负载均衡_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 可以看到如下页面显示:

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

192.168.30.190 是 keepalived的虚拟IP, 然后可以访问SpringBoot应用接口看下是否负载均衡了

关闭 191上面的SpringBoot 看下 访问情况

关闭 191 上面的 Tengine 看下 访问情况


标签:负载,http,log,--,keepalived,192.168,nginx,tenine,Docker
From: https://blog.51cto.com/guzt/12016836

相关文章

  • 负载均衡:从理论到实践 ---day04
    负载均衡负载均衡1.什么是负载均衡2.负载均衡的分类硬件负载均衡软件负载均衡选择3.引入负载均衡的好处第一个Ribbon实例步骤1:步骤2:步骤3:步骤4:问题1.负载均衡的主要目标是什么?2.负载均衡器的作用是什么?3.常用的负载均衡算法有哪些?请解释其中一两种。4.什么是会话......
  • docker-compose快速部署flink1.18.1
    目的用于规范flink组件的部署操作,可用于开发测试环境快速部署前置条件基于centos7实例名内网IP主机名(Hostname)角色实例1172.20.20.2test-20-2节点1开始部署1.提前准备好flink:1.18.1镜像dockerpullflink:1.18.1部署目录:/app/funo/flink2.docker-......
  • SpringCloud-04 OpenFeign服务调用与负载均衡
    OpenFeign是一个声明式、模板化的HTTP客户端,它简化了在Java应用程序中调用RESTfulAPI的过程。OpenFeign是Netflix开发的一个开源项目,它构建在Feign的基础上,为开发者提供了更加简单、灵活的方式来实现HTTP请求。OpenFeign的特点包括:前面在使用SpringCloudLoadBalancer+Res......
  • Docker 部署 Seata (图文并茂超详细)
    部署Seata(Docker)[Step1]:创建对应的**seata**数据库,也就是下面的的**seata.sql**文件seata.sql[Step2]:拉取Seata镜像dockerpullseataio/seata-server:1.5.2[Step3]:创建目录➡️创建容器➡️拷贝文件➡️授权文件➡️删除容器#创建目录......
  • Containerd 不能完全代替docker,仍需要选择 Docker 使用 docker build、docker push、d
    基本概念在Kubernetes中,容器运行时(ContainerRuntime)是集群Node节点的核心组件之一。ContainerRuntime的主要功能包括:镜像管理容器生命周期管理,包括容器的创建、启动、停止、删除资源隔离网络配置存储挂载安全特性Kubernetes集群的Kubelet组件,可......
  • immich docker-compose.yml下载慢、github下载慢、ghcr.io镜像
    解决方案:将:image:ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}改为:image:ghcr.nju.edu.cn/immich-app/immich-server:${IMMICH_VERSION:-release}使用镜像下载,给出修改后的文件,直接复制然后就可以运行。点击查看代码##WARNING:Makesuretousethed......
  • 超级充电测试负载,你了解多少?
    充电桩是电动汽车的重要配套设施,其性能和安全直接影响到电动汽车的使用。因此,对充电桩进行定期检测是非常必要的。以下是一些充电桩定期检测的应用经验:定期巡检:充电桩应定期进行巡检,检查其外观是否完好,电缆是否有损伤,插头插座是否松动等。同时,还需要检查充电桩的运行状态,如电流......
  • docker配置springcloud项目到服务器
    1.服务器安装部署docker镜像2.创建镜像目录,如图所示 以其中一个服务为例,每个文件夹对应一个服务单元,每个文件夹中包含 sh,Dockerfile文件3.编辑项目中的application-test(根据环境来定),如图:   4.配置Nacos,单独配置命名空间,增加配置文件,注意,组一定要是test,配错了系......
  • docker overlay目录数据占用过大,进行迁移
    一定要先停docker,切记第一步:停dockersystemctlstopdocker第二步:复制数据先将docker中数据拷贝到一个空间大的挂在目录下cp-R-p/var/lib/docker//data/docker第三步:创建软连接先删除/var/lib/docker文件夹将原来docker文件指向新的/data/dockerln-s/data/docker/var/lib/d......
  • centos安装docker脚本
    #!/bin/bash#安装Docker脚本#检查是否为root用户,因为某些命令需要root权限if["$(id-u)"!="0"];thenecho"该脚本必须以root权限运行"1>&2exit1fi#更新系统(可选)echo"正在更新系统..."yumupdate-y#安装必要......