当前位置:   article > 正文

DockerCompose部署RabbitMQ集群_docker-compose rabbitmq pass

docker-compose rabbitmq pass

DockerCompose部署RabbitMQ集群

最近小黄在工作中正好需要部署RabbitMQ集群,借此来记录一下,也希望可以帮助到大家

前置条件

简单介绍一下咱们公司现有的条件以及想要达成的效果

服务器3台,3台都是属于一个专有网络中,也就是说3台机子形成局域网,可以互相访问

  • ServerA:有公网ip的服务器,可以访问公网
  • ServerB:只有私网的服务器,需要通过ServerA来访问公网
  • ServerC:同ServerB

因为ServerA的内存占用已经比较高了,所以小黄的想法是在ServerB、ServerC上各部署一个RabbitMQ形成集群,因为程序也是跑在局域网中,所以不需要向外暴露5672端口,只需要在ServerA上通过反向代理暴露15672端口即可

修改hosts文件,让他们通过ServerA这种命名的方式访问各自的ip

172.16.0.130 ServerA
172.16.0.131 ServerB
172.16.0.132 ServerC
  • 1
  • 2
  • 3

部署RabbitMQ

小黄采用的是DockerCompose方式部署,这里刚开始小黄就踩坑了

拉镜像

因为ServerB、ServerC没办法直接去docker仓库拉镜像,所以需要在ServerA上拉镜像在传到私网服务器上

# ServerA上执行
# 拉镜像,这里要注意的是,一定要拉management,只有management才有可视化管理页面的插件
docker pull rabbitmq:management

# 导出镜像
docker save -o rabbitmq.tar rabbitmq:management

# 发送文件到ServerB、ServerC
rsync -av /root/docker-images/rabbitmq.tar ServerB:/root

# ServerB、ServerC上执行
docker load -i rabbitmq.tar
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

docker-compose.yml

接下来需要编写docker-compose.yml文件,以ServerB来介绍,ServerC只是需要讲ServerB修改成ServerC即可

version: "3.2"
services:
  rabbitmq:
    image: rabbitmq:management
    container_name: rabbitmq
    restart: on-failure:5
    # 对应host文件
    hostname: ServerB
    # 这个是向容器内部添加hosts文件,这里需要与ServerC形成集群,所以要写ServerC的地址
    extra_hosts:
      - "ServerC:172.16.0.132"
    ports:
      - "4369:4369"
      - "5672:5672"
      - "15672:15672"
      - "25672:25672"
    volumes:
      - ./data:/var/lib/rabbitmq
      - ./erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
      - RABBITMQ_NODENAME=rabbit@ServerB # 节点名称
    networks:
      - rabbitmq-network

networks:
  rabbitmq-network:
    driver: bridge
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

接下来要解释几个关键信息

暴露端口

5672、15672就不介绍了,这里注意安全组得开放这些端口,出方向、入方向都需要

  • 4369:这是 Erlang 分布式节点之间通信的 epmd(Erlang Port Mapper Daemon)端口。epmd 是一个用于管理 Erlang 节点之间通信的守护进程,它负责维护一个节点注册表,以便其他节点可以发现和连接到正在运行的节点。在 RabbitMQ 集群中,节点之间使用 epmd 来进行通信和发现。
  • 25672:这是 RabbitMQ 节点之间的 AMQP 0-9-1 协议端口。在 RabbitMQ 集群中,节点之间使用此端口进行内部通信,包括集群节点之间的消息传递和状态同步。

.erlang.cookie

.erlang.cookie存储了一串密钥,这个可以自定义,需要加入相同的集群,就需要里面的编码一致,我这边采取挂载的方式来修改,也可以进入容器内部修改

搭建集群

在ServerB、ServerC上启动RabbitMQ,在mq中是不存在主节点、子节点的关系的,但我还是比较习惯这样称呼,目前讲ServerB作为主节点,ServerC来主动加入该集群成为子节点

# 进入ServerC上的容器
docker exec -it rabbitmq /bin/bash

rabbitmqctl stop_app
rabbitmqctl reset
# 加入集群,rabbit@ServerB要对应上面设置的RABBITMQ_NODENAME
# --ram将消息存储在内存中,不加则存储在磁盘空间,这取决于个人
rabbitmqctl join_cluster --ram rabbit@ServerB
rabbitmqctl start_app
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

执行完之后,就可以查看集群信息

rabbitmqctl cluster_status
  • 1

看到这个输出,集群就搭建成功了

image-20231214105111561

测试

在ServerB上创建队列、交换机、绑定关系并且发送信息,在ServerC上也可以获取到这些信

# 执行这些操作前,需要向创建用户、授予权限
# 创建新用户
rabbitmqctl add_user your_username your_password

# 授予管理员权限
rabbitmqctl set_user_tags your_username administrator

# 授予访问虚拟主机的权限
rabbitmqctl set_permissions -p / your_username ".*" ".*" ".*"

# 创建队列
rabbitmqadmin declare queue name=<队列名称> --username=username --password=password

# 创建交换机
rabbitmqadmin declare exchange name=<交换机名称> type=<交换机类型> --username=username --password=password

# 绑定队列到交换机
rabbitmqadmin declare binding source=<交换机名称> destination=<队列名称> routing_key=<路由键> --username=username --password=password

# 向交换机发送消息
rabbitmqadmin publish exchange=your_exchange_name routing_key=your_routing_key payload="Your message content" --username=username --password=password

# 查看队列中的消息
rabbitmqadmin get queue=your_queue_name --username=username --password=password
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

在小黄的一系列测试中,发现一个问题,向ServerB中发送消息后,消息其实是存在ServerB上的,ServerC上并没有存储该消息的内容

也就是说现在的集群只能做到一部分的功能,当程序连接到某一个RabbitMQ节点时,他会自动发现集群,加入到集群中,当ServerB挂掉之后,ServerC可以继续承担消息收发的功能,当时ServerB挂掉之前假如队列中有消息没处理完,那这些消息将不复存在,也就是说会出现消息丢失的情况

镜像队列

  • 优点:镜像队列会将队列中的消息在集群中的多个节点之间进行复制。这样,无论消息最初被发送到哪个节点,它都会被复制到其他节点上,确保即使某个节点发生故障,消息仍然可以被其他节点消费,提供冗余和高可用性

  • 缺点:资源消耗

使用正则表达式"^myqueue.*"来匹配myqueue开头的队列

rabbitmqctl set_policy ha-all "^myqueue.*" '{"ha-mode":"all"}' --priority 0 --apply-to queues
  • 1

如果设置所有队列都为镜像队列

rabbitmqctl set_policy ha-all ".*" '{"ha-mode":"all"}' --apply-to queues
  • 1

再次测试,发现ServerB即使挂掉,还是可以从ServerC上读取数据

反向代理

我们还是用docker compose的方式来部署nginx,只暴露我们需要的端口

version: "3.2"
services:
  nginx:
    image: nginx:stable-perl
    container_name: nginx-middleware
    user: root
    privileged: true
    ports:
      - "15672:15672"
    volumes:
      - /root/nginx-middleware/html:/usr/share/nginx
      - /root/nginx-middleware/conf/nginx.conf:/etc/nginx/nginx.conf
      - /root/nginx-middleware/log:/var/log/nginx
    environment:
      - TZ=Asia/Shanghai
      - LANG=C.UTF-8
      - LC_ALL=C.UTF-8
    networks:
      nginx-middleware:
        aliases: 
          - nignx-ware
    logging:
      driver: "json-file"
      options:
        max-size: "30m"

networks:
  nginx-middleware: 
    external: true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

nginx.conf

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    server {
        listen 15683;
        server_name 外网ip;

        location / {
            proxy_pass http://私网服务器ip:15672;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这里有一个很坑的点,记录一下,当时配的proxy_pass http://私网服务器ip:15672/,因为结尾多了一个斜杠,导致只能访问管理页面主界面,其他请求全都是404

小Tip

必须要保证安全组开放了15672端口,授权对象0.0.0.0

之前小黄只是授权了私网ip可以访问,导致telnet访问不不通

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/414439
推荐阅读
相关标签
  

闽ICP备14008679号