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"과 같은 문제가 발생할 수 있습니다.
- https://backtony.github.io/spring/2021-09-21-spring-rabbitmq-1/
- https://hmj2088.medium.com/rabbitmq-quorum-queue-440e28bf38bf
- https://www.cloudamqp.com/blog/part2-rabbitmq-best-practice-for-high-performance.html
- https://www.cloudamqp.com/blog/part3-rabbitmq-best-practice-for-high-availability.html
- https://www.cloudamqp.com/blog/moving-from-classic-mirrored-queues-to-quorum-queues.html
'프로그래밍 > RabbitMQ' 카테고리의 다른 글
[RabbitMQ] 스트림 (0) | 2023.09.05 |
---|---|
[RabbitMQ] 클러스터 구성하기 - Linux (0) | 2023.09.05 |
[RabbitMQ] 클러스터링 (0) | 2023.05.03 |
[RabbitMQ] 성능 향상 위한 가이드 (0) | 2023.04.28 |
[RabbitMQ] 메시지 송수신 - RoutingKey (0) | 2023.04.19 |