基于docker+Keepalived+Haproxy高可用前后的分离技术

基于docker+Keepalived+Haproxy高可用前后端分离技术

架构图

image-20231008112141771

服务名docker-ip地址docker-keepalived-vip-ip
haproxy-01docker-ip自动分配 未指定ip192.168.31.252
haproxy-02docker-ip自动分配 未指定ip192.168.31.253

安装haproxy

宿主机ip 192.168.31.254
宿主机keepalived虚拟网络未定义

  1. 下载docker镜像
    docker pull haproxy:2.1
    

    image-20231008133511141

  2. 配置haproxy 配置文件 文件名haproxy.cfg
global#工作目录chroot /usr/local/etc/haproxy#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级infolog 127.0.0.1 local5 info#守护进程运行daemondefaultslog 127.0.0.1 local0 err #[err warning info debug]mode http                #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OKretries 2                #两次连接失败就认为是服务器不可用,也可以通过后面设置option redispatch        #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器option abortonclose      #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接option dontlognull       #日志中不记录负载均衡的心跳检测记录maxconn 4096             #默认的最大连接数timeout connect 5000ms   #连接超时timeout client 30000ms   #客户端超时timeout server 30000ms   #服务器超时#timeout check 2000      #=心跳检测超时######## 监控界面配置 #################	
listen  admin_stats#监控界面的访问的IP和端口bind  0.0.0.0:8888#访问协议mode        http#URI相对地址stats uri   /dbs#统计报告格式stats realm     Global\ statistics#登陆帐户信息stats auth  admin:admin########frontend配置##############
#mycat负载均衡
listen  proxy-mycat#访问的IP和端口bind  0.0.0.0:9000  #网络协议mode  tcp#负载均衡算法(轮询算法)#轮询算法:roundrobin#权重算法:static-rr#最少连接算法:leastconn#请求源IP算法:source balance  roundrobin# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效server haproxy01 192.168.31.252:4001 check weight 1 maxconn 2000 server haproxy02 192.168.31.253:4002 check weight 1 maxconn 2000 # 使用keepalive检测死链option tcpka

创建Haproxy容器

haproxy01

docker run -d -p 4001:8888 -p 9000:8066  \
-v /haproxy/haproxy01:/usr/local/etc/haproxy  \
--name haproxy01 --privileged  haproxy:2.1

haproxy02

docker run -d -p 4002:8888 -p 9001:8066 \
-v /haproxy/haproxy02:/usr/local/etc/haproxy \
--name haproxy02 --privileged  haproxy:2.1
参数配置详解
-p 4001:8888        将Haproxy提供的监控界面服务端口8888映射到宿主机的4001端口-p 4002:3306        将Haproxy提供的数据库负载均衡的服务端口3306映射到宿主机的4002端口-v /home/soft/haproxy:/usr/local/etc/haproxy       将宿主机的/home/soft/haproxy目录映射到容器的/usr/local/etc/haproxy目录。将来在宿主机的/home/soft/haproxy中放入配置文件,在相映射的容器目录中就可以使用了。--name h1            给容器起名,为了保证Haproxy的高可用,将来也会启动多个Haproxy容器实例--privileged          配置权限--net=net1           使用的网段,数据库实例使用的都是net1网段,需和数据库实例使用的网段保持一致--ip 172.18.0.7     手动分配的ip地址,如不设置,docker虚拟机也会给其分配一个ip地址 haproxy:2.1               docker run使用的镜像名

image-20231008142452384

在haproxy容器中启动haproxy实例

由于容器是使用-d做后台运行的,因此之后还需要进入后台运行的容器,把haproxy中间件启动起来。

进入后台运行的容器:

docker exec -it haproxy01 /bin/bash

启用配置文件(启用完配置文件才算是真的启动了haproxy服务)
(haproxy01 、haproxy02 都需要执行)

haproxy -f /usr/local/etc/haproxy/haproxy.cfg

image-20231008143136453

查看haproxy监控界面

http://对应ip:4001/dbs
用户名:admin
密码:admin
对应上面的配置

image-20231008143421736

keepalived搭建

(haproxy01 、haproxy02 都需要执行)

1、进入docker-haproxy服务
docker exec -it haproxy01 /bin/bash
2、更新update,安装keepalived
apt-get update
apt-get install keepalived更换源这里就不操作了
3、安装vim 安装ifconfig命令 安装ping
apt-get install net-tools  vim   iputils-ping
4、新建并写入一个keepalived的配置文件(注意把注释删掉)
vim /etc/keepalived/keepalived.confvrrp_instance  VI_1 {#定义节点属性state  MASTER#定义虚拟网卡interface  eth0#定义组vriidvirtual_router_id  100#定义权重priority  100#定义心跳检测时间1秒advert_int  1#定义组用户密码authentication {auth_type  PASSauth_pass  123456}#定义docker内ip地址,必须要在和haproxy同一个网段virtual_ipaddress {172.17.0.66}
}
keepalived配置文件详细说明
vrrp_instance  VI_1 {state  MASTER   #Keepalive的身份(MASTER为主服务,BACKUP为备用服务,抢占到ip的为主服务器,没有抢占到的自动降级为备用服务器)interface  eth0  #docker中虚拟ip使用到的docker内部网卡virtual_router_id  51  #虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。 标识可以是0~255之间任意值。priority  100   #硬件设备条件不同时采用的权重,MASTER权重要高于BACKUP,数字越大优先级越高。advert_int  1  #keepalived节点之间的心跳检测间隔,单位为秒,主备之间必须一致。authentication {   auth_type  PASSauth_pass  123456}  #心跳检测需要登录到keepalived节点内,登录使用的账号密码。主备必须用相同的密码才能正常通信。virtual_ipaddress {172.18.0.201}  #虚拟ip,该虚拟ip将被写入到上面的docker网卡ens33中,如数据库集群的网段是172.18.0.xxx,这里就定义个大一点的该网段的ip地址。由于是docker内部的虚拟ip,在docker内部能访问,出了docker是不能访问的。
}
image-20231008150323665
启动keepalived
service keepalived start
执行 /bin/systemctl start keepalived.service 即可

image-20231008150247369

尝试宿主机能否ping通keepalived占有的虚拟ip,能ping通就说明这个虚拟ip已经配置成功了:

image-20231008150639375

如若ping不通需检查配置是否正确,以及网络模式是否是桥接。

一开始我使用的网络模式是nat,无法ping通,改为桥接后重启linux可以ping通

三、在宿主机内安装Keepalived

Haproxy容器内的keepalive已经正常运行了,其抢占的虚拟ip也可以正常ping通了。

之后需要把该虚拟ip和宿主机的ip做映射,以使外部网络可以访问到该虚拟ip,需要在宿主机上也安装keepalived。

宿主机的linux是centos,所以安装命令有所不同:

yum install -y keepalived  
apt-get   install -y keepalived

编写Keepalived配置文件

位置/etc/keepalived文件夹
宿主机配置信息

vrrp_instance VI_1 {state MASTER#这里是宿主机的网卡,可以通过ip a查看当前自己电脑上用的网卡名是哪个interface ens33virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {#这里是指定的一个宿主机上的虚拟ip,一定要和宿主机网卡在同一个网段,我的宿主机网卡ip是192.168.1.85,所以指定虚拟ip是给的90192.168.136.140}
}#接受监听数据来源的端口,网页入口使用
virtual_server 192.168.136.140 8888 {delay_loop 3lb_algo rr lb_kind NATpersistence_timeout 50protocol TCP#把接受到的数据转发给docker服务的网段及端口,由于是发给docker服务,所以和docker服务数据要一致real_server 172.18.0.15 8888 {weight 1}
}#接受数据库数据端口,宿主机数据库端口是3306,所以这里也要和宿主机数据接受端口一致
virtual_server 192.168.136.140 8066 {delay_loop 3lb_algo rr lb_kind NATpersistence_timeout 50protocol TCP#同理转发数据库给服务的端口和ip要求和docker服务中的数据一致real_server 172.18.0.15 8066 {weight 1}
}

image-20231008154345698

配置文件详解
注意:1. 如上配置中的virtual_server 192.168.31.252,这是我当前的宿主机的网段ip地址,需将配置中所有192.168.132.252改成自己使用的宿主机网段2. ipaddress查看自己连接宿主机的ip地址,查看ip地址对应的网卡名。把interface eth1一项修改成自己正确的宿主机网卡名。
3、启动keepalived
service keepalived start执行 /bin/systemctl start keepalived.service 即可  如果报错

启动成功后,尝试ping宿主机供请求访问的ip ping 192.168.31.99

image-20231008154658429

image-20231008154626406

测试Haproxy监控服务

通过宿主机keepalived绑定的ip访问haproxy监控服务

image-20231008154800808

注意,这次访问haproxy监控服务的ip192.168.31.99是宿主机keepalived所占有的虚拟ip,

keepalived通过这个虚拟ip192.168.31.99 转发请求到docker的虚拟ip 172.17.0.66。

haproxy01容器中的keepalived所在主服务器haproxy最后进行负载均衡请求分发。

这次访问的已经不是原本的未使用keepalived时的宿主机192.168.132.252的ip了
以上都是为了实现高可用功能,没有配置前后端分离。

至此完成高可用

Haproxy配置动静分离页面

修改主配置文件如下
globalchroot /usr/local/etc/haproxylog 127.0.0.1   local0 info                     ##定义日志级别;log 127.0.0.1   local1 noticemaxconn 4096            ##设定每个haproxy进程所接受的最大并发连接数uid 99                  ##指定运行服务的用户和组gid 99daemon                  ##指定运行模式为daemon,以守护进程的方式工作在后台
defaultslog     global                          ##采取global中的日志配置mode    http                            ##默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OKoption  httplog                         ##采用http日志格式记录日志option  dontlognull                     ##不记录健康检查的日志记录option httpclose                        ##关闭保持连接retries 3                               ##检查节点最多失败次数maxconn 2000                            ##最大连接数,定义不得大于global中的值contimeout      5000    ##连接超时时间,毫秒,在此期间,如若客户端与服务端无法成功建立连接,则断掉clitimeout      50000   ##设置连接客户端发送数据时的成功连接最长等待时间,单位为毫秒,如若在这期间无法请求成功,则断掉srvtimeout      50000   ##设置服务器端回应客户端数据发送的最长等待时间,如果在这期间还无法发送成功,则断掉##################无分离页面需求的配置##############
#listen webcluster 0.0.0.0:80                   ##指定haproxy服务监听地址和端口
#       option  httpchk GET /index.html         ##指定http请求方法和默认文件
#       balance roundrobin                      ##指定轮询调度算法
#       server  inst1 192.168.100.155:80 check inter 2000 fall 3                ##定义web节点,检测心跳频率,单位为毫秒,定义检查节点最多失败次数
#       server  inst2 192.168.100.156:80 check inter 2000 fall 3##################有分离页面需求的配置##############
frontend http                           ##定义名称为httpbind *:80                       ##指定监听地址和端口acl linuxfan1 hdr_end(host) -i 192.168.31.253                ##指定类型为访问路径的域名,-i不区分大小写acl linuxfan2 hdr_end(host) -i www.ceshi.conacl linuxfan3 path_end -i .jsp .do .css .js                     ##指定请求文件格式为.jsp#acl linuxfan3 hdr_reg -i \.(css|png|jpg|jpeg|gif|ico|swf|xml|txt|pdf|do|jsp|js)$       ##调用正则表达式acl linuxfan4 path_end -i .html .css .png .jpg .jpeg .xml       ##指定请求文件格式为.htmlacl linuxfan5 path_beg -i /WebRoot                              ##指定访问URL中的路径,如http://www.linuxfan.cn/WebRoot/index.jspuse_backend dongtai if linuxfan1 linuxfan3use_backend dongtai if linuxfan2 linuxfan3use_backend dongtai if linuxfan1 linuxfan5 linuxfan3use_backend dongtai if linuxfan2 linuxfan5 linuxfan3default_backend jingtai                                 ##默认的请求使用backend dongtaibackend jingtai         ##定义backend :jingtaimode http                       ##定义模式balance roundrobin              ##定义调度算法为轮询server jingtai01 192.168.31.253:80 check inter 2000 fall 3             ##定义节点backend dongtaimode httpbalance roundrobinserver dongtai01 192.168.31.254:8080 check inter 2000 fall 3

部署nginx

创建目录

mkdir -p /usr/local/docker/nginx
vim docker-compose.yml
version: "3.0"
services:nginx:image: nginx:1.21.6restart: always#network_mode: "host"ports:- 80:80- 443:443volumes:- "./nginx/html:/usr/share/nginx/html"- "./nginx/conf.d:/etc/nginx/conf.d"- "./nginx/ssl:/etc/nginx/ssl"- "./nginx/logs:/var/log/nginx"

启动
image-20231008171725061

部署tomcat

创建目录,为了放置 Tomcat 的配置文件等

mkdir  bin  conf  docker-compose.yml  logs  webapps

先随便启动一个 tomcat 容器(用第一种方法,docker run),主要是为了获取 tomcat 容器内部的配置文件

#启动一个容器docker run -d --name tomcat tomcat# 查看 容器 获取容器IDdocker ps -a

其中将,容器内 tomcat 文件夹下的 conf bin logs webapps 里面的内容都拷贝到上面宿主机上创建的对应文件夹内。容器的文件拷贝到宿主机的命令如下:

# 注意!是在宿主机上执行这条命令。
docker cp 容器名:/usr/local/tomcat/webapps/* /usr/local/tomcat/webapps
其它文件夹内的内容也要这样拷贝到宿主机对应的文件夹内。

创建这个文件,docker-compose.yml

version: '3'
services:tomcat:user: rootrestart: alwayscontainer_name: tomcatimage: tomcatprivileged: trueenvironment:- TZ="Asia/Shanghai"ports:- 1002:8080volumes:- /usr/local/tomcat/webapps/:/usr/local/tomcat/webapps/- /usr/local/tomcat/conf:/usr/local/tomcat/conf- /usr/local/tomcat/logs:/usr/local/tomcat/logs- /usr/local/tomcat/bin:/usr/local/tomcat/bin- /etc/localtime:/etc/localtime

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《DevOps 精要:业务视角》- 读书笔记(三)

DevOps 精要:业务视角(三) 第3章 原则3.1 价值流3.2 部署流水线3.3 一切都应存储在版本控制系统中3.4 自动化配置管理3.5 完成的定义3.6 小结 第3章 原则 将原则从实践中分离出来,这是一种很有用的做法。当然了,这两个词分别有着…

前后端分离计算机毕设项目之基于SpringBoot的无人智慧超市管理系统的设计与实现《内含源码+文档+部署教程》

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

Flutter环境搭建及新建项目

一、下载安装压缩包 https://storage.flutter-io.cn/flutter_infra_release/releases/stable/windows/flutter_windows_3.10.6-stable.zip 二、解压缩 解压之后,将里面的flutter整体拿出来 三、配置环境变量 将flutter/bin全路径配置到系统环境变量里面 四、运行…

LLMs 蒸馏, 量化精度, 剪枝 模型优化以用于部署 Model optimizations for deployment

现在,您已经了解了如何调整和对齐大型语言模型以适应您的任务,让我们讨论一下将模型集成到应用程序中需要考虑的事项。 在这个阶段有许多重要的问题需要问。第一组问题与您的LLM在部署中的功能有关。您需要模型生成完成的速度有多快?您有多…

194、SpringBoot --- 下载和安装 Erlang 、 RabbitMQ

本节要点: 一些命令: 小黑窗输入: rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗: rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问 htt…

Games104现代游戏引擎笔记高级ai

Hierarchical Task Network 层次任务网络 World State是一个主观的对世界的认知,并不是一个真实世界的描述 Sensors负责从游戏环境中抓取各种状态 HTN Domain 存放层次化的树状结构Task和之间的关联关系1 Planner 根据World State从 Domain 里规划 task Plan Runne…

Mac上安装Java的JDK多版本管理软件jEnv

JDK的多版本管理软件主要有以下三种: jEnv jEnv 是一个命令行工具,可以帮助您管理和切换不同版本的 Java 环境。它可以让您在不同的项目之间轻松切换 Java 版本。您可以使用 jenv global 命令设置全局 Java 版本,也可以使用 jenv local 命令…

短视频平台的那些事

短视频平台的那些事 文章目录 短视频平台的那些事1. 前言2. 概览介绍3. 业务框架4. 关键技术能力4.1 视频处理4.1.1 FFMPEG技术 4.2 视频安全,合规4.2.1 视频安全审核4.2.2 视频MD5校验4.2.3 视频AI指纹 4.3 视频内容理解4.3.1 视频分类4.3.2 视频标签4.3.3 视频质量…

windows docker desktop配置加速地址

目录 为什么常见加速地址在docker desktop上配置 为什么 https://hub.docker.com 是官方的镜像仓库地址,但是它的服务器地址是在国外,有时候访问和下载的速度差强人意。不过好在,我们可以进行远程仓库的设置,将仓库镜像地址设置为…

ChatGPT 背后包含了哪些技术?

ChatGPT 是由OpenAI开发的一款基于GPT-3(Generative Pre-trained Transformer 3)的人工智能语言模型。这个模型是使用多种编程语言和技术组合编写的。 首先,ChatGPT 使用了 Python 作为主要的编程语言。Python 是一种流行的高级编程语言&…

Prometheus集成consul[被监控对象开启basic认证]

1,被监控对象开启basic认证 具体操作这里不再详细细讲。 2,将被监控对象注册到consul 由于被监控对象开启了basic认证,注册到consul后显示:401 Unauthorized Output: Unauthorized,不能够正常健康检查。 3&#xff0c…

AI绘画-Stable Diffusion笔记

软件:Stable Diffusion 视频教程来自 https://www.bilibili.com/video/BV1As4y127HW/?spm_id_from333.337.search-card.all.click 提示词 提示词类别 内容型提示词 人物主题特征: 服饰穿搭:white dress 发型发色:blonde hair,l…

TensorFlow案例学习:对服装图像进行分类

前言 官方为我们提供了一个 对服装图像进行分类 的案例,方便我们快速学习 学习 预处理数据 案例中有下面这段代码 # 预处理数据,检查训练集中的第一个图像可以看到像素值处于0~255之间 plt.figure() # 创建图像窗口 plt.imshow(train_images[0]) # …

开发过程教学——交友小程序

交友小程序 1. 我的基本信息2. 我的人脉2.1 我的关注2.2 我的粉丝 3. 我的视频4. 我的相册 特别注意:由于小程序分包限制2M以内,所以要注意图片和视频的处理。 1. 我的基本信息 数据库表: 我的基本信息我的登录退出记录我的登录状态&#x…

Godot 官方2D游戏笔记(1):导入动画资源和添加节点

文章目录 前言2D官方游戏案例资源下载项目配置添加角色节点模拟运行移动根节点 结束 Godot专栏地址 前言 Godot 官方给了我们2D游戏和3D游戏的案例,不过如果是独立开发者只用考虑2D游戏就可以了,因为2D游戏纯粹,我们只需要关注游戏的玩法即可…

蓝桥杯---第二讲---二分与前缀和

文章目录 前言Ⅰ. 数的范围0x00 算法思路0x00 代码书写 Ⅱ. 数的三次方根0x00 算法思路0x01代码书写 Ⅲ. 前缀和0x00 算法思路0x01 代码书写 Ⅳ. 子矩阵的和0x00 算法思路0x01 代码书写 Ⅴ. 机器人跳跃问题0x00 算法思路0x01 代码书写 Ⅵ. 四平方和0x00 算法思路0x01 代码书写 …

SpringCloud学习笔记-注册微服务到Eureka注册中心

目录 1.在该Module的pom文件中引入eureka依赖2.在该module的src/main/resources/application.yml配置文件3.启动对应的微服务4.查看微服务是否启动成功 假如我有一个微服务名字叫user-service,我需要把它注册到Eureka注册中心,则具体步骤如下: 1.在该Module的pom文件中引入eure…

Flink的处理函数——processFunction

目录 一、处理函数概述 二、Process函数分类——8个 (1)ProcessFunction (2)KeyedProcessFunction (3)ProcessWindowFunction (4)ProcessAllWindowFunction &#xff…

真香!Jenkins 主从模式解决问题So Easy~

01.Jenkins 能干什么 Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。 中文官网:https://jenkins.io/zh/ 0…

好消息:用 vue3+layui 共同铸造我们新的项目

前言: layui这个框架不知道多少人还在关注着,记得第一次接触它是在18年,后来随着vue,react的盛行,jquerylayui的模式受到了特别大的冲击,后来作者都放弃维护他的官方网站,转而在github/gitee上做…