用 docker-compose 搭建一個 rabbitmq 叢集

ponponon發表於2023-05-12

當您使用Docker Compose時,可以使用RabbitMQ的官方Docker映象來構建RabbitMQ叢集。下面是一個簡單的docker-compose.yml檔案示例,用於啟動一個由3個RabbitMQ節點組成的叢集:

version: '3'

services:
  rabbitmq-node1:
    image: rabbitmq:3.9.5-management-alpine
    environment:
      - RABBITMQ_ERLANG_COOKIE=cookie
      - RABBITMQ_NODENAME=rabbit@rabbitmq-node1
      - RABBITMQ_USE_LONGNAME=true
    ports:
      - 5672:5672
      - 15672:15672
    volumes:
      - rabbitmq-node1-data:/var/lib/rabbitmq
    networks:
      rabbitmq-network:
        aliases:
          - rabbitmq-node1

  rabbitmq-node2:
    image: rabbitmq:3.9.5-management-alpine
    environment:
      - RABBITMQ_ERLANG_COOKIE=cookie
      - RABBITMQ_NODENAME=rabbit@rabbitmq-node2
      - RABBITMQ_USE_LONGNAME=true
      - RABBITMQ_CLUSTER_NODE_TYPE=disc
      - RABBITMQ_CLUSTER_DISC_RAM_NODE_NAME=rabbit@rabbitmq-node1
    volumes:
      - rabbitmq-node2-data:/var/lib/rabbitmq
    networks:
      rabbitmq-network:
        aliases:
          - rabbitmq-node2

  rabbitmq-node3:
    image: rabbitmq:3.9.5-management-alpine
    environment:
      - RABBITMQ_ERLANG_COOKIE=cookie
      - RABBITMQ_NODENAME=rabbit@rabbitmq-node3
      - RABBITMQ_USE_LONGNAME=true
      - RABBITMQ_CLUSTER_NODE_TYPE=disc
      - RABBITMQ_CLUSTER_DISC_RAM_NODE_NAME=rabbit@rabbitmq-node1
    volumes:
      - rabbitmq-node3-data:/var/lib/rabbitmq
    networks:
      rabbitmq-network:
        aliases:
          - rabbitmq-node3

volumes:
  rabbitmq-node1-data:
  rabbitmq-node2-data:
  rabbitmq-node3-data:

networks:
  rabbitmq-network:

在這個示例中,我們定義了三個RabbitMQ節點:rabbitmq-node1,rabbitmq-node2和rabbitmq-node3,它們都執行RabbitMQ官方Docker映象(帶有RabbitMQ管理外掛)。我們使用了Docker Compose的networks配置項,將所有節點連線到同一個網路中,並指定了每個節點的別名。我們還使用了volumes配置項,為每個節點掛載了一個資料卷,用於持久化RabbitMQ資料。

在rabbitmq-node2和rabbitmq-node3節點的environment部分中,我們使用了RabbitMQ的叢集配置選項,以將節點加入到RabbitMQ叢集中。RABBITMQ_CLUSTER_NODE_TYPE=disc表示這是一個磁碟節點(即資料會被持久化到磁碟),RABBITMQ_CLUSTER_DISC_RAM_NODE_NAME=rabbit@rabbitmq-node1表示這個節點是rabbitmq-node1節點的磁碟節點。這樣就可以將所有節點連線到同一個RabbitMQ叢集中。

最後,我們使用了ports配置項,使得我們可以在本地訪問RabbitMQ管理介面和AMQP協議埠。在這個示例中,我們將RabbitMQ的AMQP埠對映到主機的5672埠,將RabbitMQ管理介面的埠對映到主機的15672埠。

啟動RabbitMQ叢集,只需要在docker-compose.yml檔案所在的目錄中執行以下命令:

docker-compose up -d

這會啟動一個由3個RabbitMQ節點組成的叢集。您可以使用docker-compose ps命令檢查叢集的狀態:

docker-compose ps

輸出應該類似於:

     Name                    Command              State               Ports             
----------------------------------------------------------------------------------------
rabbitmq-node1   docker-entrypoint.sh rabbi ...   Up      0.0.0.0:15672->15672/tcp,      
                                                          0.0.0.0:5672->5672/tcp         
rabbitmq-node2   docker-entrypoint.sh rabbi ...   Up      15672/tcp, 5672/tcp             
rabbitmq-node3   docker-entrypoint.sh rabbi ...   Up      15672/tcp, 5672/tcp             

現在,您可以透過http://localhost:15672訪問RabbitMQ管理介面,在“Nodes”選項卡中檢視所有節點是否成功連線到叢集中。您還可以使用任何AMQP客戶端庫連線到RabbitMQ叢集,使用amqp://localhost:5672作為連線字串。

注意:RabbitMQ叢集的配置非常靈活,您可以根據自己的需求進行調整。如果您想了解更多關於RabbitMQ叢集的資訊,請參閱RabbitMQ官方文件。

如果您需要新增或刪除節點,只需修改docker-compose.yml檔案中的scale屬性即可。例如,如果您想新增一個新的節點,只需執行以下命令:

docker-compose up -d --scale rabbitmq-node=4

這將在叢集中新增一個新的節點。同樣地,如果您想刪除一個節點,只需將scale屬性設定為更小的值即可。

最後,當您想停止RabbitMQ叢集時,只需執行以下命令:

docker-compose down

這將停止並刪除RabbitMQ容器和網路。

希望這個示例可以幫助您搭建一個RabbitMQ叢集。如果您遇到了任何問題,可以檢視官方文件或在社群論壇中尋求幫助。

相關文章