rabbitmq+nginx负载服务部署文档

news/2024/10/5 21:50:25/

前言

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_71">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_139">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_257">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_278">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.ppmy.cn/news/1473989.html

相关文章

【C++】stack和queue的模拟实现 双端队列deque的介绍

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 &#x1f308;前言&#x1f525;stack的模拟实现&#x1f525;queue的模拟实现&#x1f525;deque&#xff08;双端队列&#xff09;deque的缺陷 &#x1f308;为什么选择…

uniapp/Android App上架三星市场需要下载所需要的SDK

只需添加以下一个权限在AndroidManifest.xml <uses-permission android:name"com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>uniapp开发的&#xff0c;需要在App权限配置中加入以上的额外权限&#xff1a;

PyQT: 开发一款ROI绘制小程序

在一些基于图像或者视频流的应用中&#xff0c;比如电子围栏/客流统计等&#xff0c;我们需要手动绘制一些感兴趣&#xff08;Region of Interest&#xff0c;简称ROI&#xff09;区域。 在这里&#xff0c;我们基于Python和PyQt5框架开发了一款桌面应用程序&#xff0c;允许用…

k8s record 20240705

k8s 安全管理 request 是1g&#xff0c;你得不到要求&#xff0c;我就不创建了&#xff0c;这就是准入控制二次校验 SA就是serviceAccount。 内部是SA和 token, 外部用户进来就是 .kube/config文件 namespace下的是role&#xff0c;整个集群是 ClusterRole. 动作就是Binding li…

【Oracle】Oracle常用语句大全

目录 创建/删除数据库创建/删除表其他表操作增加字段修改字段重命名字段删除字段 主键/索引/视图相关数据插入数据更新数据删除字段拼接merge into语法案例素材同时更新和插入记录同步错误 分页查询分组查询/筛选排序连接查询1. 内连接&#xff08;INNER JOIN&#xff09;&…

工厂自动化相关设备工业一体机起到什么作用?

在当今的制造业领域&#xff0c;工厂自动化已成为提高生产效率、保证产品质量和降低成本的关键。在这一进程中&#xff0c;工业一体机作为一种重要的设备&#xff0c;发挥着不可或缺的作用。 工业一体机是自动化生产线上的控制中心。它能够整合和处理来自各个传感器、执行器和其…

从零开始的python学习生活1

python函数的对返回值 本来多个return是不行的 这种语法就能接受多个返回值 def hanshu():return 1,"hello",True x,y,z hanshu() print(x) print(y) print(z)函数的多种传参方式 提前说明白了顺序就无所谓了 关键字传递一个传递参数&#xff0c;一个传递键值…

深入Django(四)

Django模板系统 引言 在之前的几天中&#xff0c;我们介绍了Django的基本概念、模型和视图。今天我们将探讨Django的模板系统&#xff0c;它负责将数据和HTML模板结合起来&#xff0c;生成最终用户看到的内容。 Django模板系统概述 Django的模板系统是一个强大的工具&#…