rabbitmq+nginx负载服务部署文档

前言

rabbitmq普通集群部署后,存在服务单点承压的情况,故,需要通过前端负载解决单点承压的问题;将采用nginx作为负载器,对流量进行负载分发到各个集群节点,解决服务单点负载的问题

环境

虚拟机4台,如下列表

主机名主机ip用途备注
nginx-lsb10.0.3.132负载器
rabbitmq0110.0.3.133rabbitmq-node1
rabbitmq0210.0.3.134rabbitmq-node2
rabbitmq0310.0.3.135rabbitmq-node3

同一个网络中

资源

名称版本类型备注
centos7.9.2009操作系统
docker26.1.4软件rpm部署
bitnami/rabbitmqlatest容器镜像容器id:80583c0e1b06
nginx1.27.0容器镜像容器id:e0c9858e10ed
pivotalrabbitmq/perf-testlatest容器镜像容器id:3804df61f5ba

部署

系统环境准备(四个主机均要执行)

关闭防火墙

  systemctl stop firewalldsystemctl disable firewalld

关闭selinux

  sed -i 's~SELINUX=enforcing~SELINUX=disabled~' /etc/selinux/configsetenforce 0

新增一个数据目录(最好和系统盘分离)

  mkdir /data/docker

docker服务准备(四个主机)

  rm -rf /etc/yum.repos.d/*curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engineyum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoyum install -y docker-ce docker-ce-cli containerd.iomkdir /etc/docker/cat >> /etc/docker/daemon.json << EOF{"data-root": "/data/docker","registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"]}EOFsystemctl restart docker systemctl enable docker wget https://github.com/docker/compose/releases/download/v2.28.0/docker-compose-linux-x86_64chmod 755 docker-compose-linux-x86_64\cp -fp ddocker-compose-linux-x86_64 /usr/bin/docker-compose

镜像准备

  #在负载均衡(10.0.3.132)的虚机上执行docker pull nginx:1.27.0docker pull pivotalrabbitmq/perf-test#在rabbitmq的三个节点上执行docker pull bitnami/rabbitmqdocker pull pivotalrabbitmq/perf-test

服务启动文件准备

nginx负载均衡的服务管理文件

mkdir -p /usr/yunji/nginx_4_lsb/conf.d
cat > /usr/yunji/nginx_4_lsb/docker-compose.yml << EOF
services:web:image: nginx:1.27.0container_name: nginx-webports:- "5672:5672"volumes:- "$PWD/conf.d:/etc/nginx/conf.d"- "$PWD/nginx.conf:/etc/nginx/nginx.conf:ro"restart: no
EOF
cat > /usr/yunji/nginx_4_lsb/nginx.conf << EOF
user  root;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}#http {
#    include       /etc/nginx/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  /var/log/nginx/access.log  main;
#
#    sendfile        on;
#    #tcp_nopush     on;
#
#    keepalive_timeout  65;
#
#    #gzip  on;
#
#    include /etc/nginx/conf.d/*.conf;
#}stream {log_format proxy '$remote_addr [$time_local] ''$protocol $status $bytes_sent $bytes_received ''$session_time "$upstream_addr" ''"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';access_log  /var/log/nginx/access.log  proxy;open_log_file_cache off;upstream rabbitTcp {server 10.0.3.133:5672;server 10.0.3.134:5672;server 10.0.3.135:5672;}server {listen 5672;proxy_connect_timeout 5s;proxy_timeout 30s;proxy_pass rabbitTcp;}include /etc/nginx/conf.d/*.stream;
}
EOF

rabbitmq的服务管理文件(网络直接使用宿主机的)

节点一(10.0.3.133)
  mkdir -p /usr/yunji/rabbitmq-servercat > /usr/yunji/rabbitmq-server/docker-compose.yml << EOF# Copyright Broadcom, Inc. All Rights Reserved.# SPDX-License-Identifier: APACHE-2.0version: '2'services:rabbitmq:image: docker.io/bitnami/rabbitmqcontainer_name: rabbitmq01#    ports:#      - '4369:4369'#      - '5551:5551'#      - '5552:5552'#      - '5672:5672'#      - '25672:25672'#      - '15672:15672'network_mode: "host"environment:- RABBITMQ_NODE_TYPE=stats- RABBITMQ_NODE_NAME=rabbit@rabbitmq01- RABBITMQ_ERL_COOKIE=s3cr3tc00ki3#      - RABBITMQ_SECURE_PASSWORD=yes- RABBITMQ_LOGS=-extra_hosts:- "rabbitmq01:10.0.3.133"- "rabbitmq02:10.0.3.134"- "rabbitmq03:10.0.3.135"volumes:- 'rabbitmq_data:/bitnami/rabbitmq/mnesia'volumes:rabbitmq_data:driver: localEOF	
节点二(10.0.3.134)
  mkdir -p /usr/yunji/rabbitmq-servercat > /usr/yunji/rabbitmq-server/docker-compose.yml << EOF# Copyright Broadcom, Inc. All Rights Reserved.# SPDX-License-Identifier: APACHE-2.0version: '2'services:rabbitmq:image: docker.io/bitnami/rabbitmqcontainer_name: rabbitmq02#    ports:#      - '4369:4369'#      - '5551:5551'#      - '5552:5552'#      - '5672:5672'#      - '25672:25672'#      - '15672:15672'network_mode: "host"environment:- RABBITMQ_NODE_TYPE=queue-disc- RABBITMQ_NODE_NAME=rabbit@rabbitmq02- RABBITMQ_CLUSTER_NODE_NAME=rabbit@rabbitmq01- RABBITMQ_ERL_COOKIE=s3cr3tc00ki3#      - RABBITMQ_SECURE_PASSWORD=yes- RABBITMQ_LOGS=-extra_hosts:- "rabbitmq01:10.0.3.133"- "rabbitmq02:10.0.3.134"- "rabbitmq03:10.0.3.135"volumes:- 'rabbitmq_data:/bitnami/rabbitmq/mnesia'volumes:rabbitmq_data:driver: localEOF	
节点三(10.0.3.135)
  mkdir -p /usr/yunji/rabbitmq-servercat > /usr/yunji/rabbitmq-server/docker-compose.yml << EOF# Copyright Broadcom, Inc. All Rights Reserved.# SPDX-License-Identifier: APACHE-2.0version: '2'services:rabbitmq:image: docker.io/bitnami/rabbitmqcontainer_name: rabbitmq03#    ports:#      - '4369:4369'#      - '5551:5551'#      - '5552:5552'#      - '5672:5672'#      - '25672:25672'#      - '15672:15672'network_mode: "host"environment:- RABBITMQ_NODE_TYPE=queue-ram- RABBITMQ_NODE_NAME=rabbit@rabbitmq03- RABBITMQ_CLUSTER_NODE_NAME=rabbit@rabbitmq01- RABBITMQ_ERL_COOKIE=s3cr3tc00ki3#      - RABBITMQ_SECURE_PASSWORD=yes- RABBITMQ_LOGS=-extra_hosts:- "rabbitmq01:10.0.3.133"- "rabbitmq02:10.0.3.134"- "rabbitmq03:10.0.3.135"volumes:- 'rabbitmq_data:/bitnami/rabbitmq/mnesia'volumes:rabbitmq_data:driver: localEOF	

起服务

rabbitmq服务启动

节点一(10.0.3.133)

cd /usr/yunji/rabbitmq-server
docker-compose -f docker-compose.yml up -d --no-deps

节点二(10.0.3.134)

  cd /usr/yunji/rabbitmq-serverdocker-compose -f docker-compose.yml up -d --no-deps

节点三(10.0.3.135)

  cd /usr/yunji/rabbitmq-serverdocker-compose -f docker-compose.yml up -d --no-deps

验证集群是否成功

使用浏览器访问url: http://10.0.3.133:15672,确认节点是否都可以看到;如果是,则确认集群成功。
用户授权参考如下链接内容
RabbitMQ3.13.x之四_RabbitMQ角色说明及创建用户与授权

nginx负载服务启动

  cd /usr/yunji/nginx_4_lsb/docker-compose -f docker-compose.yml up -d --no-deps

测试

  • 单点直连rabbitmq的第一个节点压测测试
      docker run -it --rm pivotalrabbitmq/perf-test:latest -h "amqp://admin:admin@10.0.3.133:5672" -x 2 -y 4 -u "perf-test1" -a --id "test1" -s 4000
    
    结果:
    • 访问rabbitmq的管理后台(http://10.0.3.133:15672),发现一个节点均衡生产和消费数据
  • 单点直连rabbitmq的三个节点压测测试
      docker run -it --rm pivotalrabbitmq/perf-test:latest -H "amqp://admin:admin@10.0.3.133:5672,amqp://admin:admin@10.0.3.134:5672,amqp://admin:admin@10.0.3.135:5672" -x 2 -y 4 -u "perf-test1" -a --id "test1" -s 4000
    
    结果:
    • 访问rabbitmq的管理后台(http://10.0.3.133:15672),发现三个节点均衡生产和消费数据
  • 单点直连nginx负载的压测测试
      docker run -it --rm pivotalrabbitmq/perf-test:latest -h "amqp://admin:admin@10.0.3.132:5672" -x 2 -y 4 -u "perf-test1" -a --id "test1" -s 4000
    
    • 结果:
      访问rabbitmq的管理后台(http://10.0.3.133:15672),发现三个节点均衡生产和消费数据

结果

增加nginx负载均衡的能力,实现了流量负载的能力,确实可以解决单节点负载的问题。

问题和思考

  • rabbitmq节点宕机一个之后,该节点得到的消息是否仍然可以消费?

    • 答: 否,由于当前的消息仍然是放在接收的节点上,只有其他节点主动获取消息,其他rabbitmq才能让消费端消费数据。
  • nginx单点部署,是否存在单点故障的问题

    • 答: 是,由于单点部署,无法保证该负载出现服务异常之后的后端服务对外提供服务的能力,还需要其他例如keepalive等服务补充支持
  • 后端一个rabbitmq的节点宕机,nginx是否可以感知到,并且将后续的消息转向另外的节点?

    • 答:需要配置文件里面设置链接超时的内容,然后nginx会依照超时的重试间隔和重试时间进行重连接,这个可能会导致部分业务出现链接异常的问题。所以还需要通过其他配置或者服务补充支持该异常的处理情况。
  • rabbitmq节点宕机一个之后,该节点得到的消息是否仍然可以消费?

    • 答: 否,由于当前的消息仍然是放在接收的节点上,只有其他节点主动获取消息,其他rabbitmq才能让消费端消费数据。
  • nginx单点部署,是否存在单点故障的问题

    • 答: 是,由于单点部署,无法保证该负载出现服务异常之后的后端服务对外提供服务的能力,还需要其他例如keepalive等服务补充支持
  • 后端一个rabbitmq的节点宕机,nginx是否可以感知到,并且将后续的消息转向另外的节点?

    • 需要配置文件里面设置链接超时的内容,然后nginx会依照超时的重试间隔和重试时间进行重连接,这个可能会导致部分业务出现链接异常的问题。所以还需要通过其他配置或者服务补充支持该异常的处理情况。

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

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

相关文章

Spring系统学习-什么是AOP?为啥使用AOP?

问题思考 我们为啥要使用AOP? 来看一个案例&#xff1a; 声明计算器接口Calculator&#xff0c;包含加减乘除的抽象方法 public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j); }public class Calculat…

从缓存到redis

从缓存到Redis 文章目录 从缓存到Redis一、缓存的基础知识&#xff08;1&#xff09;为什么使用缓存&#xff08;2&#xff09;缓存的本质&#xff08;3&#xff09;缓存的加载时机&#xff08;4&#xff09;缓存的两种使用方式使用方式一&#xff1a;本地缓存使用方式二&#…

JS(JavaScript)数据校验 表单校验-案例

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【Rust入门】生成随机数

文章目录 前言随机数库rand添加rand库到我们的工程生成一个随机数示例代码 总结 前言 在编程中&#xff0c;生成随机数是一种常见的需求&#xff0c;无论是用于数据分析、游戏开发还是模拟实验。Rust提供了强大的库来帮助我们生成随机数。在这篇文章中&#xff0c;我们将通过一…

顺序表--续(C语言详细版)

2.9 在指定位置之前插入数据 // 在指定位置之前插入数据 void SLInsert(SL* ps, int pos, SLDataType x); 步骤&#xff1a; ① 程序开始前&#xff0c;我们要断言一下&#xff0c;确保指针是有效的&#xff0c;不是NULL&#xff1b; ② 我们还要断言一下&#xff0c;指定的…

ctfshow sql注入 web234--web241

web234 $sql "update ctfshow_user set pass {$password} where username {$username};";这里被过滤了&#xff0c;所以我们用\转义使得变为普通字符 $sql "update ctfshow_user set pass \ where username {$username};";那么这里的话 pass\ where…

Hadoop和Flink漏洞修复

Hadoop漏洞修复 CVE-2021-33036: Hadoop YARN REST API 未授权访问导致远程代码执行漏洞Cluster Overview 未授权访问漏洞Hadoop 未授权访问漏洞 修复方法1 修复方法1 1、进入hadoop配置文件目录&#xff0c;创建密钥文件 cd /home/flink/hadoop-3.3.2/etc/hadoop echo &qu…

libtorch+torchvision windows编译

libtorch建议直接采用官方的预编译版本,对应好torchvision版本做编译。 1. libtorch预编译版本下载 libtorch官方下载地址 Pybind11编译 git clone https://github.com/pybind/pybind11.git cd pybind11 mkdir build (base) PS E:\project\pybind11-2.13.1> cd .\build…

API类别 - UI核心

API类别 - UI核心 引言 在当今的数字时代&#xff0c;用户界面&#xff08;UI&#xff09;是任何软件或应用成功的关键因素之一。UI核心API作为构建用户界面的基础&#xff0c;提供了丰富的功能和工具&#xff0c;使得开发者能够创建出既美观又实用的用户界面。本文将深入探讨…

小程序-<web-view>嵌套H5页面支付功能

背景&#xff1a;小程序未发布前&#xff0c;公司使用vue框架搭建了管理系统&#xff0c;为了减少开发成本&#xff0c;微信提供了web-view来帮助已有系统能在小程序上发布&#xff0c;详见web-view | 微信开放文档。因公司一直未打通嵌套H5小程序的支付功能&#xff0c;导致用…

AIGC对设计行业的影响与启发:AIGC设计能替代真正的设计师吗?

随着科技的飞速发展&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术在设计行业的应用日益广泛&#xff0c;引发了广泛的讨论和关注。AIGC以其高效、多样化的生成能力&#xff0c;为设计行业带来了前所未有的变革。然而&#xff0c;关于AIGC是否能替代真正的设计…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(一)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

Python 生成Md文件带超链 和 PDF文件 带分页显示内容

software.md # -*- coding: utf-8 -*- import os f open("software.md", "w", encoding"utf-8") f.write(内部测试版2024 MD版\n) for root, dirs, files in os.walk(path): dax os.path.basename(root)if dax "":print("空白…

雅思词汇及发音积累 2024.7.3

银行 check &#xff08;美&#xff09;支票 cheque /tʃek/ &#xff08;英&#xff09;支票 ATM 自动取款机 cashier 收银员 teller /ˈtelə(r)/ &#xff08;银行&#xff09;出纳员 loan 贷款 draw/withdraw money 提款 pin number/passsword/code …

从 ClickHouse 到 Apache Doris:快成物流的数智化货运应用实践

导读&#xff1a;随着快成物流的大宗商品产业链的不断发展&#xff0c;货运轨迹规划和实时数据分析的需求日益迫切&#xff0c;为了保障数据报表更新、用户画像圈选与物流轨迹实时更新等大数据核心系统性能&#xff0c;快成物流引入 Apache Doris 实时数仓升级了大数据算法平台…

数据决策系统详解

文章目录 数据决策系统的核心组成部分&#xff1a;1. **数据收集与整合**&#xff1a;2. **数据处理与分析**&#xff1a;3. **数据可视化**&#xff1a;4. **决策支持**&#xff1a; 数据决策系统的功能&#xff1a;决策类型&#xff1a;数据决策系统对企业的重要性&#xff1…

这才叫必备软件推荐 你不能不知道的mac软件 Mac上有什么实用的必备软件 Mac常用必备软件推荐 一些好用的Mac软件

Mac OS是一个类Unix系统&#xff0c;内置终端Shell&#xff0c;这使得它天生就适合为程序员、开发者、设计者所用。不得不说苹果对用户体验的追求已经到了极致。遂开本篇&#xff0c;由于应用众多&#xff0c;一锅炖不下&#xff0c;故打算做一个系列。 下面为大家一一介绍一些…

基于物品的协同过滤算法

预估用过户对候选物品的兴趣 计算物品相似度 召回通道 快速做召回条件

Unity2D - 状态机(State Machine)详解

1. 状态机概述 在角色的生成中&#xff0c;由于事件的不同&#xff0c;动作的不同&#xff0c;角色会处于不同的状态中。例如对战冒险游戏&#xff0c;面临Boss的攻击&#xff0c;角色会受到例如中毒&#xff0c;恐惧等Debuff效果&#xff0c;若单纯的在一个脚本中使用if等语句…

绝地求生PUBG怎么领取补偿G币 补偿G币什么时候到账

绝地求生这款大逃杀射击游戏相信大家都不陌生&#xff0c;在之前的新版本NewJeans联动中&#xff0c;由于一些官方设定的错误&#xff0c;导致在开典藏箱的时候出现了一些问题&#xff0c;官方也推出了相应的补偿措施&#xff0c;比如退还G币&#xff0c;回收典藏箱子开出来的东…