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

news/2024/9/18 19:40:58/ 标签: docker, 负载均衡, tengine, keepalived, 高可用

采用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 看下 访问情况


http://www.ppmy.cn/news/1525683.html

相关文章

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第三期]

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第三期] 第三期介绍:频道模块之频道成员 目录 QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第三期]第三期介绍:频道模块之频道成员获取子频道在线成员数获取频道成员列表获取频道身份组成员列…

MySQL 查询过慢的优化方法

1. 优化查询语句 问题:使用 SELECT * 会导致查询获取不必要的数据。 SELECT * FROM users WHERE age > 30;优化建议: 指定需要的列,这样可以减少数据传输的负担,提升查询速度。 SELECT name, email FROM users WHERE age &g…

Windows与linux中docker的安装与使用

windos中安装使用docker 下载Docker_Desktop 安装包进入docker官网下载Docker_Desktop: https://www.docker.com/启用wsl 我们搜索“启用或关闭Windows功能”,打开后勾选适用于Linux的Windows 子系统 Docker_Desktop设置 出现Docker Engine stopp…

GC-分代收集器

GC收集器介绍 十款GC收集器 上图中共有十款GC收集器,它们可以根据回收时的属性分为分代和分区两种类型: 分代收集器:Serial、ParNew、Parallel Scavenge、CMS、Serial Old(MSC)、Parallel Old 分区收集器&#xff…

Java多线程编程-基础篇

多线程相关的概念 并发 并发是指在同一时间段内,两个或多个任务在同一个处理器上交替执行,使得在宏观上看起来像是同时进行。并发是通过快速切换任务来模拟同时执行的效果,实际上在任何一个时刻点上只有一个任务在执行。 也就是说&#xff0…

Linux 基础命令-文件权限与所有权

1. 文件权限概述 在Linux中,每个文件和目录都有与之关联的权限和所有权,来控制谁可以访问、修改或执行文件。文件权限与所有权可以防止未经授权的用户对文件进行访问或修改。 1.1 文件权限的组成 每个文件在Linux系统中都有三种类型的权限&#xff1a…

使用Ansible进行多云环境的自动化部署与管理

使用Ansible进行多云环境的自动化部署与管理 引言 随着云计算技术的飞速发展,多云环境已经成为现代企业IT架构的主流选择。多云环境不仅提供了更高的灵活性和可用性,还能有效降低供应商锁定的风险。然而,多云环境的管理和部署复杂性也随之增…

vue devtools的使用

vue devtools的使用 Vue Devtools 是一个强大的浏览器扩展,旨在帮助你调试和开发 Vue.js 应用。它支持 Chrome 和 Firefox 浏览器,并提供了一些工具和功能,可以让你更轻松地查看和调试 Vue 应用的状态和行为。以下是如何安装和使用 Vue Devtools 的详细指南。 安装 Vue De…

《Python青少年趣味编程108例》书籍介绍

文章目录 前言为什么选择Python?书籍介绍文章目录配套资源 前言 在这个数字化飞速发展的时代,编程已经成为了一项不可或缺的技能。对于青少年而言,学习编程不仅能够培养逻辑思维、解决问题的能力,还能激发无限创意,让…

【PyQt6 应用程序】一键视频解说克隆字幕切割版

在当今数字时代,视频解说已经成为影视剧宣传和观众互动的重要手段。然而,手动制作高质量的影视剧解说视频需要大量的时间和精力。为了简化这一过程并提高生产效率,我们开发了基于PyQt6的应用程序“一键视频解说克隆字幕切割版”。该应用程序能够自动复刻别人的影视剧解说视频…

概率论原理精解【13】

文章目录 在度量空间中,连续映射概述一、度量空间与距离函数二、连续映射的定义三、连续映射的等价定义四、连续映射的性质五、应用与例子 球形邻域刻画一、球形邻域的定义二、连续映射的球形邻域刻画三、等价性证明四、应用与例子 将度量空间上的连续映射推广到拓扑…

软件测试面试从哪方面面试?

一、面试基础题 简述测试流程: 什么是软件测试?软件测试的目的与原则 问:软件生存周期及其模型是什么? 什么是软件质量? 自动化测试脚本开发的主要步骤: 目前主要的测试用例设计方法是什么? 常见的测试用例设计…

二次规划及其MATLAB实现

引言 二次规划(Quadratic Programming, QP)是一类重要的优化问题,其目标函数为二次函数,约束条件为线性不等式或等式。二次规划问题在工程、经济、金融等领域有广泛应用,如投资组合优化、人脸表情动画的权重求解、机械…

后端开发刷题 | 把数字翻译成字符串(动态规划)

描述 有一种将字母编码成数字的方式&#xff1a;a->1, b->2, ... , z->26。 现在给一串数字&#xff0c;返回有多少种可能的译码结果 数据范围&#xff1a;字符串长度满足 0<n≤90 进阶&#xff1a;空间复杂度 O(n)&#xff0c;时间复杂度 O(n) 示例1 输入&a…

HJ36字符串加密

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 最近 二、 2.1 HJ36字符串加密 解题 #include <stdio.h> #include <stdbool.h>int GetStrIndex(char c, char* dict, int len) {…

Python中给定一个数组a = [2,3,9,1,0],找出其中最大的一个数,并打印出来 求解?

Python有内置的max函数可以取最大值&#xff1a; max([2,3,9,1,0])也可以使用sorted先排序&#xff0c;再索引取出最大值&#xff1a; sorted([2,3,9,1,0])[-1]如果不用内置函数&#xff0c;自己排序算法来找出最大值&#xff0c;也有很多选择。 比如冒泡排序、循环排序、交…

算法设计(二)

1.归并排序 介绍 归并排序是建立在归并操作上的一种有效&#xff0c;稳定的排序算法&#xff0c;该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&#xff0c;再使子序列段间有序。若将两个有…

【人工智能学习笔记】4_4 深度学习基础之生成对抗网络

生成对抗网络&#xff08;Generative Adversarial Network, GAN&#xff09; 一种深度学习模型&#xff0c;通过判别模型&#xff08;Discriminative Model&#xff09;和生成模型&#xff08;Generative Model&#xff09;的相互博弈学习&#xff0c;生成接近真实数据的数据分…

leecode100题-双指针-三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 答案中不可以包含重复的三元组。 示例 1&#xff1a; 输入…

【Hot100】LeetCode—169. 多数元素

目录 1- 思路题目识别技巧 2- 实现⭐136. 只出现一次的数字——题解思路 3- ACM 实现 原题链接&#xff1a;169. 多数元素 1- 思路 题目识别 识别1 &#xff1a;统计数组中出现数量多余 [n/2] 的元素 技巧 值相同&#xff0c;则对 count 1&#xff0c;如果不相同则对值进行…