当前位置: 代码网 > 服务器>服务器>云虚拟主机 > Docker部署tenine实现后端应用的高可用与负载均衡(推荐)

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

2024年11月03日 云虚拟主机 我要评论
采用docker方式的tengine 和 keepalived 组合模式可以实现小应用场景的高可用负载均衡需求网络架构一、环境准备两台物理主机: 22.04.3-ubuntu linuxdocker版

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com