rabbitmq高可用踩坑记:docker搭建rabbitmq集群

前言:

本节内容是关于rabbitmq高可用集群的部署搭建,使用的是ubuntu22系统,我们准备三台服务器并启动docker作为rabbitmq的高可用容器,rabbitmq集群本身不是天然支持高可用的,我们通过配置rabbitmq服务器的镜像队列,以确保消息可以在集群中的多个节点上进行复制存储,提高可用性和容错性,避免单节点故障

准备(修改主机名和域名解析hosts文件):

serveriphostname
rabbitmq10.0.1.21node01
rabbitmq10.0.1.22node02
rabbitmq10.0.1.23node03

1、rabbitmq镜像准备

本地下载:docker pull rabbitmq:3.8.16-management
打包: docker save -o rabbitmq.tar rabbitmq:3.8.16-management
上传:
	scp  rabbitmq.tar ubuntu@10.0.1.21:/home/rabbitmq/
	scp  rabbitmq.tar ubuntu@10.0.1.22:/home/rabbitmq/
	scp  rabbitmq.tar ubuntu@10.0.1.23:/home/rabbitmq/
解压: tar -xvf rabbitmq.tar
加载镜像:docker load -i rabbitmq.tar
查看镜像信息: docker  images

注:如果虚拟机支持可以直接拉镜像 直接启动就ok

2、创建挂载目录,并给相应权限(三台机器操作一样)

mkdir /var/lib/rabbitmq
chmod 777 /var/lib/rabbitmq
mkdir /var/log/rabbitmq
chmod 777 /var/log/rabbitmq
 (**注意cookie可以自己指定但是三台机器都要一致**)
 echo "YOUR_SECRET_COOKIE" > /var/lib/rabbitmq/.erlang.cookie
chmod 600 /var/lib/rabbitmq/.erlang.cookie

3、创建编辑docker-compose.yaml

node01-docker-compose:

version: "3.1"
services:
  rabbitmq:
    image: rabbitmq:3.8.16-management
    container_name: rabbitmq1
    network_mode: "host"
    privileged: true
    volumes:
     - /var/lib/rabbitmq:/var/lib/rabbitmq  
     - /var/log/rabbitmq:/var/log/rabbitmq   
    environment:
      - RABBITMQ_DEFAULT_USER=rabbitmq
      - RABBITMQ_DEFAULT_PASS=rabbitmq2023      
    restart: always	

node02-docker-compose:

version: "3.1"
services:
  rabbitmq:
    image: rabbitmq:3.8.16-management
    container_name: rabbitmq2
    network_mode: "host"
    privileged: true
    volumes:
     - /var/lib/rabbitmq:/var/lib/rabbitmq  
     - /var/log/rabbitmq:/var/log/rabbitmq   
    environment:
      - RABBITMQ_DEFAULT_USER=rabbitmq
      - RABBITMQ_DEFAULT_PASS=rabbitmq2023      
    restart: always	

node03-docker-compose:

version: "3.1"
services:
  rabbitmq:
    image: rabbitmq:3.8.16-management
    container_name: rabbitmq3
    network_mode: "host"
    privileged: true
    volumes:
     - /var/lib/rabbitmq:/var/lib/rabbitmq  
     - /var/log/rabbitmq:/var/log/rabbitmq   
    environment:
      - RABBITMQ_DEFAULT_USER=rabbitmq
      - RABBITMQ_DEFAULT_PASS=rabbitmq2023      
    restart: always	

4、启动 docker-compose up -d (三台机器都一样)

查看镜像  docker ps -a

查看图形化页面:http://:15672  (如果自己指定端口用自己指定的)

5、配置集群

node01:

docker exec rabbitmq1 /bin/bash -c 'rabbitmqctl stop_app'

docker exec rabbitmq1 /bin/bash -c 'rabbitmqctl reset'

docker exec rabbitmq1 /bin/bash -c 'rabbitmqctl start_app'

docker exec rabbitmq1 /bin/bash -c 'rabbitmq-plugins enable rabbitmq_management'
docker exec rabbitmq1 /bin/bash -c 'rabbitmq-plugins enable rabbitmq_prometheus'

node02:

docker exec rabbitmq2 /bin/bash -c ''

docker exec rabbitmq2 /bin/bash -c 'rabbitmqctl reset'

docker exec rabbitmq2 /bin/bash -c 'rabbitmqctl join_cluster rabbit@node01'

docker exec rabbitmq2 /bin/bash -c 'rabbitmqctl start_app'

node03:

docker exec rabbitmq3 /bin/bash -c 'rabbitmqctl stop_app'

docker exec rabbitmq3 /bin/bash -c 'rabbitmqctl reset'

docker exec rabbitmq3 /bin/bash -c 'rabbitmqctl join_cluster rabbit@node01'

docker exec rabbitmq3 /bin/bash -c 'rabbitmqctl start_app'

配置完可访问图形化页面:http://10.0.1.21:15672

6、配置镜像队列

正常情况下,rabbitmq集群并不是高可用的,节点间的数据是不能共享的,需要使用镜像队列同步节点数据,引入镜像队列(Mirror Queue)的机制,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性

node01执行

docker exec rabbitmq1 /bin/bash

所有队列进行镜像,并在集群的3个节点上完成进行,policy的设置命令为

rabbitmqctl set_policy ha-queue-two '^' '{"ha-mode":"exactly","ha-params":3,"ha-sync-mode":"automatic"}'

(当然也可以在图形页面配置—Admin----policies----User policies–按上方的key value 进行手动配置–》到这里rabbitmq的集群就搭建完成了)

7、集成promethues

在promethues.yml添加:
 - job_name: rabbitmq
    metrics_path: 'metrics'
    static_configs:
      - targets: ['10.0.1.21:15692','10.0.1.22:15692','10.0.1.23:15692']
可参考:

global:

  scrape_interval: 15s
  evaluation_interval: 15s
  scrape_timeout: 10s
alerting:
  alertmanagers:
    - static_configs:
        - targets:
           - 10.0.1.31:9093

rule_files:
  - "first_rules.yml"

scrape_configs:
  - job_name: k8s
    metrics_path: /metrics
    static_configs:
      - targets: ['10.0.1.25:9100','10.0.1.26:9100','10.0.1.27:9100','10.0.1.28:9100']
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance
        regex: '10.0.1.25:9100'
        replacement: 'master'
      - source_labels: [__address__]
        target_label: instance
        regex: '10.0.1.26:9100'
        replacement: 'node1'
      - source_labels: [__address__]
        target_label: instance
        regex: '10.0.1.27:9100'
        replacement: 'node2'
      - source_labels: [__address__]
        target_label: instance
        regex: '10.0.1.28:9100'
        replacement: 'node3'
  - job_name: rabbitmq
    metrics_path: 'metrics'
    static_configs:
      - targets: ['10.0.1.21:15692','10.0.1.22:15692','10.0.1.23:15692']
  - job_name: mysql
    static_configs:
      - targets: ['10.0.1.11:9104']
  - job_name: mongodb
    static_configs:
      - targets: ['10.0.1.35:9225']  

配置完成重新加载
curl -X POST http://youprometheus:9090/-/reload

注:docker搭建rabbitmq集群就容易很多也没有涉及到编译的,可以尝试下,溜了溜了

好的,以下是用 Docker 搭建 RabbitMQ 集群的步骤: 1. 首先,确保已经安装了 DockerDocker Compose。 2. 在本地创建一个新的文件夹,用于存储 RabbitMQ 的配置文件和数据。 3. 在该文件夹中创建一个名为 docker-compose.yml 的文件,并将以下内容复制到该文件中: ``` version: '3' services: rabbitmq-node1: image: rabbitmq:3.8-management-alpine hostname: rabbitmq-node1 environment: RABBITMQ_ERLANG_COOKIE: "secret_cookie" RABBITMQ_DEFAULT_USER: "admin" RABBITMQ_DEFAULT_PASS: "admin" ports: - "5672:5672" - "15672:15672" volumes: - ./data/node1:/var/lib/rabbitmq - ./config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf networks: rabbitmq-network: aliases: - rabbitmq-node1 rabbitmq-node2: image: rabbitmq:3.8-management-alpine hostname: rabbitmq-node2 environment: RABBITMQ_ERLANG_COOKIE: "secret_cookie" RABBITMQ_DEFAULT_USER: "admin" RABBITMQ_DEFAULT_PASS: "admin" volumes: - ./data/node2:/var/lib/rabbitmq - ./config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf networks: rabbitmq-network: aliases: - rabbitmq-node2 rabbitmq-node3: image: rabbitmq:3.8-management-alpine hostname: rabbitmq-node3 environment: RABBITMQ_ERLANG_COOKIE: "secret_cookie" RABBITMQ_DEFAULT_USER: "admin" RABBITMQ_DEFAULT_PASS: "admin" volumes: - ./data/node3:/var/lib/rabbitmq - ./config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf networks: rabbitmq-network: aliases: - rabbitmq-node3 networks: rabbitmq-network: driver: bridge ``` 该文件定义了一个 RabbitMQ 集群,由三个节点组成。每个节点都有一个名称、一个主机名、一个环境变量(Erlang cookie、默认用户名和密码)、端口映射、数据卷和网络别名。该文件还定义了一个网络,用于连接三个节点。 4. 在该文件夹中创建一个名为 config 的文件夹,并在其中创建一个名为 rabbitmq.conf 的文件。将以下内容复制到该文件中: ``` cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-node1 cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-node2 cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-node3 ``` 该文件定义了 RabbitMQ 集群的配置,包括节点发现方式和节点列表。 5. 在该文件夹中创建一个名为 data 的文件夹,用于存储 RabbitMQ 节点的数据。 6. 在终端中导航到该文件夹,并运行以下命令: ``` 回复:搭建rabbitmq集群需要使用Docker,可以参考Docker官方文档:https://docs.docker.com/engine/examples/rabbitmq/。好的,以下是如何使用Docker搭建RabbitMQ集群的步骤: 1. 首先,确保您已经在本地安装了Docker,并且已经在命令行中登录到了Docker。 2. 在命令行中输入以下命令,以在Docker中下载和运行RabbitMQ镜像: ``` docker run -d --name rabbitmq-node1 -p 5672:5672 -p 15672:15672 rabbitmq:3.8-management ``` 这将下载最新版本的RabbitMQ,并将其运行在Docker容器中。这里我们指定了两个端口,一个用于AMQP通信(5672),另一个用于Web管理界面(15672)。 3. 等待RabbitMQ容器启动后,您可以使用以下命令在另一个容器中运行第二个RabbitMQ节点: ``` docker run -d --name rabbitmq-node2 -p 5673:5672 -p 15673:15672 --link rabbitmq-node1:rabbit1 rabbitmq:3.8-management ``` 这将启动第二个RabbitMQ容器,并将其链接到第一个容器,以便它们可以互相通信。请注意,我们使用了不同的端口(5673和15673),以便避免与第一个节点的端口冲突。 4. 接下来,您可以使用以下命令启动第三个节点: ``` docker run -d --name rabbitmq-node3 -p 5674:5672 -p 15674:15672 --link rabbitmq-node1:rabbit1 --link rabbitmq-node2:rabbit2 rabbitmq:3.8-management ``` 同样,我们指定了不同的端口,并将此容器链接到前两个容器,以创建一个RabbitMQ集群。 5. 等待第三个节点启动后,您可以使用以下命令检查集群状态: ``` docker exec -it rabbitmq-node1 rabbitmqctl cluster_status ``` 这将显示集群中所有节点的状态。 恭喜!您已经成功地在Docker中部署了一个RabbitMQ集群
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值