본문 바로가기

Docker

Docker 에 rabbitmq 설치

728x90
반응형
docker pull  rabbitmq:3-management

management image를 받지 않으면 대시보드를 사용할 수 없다.

 

docker run -d --hostname rabbit --name rabbit -p5672:5672 -p 15672:15672 rabbitmq:3-management

-e RABBITMQ_DEFAULT_USER=username -e RABBITMQ_DEFAULT_PASS=password 

컨테이너에 올리면서 username과 비밀번호를 설정할 수 있다 

 

 

default 계정 : guest / guest 


rabbitmq cluster 구성 방법

 

docker run -d --name rabbitmq_node1 -h rabbitmq_node1 -it --network prod -p "15672:15672" -p "5672:5672" -p "25672:25672" -p "35197:35197" -e RABBITMQ_DEFAULT_USER="admin" -e RABBITMQ_DEFAULT_PASS="admin" -e RABBITMQ_ERLANG_COOKIE="mycookie" rabbitmq:3.8-management

docker run -d --name rabbitmq_node2 -h rabbitmq_node2 
-it --network prod 
-p "15673:15672" 
-p "5673:5672" 
-p "25673:25672" 
-p "35198:35197" 
-e RABBITMQ_DEFAULT_USER="admin" 
-e RABBITMQ_DEFAULT_PASS="admin" 
-e RABBITMQ_ERLANG_COOKIE="mycookie" 
rabbitmq:3.8-management

node1과 node2를 컨테이너로 띄운다.

node2에 bash로 접속

$ docker exec -it {node2} bash

# rabbitmq 앱을 종료한다.
$ rabbitmqctl stop_app

# join_cluster를 이용해 조인한다.
$rabbitmqctl join_cluster rabbit@rabbitmq_node1

# 앱을 실행한다.
$rabbitmqctl start_app

 

Node1에서 cluster_status 확인

 

Dashboard에서 확인


docker-compose.yml

version: "3.6"
services:
  rabbitmq-01:
    image: rabbitmq:3.8-management
    hostname: rabbitmq-01    
    networks:
      - prod
    volumes:
      - C:\Users\Administrator\Desktop\rabbitmq\data1:/var/lib/rabbitmq
    configs:
      - source: rbconfig
        target : /etc/rabbitmq/rabbitmq.conf
      - source: cookie
        target : $HOME/.erlang.cookie
    deploy:
      mode: global
      placement:
        constraints: [node.labels.rabbitmq1 == true]
        
  rabbitmq-02:
    image:  rabbitmq:3.8-management
    hostname: rabbitmq-02    
    networks:
      - prod
    volumes:
      - C:\Users\Administrator\Desktop\rabbitmq\data2:/var/lib/rabbitmq
    configs:
      - source: rbconfig
        target : /etc/rabbitmq/rabbitmq.conf
      - source: cookie
        target : $HOME/.erlang.cookie
    deploy:
      mode: global
      placement:
        constraints: [node.labels.rabbitmq2 == true]
        
  rabbitmq-03:
    image: rabbitmq:3.8-management
    hostname: rabbitmq-03
    networks:
      - prod
    volumes:
      - C:\Users\Administrator\Desktop\rabbitmq\data3:/var/lib/rabbitmq
    configs:
      - source: rbconfig
        target : /etc/rabbitmq/rabbitmq.conf
      - source: cookie
        target : $HOME/.erlang.cookie
    deploy:
      mode: global
      placement:
        constraints: [node.labels.rabbitmq3 == true]
        
networks:
  prod:
    external: true
 
configs:
  rbconfig:
      file: ./config/rabbitmq.conf
  cookie:
      file: ./config/.erlang.cookie

 

rabbitmq.conf

loopback_users.guest = false
listeners.tcp.default = 5672
default_pass = Passw0rd
default_user = admin
management.tcp.port = 15672
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-01
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-02
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-03

 

.erlang.cookie

mycookie

 

 

haproxy docker compose

version: "3.8"
services:
  haproxy:
    image: olgac/haproxy-for-rabbitmq:1.8.14-alpine
    ports:
      - 15672:15672
      - 5672:5672
      - 1936:1936
    networks:
      - prod
    deploy:
      mode: global
networks:
  prod:
    external: true

rabbitmq  미러링 

rabbitmq message queue는 클러스터내에 각각 존재함.

Exchange와 Binding은 공유되지만 queue는 각각 가지고 있는데 

가지고 있는 노드가 다운되면 데이터 유실될 수 있다.

 

고가용성을 위해 rabbitmq 미러링을 제공한다.

클러스터링된 노드내에 queue가 복제되어 저장된다. 

 

rabbitmqctl set_policy test-all "^test\\." '{"ha-mode":"all"}'

# test-all은 새로 추가되는 정책의 이름, ^test\.은 regexp로 표현된 미러링할 queue 이름, 뒤의 json은 정책 세부 사항

 

test로 시작하는 queue를 복제

 

https://www.rabbitmq.com/ha.html#non-mirrored-queue-behavior-on-node-failure

728x90
반응형