프로그래밍/RabbitMQ

[RabbitMQ] 미러링

Victory_HA 2023. 5. 3. 10:11

RabbitMQ 미러링

  • RabbitMQ Mirroring은 RabbitMQ Cluster 안에서 Meesage를 다수의 RabbitMQ에 복사하여 저장하는 기법입니다.
  • Master Queue는 원본 Queue를 의미하며 Slave Queue는 Master Queue를 복제한 Queue를 의미합니다. 각 Master Queue마다 다른 개수의 Slave Queue를 설정 할 수 있습니다.
  • Master Queue와 Slave Queue 사이의 Mirroring은 기본적으로 Sync 방식입니다.
    • ex> Producer가 Mirroring된 Queue에게 Message를 전송하면,
    • 받은 Message를 Master Queue에만 넣은 후,
    • 모든 Slave Queue와 Mirroring이 완료된 후에야 Producer에게 ACK를 보냅니다.
    • 이시점에서 Master Queue가 실패하면 Slave Queue가 Master Queue로 승격되고, 데이터 손실없이 사용 가능한 상태로 유지됩니다.
    • 따라서 Slave Queue의 개수가 많아질수록 Message 처리량이 떨어집니다.
  • 미러링은 HA를 위한 기법이지 Message 처리량 향상을 위한 기법이 아닙니다.
    • Slave Queue가 있어도 Producer의 모든 Message는 오직 Master Queue로만 전달되고,
    • Consumer에게 전달되는 Message는 오직 Master Queue로부터 전송되는 Message입니다.
    • Slave Queue는 오직 Master Queue와 Mirroring하는 동작만을 수행합니다.
    • Slave Queue의 개수를 늘려도 Message 처리량은 분산되지 않습니다.
  • Mirroring 정책이 변경되거나, Cluster에 새로운 RabbitMQ가 추가되면서 새로운 Slave Queue도 추가 될 수 있습니다.
    • 새로운 Slave Queue는 처음에는 아무런 Message가 없는 빈 상태를 유지합니다.
    • 오직 Slave Queue가 생성된 이후 Master Queue가 받은 새로운 Message들만 복사하여 가져옵니다.

Queue 선언 시 레플리카 설정 (Mirrored Queues)

  • Queue선언 시 레플리카 설정을 할 수 있습니다.
  • 레플리카는 특정 큐에 대하여 복제본을 만드는 기능입니다.
    • 미러링은 RabbitMQ 시스템 전체 복제입니다.

Mirrored Queues의 단점

  • 브로커가 재시작이 되면 Slave Queue에 있던 모든 데이터가 삭제되는 문제가 있고,
  • Slave Queue가 다시 온라인 상태가 되었지만 비어 있으므로 Master Queue는 미러 동기화 여부를 결정할 수 있습니다.
  • 이 동기화가 될때 메세지가 많으면 그동안 쌓인 메시지 때문에 메모리 부족현상 혹은 다른 문제가 발생할 수 있습니다.

Quorum Queues

  • 다중 노드 환경에서 메시지 손실 없이 안정적인 메시지 전달을 보장하는 큐입니다.
  • 기존의 Mirrored Queues는 하나의 노드에 저장된 메시지를 다른 노드로 복제하는 방식이었기 때문에, 하나의 노드에서 장애가 발생하면 해당 노드에서 처리되는 모든 메시지가 유실될 수 있었습니다.
  • 하지만 Quorum Queues는 여러 노드에 메시지를 분산해서 저장하기 때문에, 하나의 노드에 장애가 발생해도 다른 노드에 저장된 메시지를 사용할 수 있어 안정적인 메시지 전달을 보장합니다.
  • Quorum Queues는 다른 큐와 동일하게 사용 가능하며, 큐 생성 시 quorum 옵션을 사용하여 Quorum Queues로 생성할 수 있습니다.
  • Quorum Queues의 레플리카 기능과 달리 모든 노드에 대한 쓰기 권한이 있어 다중 노드 환경에서 안정적인 메시지 전달을 보장합니다.
  • Quorum Queues는 odd-numbered(홀수) cluster 노드 구성을 권장합니다.
    • 짝수 노드 구성에서는 "split-brain"과 같은 문제가 발생할 수 있습니다.