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 firewalld
  systemctl disable firewalld

关闭selinux

  sed -i 's~SELINUX=enforcing~SELINUX=disabled~' /etc/selinux/config
  setenforce 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.repo
  yum -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
  yum install -y yum-utils device-mapper-persistent-data lvm2
  yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  yum install -y docker-ce docker-ce-cli containerd.io
  mkdir /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"]
  }
  EOF
  systemctl restart docker 
  systemctl enable docker 
  wget https://github.com/docker/compose/releases/download/v2.28.0/docker-compose-linux-x86_64
  chmod 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.0
  docker pull pivotalrabbitmq/perf-test
  #在rabbitmq的三个节点上执行
  docker pull bitnami/rabbitmq
  docker 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.0
    container_name: nginx-web
    ports:
      - "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-server
  cat > /usr/yunji/rabbitmq-server/docker-compose.yml << EOF
  # Copyright Broadcom, Inc. All Rights Reserved.
  # SPDX-License-Identifier: APACHE-2.0
  
  version: '2'
  
  services:
    rabbitmq:
      image: docker.io/bitnami/rabbitmq
      container_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: local
  EOF	
节点二(10.0.3.134)
  mkdir -p /usr/yunji/rabbitmq-server
  cat > /usr/yunji/rabbitmq-server/docker-compose.yml << EOF
  # Copyright Broadcom, Inc. All Rights Reserved.
  # SPDX-License-Identifier: APACHE-2.0
  
  version: '2'
  
  services:
    rabbitmq:
      image: docker.io/bitnami/rabbitmq
      container_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: local
  EOF	
节点三(10.0.3.135)
  mkdir -p /usr/yunji/rabbitmq-server
  cat > /usr/yunji/rabbitmq-server/docker-compose.yml << EOF
  # Copyright Broadcom, Inc. All Rights Reserved.
  # SPDX-License-Identifier: APACHE-2.0
  
  version: '2'
  
  services:
    rabbitmq:
      image: docker.io/bitnami/rabbitmq
      container_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: local
  EOF	

起服务

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-server
  docker-compose -f docker-compose.yml up -d --no-deps

节点三(10.0.3.135)

  cd /usr/yunji/rabbitmq-server
  docker-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.mfbz.cn/a/768360.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【信即是功夫】人皆有良知在心中

良知就是做人、做事的准则&#xff0c;良知就是天理&#xff1b;实实在在地自信 每个人心中都有一个圣人&#xff0c;只因自己不能真的相信&#xff0c;把这个圣人埋没了 良知在每个人心中&#xff0c;无论你如何做&#xff0c;也无法泯灭它。即使身为盗贼的人&#xff0c;他…

【LeetCode的使用方法】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🔮LeetCode的使用方法 🔮LeetCode 是一个在线编程平台,广泛…

掌握Go语言邮件发送:net/smtp实用教程与最佳实践

掌握Go语言邮件发送&#xff1a;net/smtp实用教程与最佳实践 概述基本配置与初始化导入net/smtp包设置SMTP服务器基本信息创建SMTP客户端实例身份验证 发送简单文本邮件配置发件人信息构建邮件头部信息编写邮件正文使用SendMail方法发送邮件示例代码 发送带附件的邮件邮件多部分…

STM32之五:TIM定时器(2-通用定时器)

目录 通用定时器&#xff08;TIM2~5&#xff09;框图 1、 输入时钟源选择 2、 时基单元 3 、输入捕获&#xff1a;&#xff08;IC—Input Capture&#xff09; 3.1 输入捕获通道框图&#xff08;TI1为例&#xff09; 3.1.1 滤波器&#xff1a; 3.1.2 边沿检测器&#xf…

CesiumJS【Basic】- #058 绘制网格填充多边形(Entity方式)-使用shader

文章目录 绘制网格填充多边形(Entity方式)-使用shader1 目标2 代码2.1 main.ts绘制网格填充多边形(Entity方式)-使用shader 1 目标 使用Entity方式绘制绘制网格填充多边形 - 使用shader 2 代码 2.1 main.ts import * as Cesium from cesium;// 创建 Cesium Viewer 实例…

安装Gitlab+Jenkins

GItlab概述 GitLab概述&#xff1a; 是一个利用 Ruby on Rails 开发的开源应用程序&#xff0c;实现一个自托管的Git项目仓库&#xff0c;可通过Web界面进行访问公开的或者私人项目。 Ruby on Rails 是一个可以使你开发、部署、维护 web 应用程序变得简单的框架。 GitLab拥有与…

ESP32-VScode环境设置

目录 前言 一、安装VSCode 二、安装ESP32环境 1.安装ESP-IDF 2.ESP-IDF设置 3:开始配置环境 4.打开example进行验证 5.烧录 6.调整波特率 总结 前言 环境&#xff1a;Visual Studio Code 芯片&#xff1a;ESP32 说实话&#xff0c;这是我装的时间最长的一个环境&…

C++ 和C#的差别

首先把眼睛瞪大&#xff0c;然后憋住一口气&#xff0c;读下去&#xff1a; 1、CPP 就是C plus plus的缩写&#xff0c;中国大陆的程序员圈子中通常被读做"C加加"&#xff0c;而西方的程序员通常读做"C plus plus"&#xff0c;它是一种使用非常广泛的计算…

【分布式系统】监控平台Zabbix对接grafana

以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署&#xff08;命令截图版&#xff09;-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 一.安装grafana并启动 添加一台服务器192.168.80.104 初始化操作 systemctl disable --now firewalld set…

运维锅总浅析云原生DevOps工具

本文从Tekton与Kubevela、Jenkins、GitLab CI的区别与联系对常见的云原生DevOps工具进行对比分析&#xff0c;最后给出DevOps工具选型思路。希望对您有所帮助&#xff01; 一、DevOps简介 DevOps是一种结合了软件开发&#xff08;Development&#xff09;和IT运维&#xff08…

【代码随想录】【算法训练营】【第56天】 [卡码98]所有可达路径

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 56&#xff0c;周二&#xff0c;继续ding~ 题目详情 [卡码98] 所有可达路径 题目描述 卡码98 所有可达路径 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言…

python - 列表 / 元组 / 字符串

一.列表 由于pyhon的变量没有数据类型&#xff0c;所以python是没有数组的&#xff08;因为数组只能存放一种类型&#xff0c;要么全部存放整型&#xff0c;要么全部存放浮点型&#xff09;&#xff0c;只有列表list&#xff0c;所以整数&#xff0c;浮点数&#xff0c;字符串…

【Python】成功解决TypeError: ‘float‘ object cannot be interpreted as an integer

【Python】成功解决TypeError: ‘float’ object cannot be interpreted as an integer 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主…

【UE5.3】笔记6-创建可自由控制Pawn类

搭建场景 搭建一个场景&#xff1a;包含地板、围墙。可以根据喜好加一些自发光的效果。 增加食物 创建食物蓝图类&#xff0c;在场景里放置一些食物以供我们player去吃掉获取分值。 创建可控制的layer 我们先右键创建一个蓝图继承自pawn类&#xff0c;起名BP_Player&#xf…

视图库对接系列(GA-T 1400)四、视图库对接系列(本级)注册

视图库对接系列(本级)注册 在之前的步骤中&#xff0c;我们已经把项目大体的架构已经写出来了。那我们就来实现注册接口。 GA-T 1400中的步骤如下&#xff1a; 这里的话&#xff0c;我们实现的简单点&#xff0c; 我们不进去鉴权&#xff0c;也就是设备或平台找我们注册的话&…

VideoPrism——探索视频分析领域模型的算法与应用

概述 论文地址:https://arxiv.org/pdf/2402.13217.pdf 视频是我们观察世界的生动窗口&#xff0c;记录了从日常瞬间到科学探索的各种体验。在这个数字时代&#xff0c;视频基础模型&#xff08;ViFM&#xff09;有可能分析如此海量的信息并提取新的见解。迄今为止&#xff0c;…

Rustdesk如何编译代码实现安装后不会显示主界面,不会在右下角出现托盘图标,作为后台服务运行

环境&#xff1a; Rustdesk1.1.9 问题描述&#xff1a; Rustdesk如何编译代码实现安装后不会显示主界面&#xff0c;不会在右下角出现托盘图标&#xff0c;作为后台服务运行 解决方案&#xff1a; 可以自定义进程名称和图标&#xff0c;不会显示主界面&#xff0c;不会在…

小试牛刀-区块链代币锁仓(Web页面)

Welcome to Code Blocks blog 本篇文章主要介绍了 [区跨链代币锁仓(Web页面)] ❤博主广交技术好友&#xff0c;喜欢我的文章的可以关注一下❤ 目录 1.编写目的 2.开发环境 3.实现功能 4.代码实现 4.1 必要文件 4.1.1 ABI Json文件(LockerContractABI.json) 4.2 代码详解…

uniapp + vite中 uni.scss 使用 /deep/ 不生效(踩坑记录三)

vite 中使用 /deep/ 进行样式穿透报错 原因&#xff1a;vite 中不支持&#xff0c;换成 ::v-deep 或:deep即可

linux应用开发基础知识(八)——内存共享(mmap和system V)

mmap内存映射 内存共享定义 内存映射&#xff0c;简而言之就是将用户空间的一段内存区域映射到内核空间&#xff0c;映射成功后&#xff0c;用户对这段内存区域的修改可以直接反映到内核空间&#xff0c;同样&#xff0c;内核空间对这段区域的修改也直接反映用户空间。那么对…
最新文章