yoncho`s blog

[RabbitMQ] 5. RabbitMQ Broker ShutDown 대비 본문

기술, 나의 공부를 공유합니다./MQTT

[RabbitMQ] 5. RabbitMQ Broker ShutDown 대비

욘초 2023. 6. 24. 13:35

1. 시퀀스 다이어그램

2. RabbitMQ Cluster, Queue Mirroring 환경 구축

3. Connection (rabbitmq cluster port) 동적 할당 방법

 

1. RabbitMQ 시퀀스 

정상 연결일 때 부터 Broker가 ShutDown 상태에서 Client 동작까지 흐름

 

2. RabbitMQ Cluster, Mirroring 자동 구축

1. docker-compose.yml 실행 시 3개의 RabbitMQ가 Cluster로 동작하며, Cluster 정책을 설정해 Queue가 Mirroring 됨.

RabbitMQ Cluster - docker-compose.yml 

더보기
version: '3'
services:
  rabbitmq1:
    container_name : rabbitmq1
    image: rabbitmq:3-management
    hostname: rabbit1
    ports:
      - "15672:15672"
      - "5672:5672"
    networks:
      - rabbitmq-network
    environment:
      RABBITMQ_ERLANG_COOKIE: 1234
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest
    command: >
      bash -c "
        rabbitmq-server -detached;
        rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@rabbit1.pid;
        rabbitmqctl set_policy ha-policy-name '^your-queue-name$' '{\"ha-mode\":\"exactly\",\"ha-params\":2}' --apply-to queues
        rabbitmqctl start_app;
        sleep infinity
      "

  rabbitmq2:
    container_name : rabbitmq2
    image: rabbitmq:3-management
    hostname: rabbit2
    networks:
      - rabbitmq-network
    environment:
      RABBITMQ_ERLANG_COOKIE: 1234
    links:
      - rabbitmq1:rabbit1
    command: >
      bash -c "
        rabbitmq-server -detached;
        rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@rabbit2.pid;
        rabbitmqctl stop_app;
        rabbitmqctl join_cluster rabbit@rabbit1;
        rabbitmqctl start_app;
        sleep infinity
      "
    depends_on:
      - rabbitmq1

  rabbitmq3:
    container_name : rabbitmq3
    image: rabbitmq:3-management
    hostname: rabbit3
    networks:
      - rabbitmq-network
    environment:
      RABBITMQ_ERLANG_COOKIE: 1234
    links:
      - rabbitmq1:rabbit1
      - rabbitmq2:rabbit2
    command: >
      bash -c "
        rabbitmq-server -detached;
        rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@rabbit3.pid;
        rabbitmqctl stop_app;
        rabbitmqctl join_cluster rabbit@rabbit1;
        rabbitmqctl start_app;
        sleep infinity
      "
    depends_on:
      - rabbitmq2

networks:
  rabbitmq-network:
    driver: bridge

 

 

3. Connection (rabbitmq cluster port) 동적 할당 방법

1. Client가 Cluster를 구성하는 모든 RabbitMQ의 호스트 정보를 미리 알고 있는 상태

2. HAProxy 사용, Cluster의 모든 RabbitMQ를 단일 Port로 연결 가능

 

1. Client가 Cluster 구성하는 모든 RabbitMQ 정보를 알고 있는 상태

 

2. HAProxy 사용, Cluster의 모든 RabbitMQ를 단일 Port로 연결 가능

HAProxy?

  • 로드 밸런서, 네트워크 스위치에서 제공하는 L4, L7 기능 및 로드 밸런서 기능 제공
    • 로드 밸런싱(Load Balancing) : 부하 분산을 위해 가상 IP를 통해 여러 대의 서버에 접속을 분배하는 기능
      • RabbitMQ 클러스터의 경우 일반적으로 round-robin 방식을 사용하여 요청을 분산 시킵니다.
      • NAT(Network Address Translation) 기능으로 Client는 Port 한개로 접근하면 HAProxy가 내부에서 정의된 RabbitMQ Cluster 구성원(서버)의 port로 연결하며, 주기적으로 구성원(서버)의 상태를 체크한다.
    • L4, L7 기능 :
      • L4 : Transport Layer(IP와 Port) Level - Load Balancing(TCP, UDP)
      • L7 : Application Layer(사용자의 Request) Level - Load Balancing(HTTP, HTTPS, FTP)
  • 설치 쉽고, 서비스 이중화(HA - High Availability) 가능
    • HAProxy 또한 이중화 처리 가능
  • NGINX에 비해 Active Health Check가 가능
    • HAProxy는 RabbitMQ의 상태를 주기적으로 확인하는 Health Check를 설정할 수 있습니다. 이를 통해 HAProxy는 비정상적인 상태인 노드를 감지하고 제외 시킬 수 있음.
  • HAProxy는 포트 포워딩을 설정하여 클라이언트와 RabbitMQ 노드 간의 통신
    • Cluster의 모든 RabbitMQ를 단일 Port로 연결할 수 있음.

 

참조 :
https://leffept.tistory.com/309
https://ko.wikipedia.org/wiki/HAProxy

Comments