2025. 5. 28. 18:30ㆍEMQX
클러스터
EMQX는 고가용성, 장애 허용, 확장성을 갖춘 분산 클러스터 아키텍처를 통해
대규모 클라이언트와 메시지를 안정적으로 처리할 수 있습니다.
EMQX 클러스터는 대규모 애플리케이션에 적합하며 다음과 같은 장점을 제공합니다.
- 확장성
- 고가용성
- 부하 분산
- 중앙 집중식 관리
- 데이터 일관성 및 보안 ⭐
데이터 일관성
EMQX 클러스터에서 가장 중요한 분산 데이터 구조는 라우팅 테이블입니다.
라우팅 테이블은 모든 토픽의 라우팅 정보를 저장하며,
특정 토픽에 게시된 메시지를 어떤 노드가 수신할지 결정하는 데 사용됩니다.
EMQX 클러스터는 ACID 트랜잭션을 통해 모든 Core 노드 간 라우팅 테이블의 일관성을 보장하며,
비동기 복제를 통해 Core 노드에서 Replica 노드로 데이터를 전달해 클러스터 전체의 일관성을 유지합니다.
ACID 트랜잭션
A-Atomicity(원자성), C-Consistency(일관성), I-Isolation(고립성), D-Durability(지속성)
데이터베이스 시스템에서 트랜잭션의 신뢰성과 일관성을 보장하기 위한 네 가지 핵심 속성
데이터 복제 채널
EMQX 클러스터에는 두 개의 데이터 복제 채널이 있습니다.
- 메타데이터 복제: 각 노드가 구독 중인 토픽과 같은 라우팅 정보의 복제를 의미합니다.
- 메시지 전달: 한 노드에서 다른 노드로 메시지를 전달할 때 발생하는 작업을 의미합니다.

PUB/SUB 흐름을 가진 두 가지 데이터 복제 채널에 대한 다이어그램입니다.
- 점선 - 1. 메타데이터 복제
- 실선 - 2. 메시지 전달 채널
EMQX 아키텍처
라우팅 테이블 복제 - 5.0 버전 이전
이전 버전의 EMQX에서는 MQTT 세션 상태 저장에 Erlang/OTP에 내장된 Mnesia 데이터베이스를 사용했습니다.
Mnesia 데이터베이스의 복제 채널은 Erlang 분산 프로토콜을 통해 동작하며,
각 노드는 클라이언트와 서버의 역할을 동시에 수행할 수 있습니다.
Erlang
Erlang은 1980년대 후반 에릭슨에서 개발한 함수형 프로그래밍 언어
고가용성, 분산 처리, 실시간 시스템을 위해 설계
OTP(Open Telecom Platform)
Erlang으로 대규모 시스템을 쉽게 만들 수 있도록 제공하는 표준 라이브러리 + 프레임워크 모음
※ Erlang은 언어, OTP는 언어를 사용하는 프레임워크(Java + Spring과 같은 관계)
Mnesia
Erlang/OTP에 내장된 분산형 NoSQL DB
Erlang VM 안에서 동작하며, Erlang 프로세스처럼 경량이고 속도가 빠름

이전의 풀 메시 토폴로지 구조는 클러스터 규모에 현실적인 한계를 가져옵니다.
이 구조에서는 클러스터의 모든 노드가 서로 직접 연결되어야 하므로,
노드 수가 증가할수록 연결 수가 기하급수적으로 늘어납니다.
그 결과 복제 트래픽이 급증하고, 메시지 전달 및 상태 동기화에 지연이 발생할 수 있습니다.
또한, 하나의 노드에 문제가 생기면 전체 클러스터에 영향을 미칠 가능성이 높아지며,
노드를 추가할수록 운영의 복잡성도 같이 증가합니다.
실제로 이전 버전의 EMQX에서는 클러스터 노드 수를 5개 이하로 구성하는 것을 권장합니다.
EMQX Enterprise 4.3 버전 기준의 벤치마크 환경에서는
하나의 EMQX 클러스터에 최대 1,000만 개의 동시 MQTT 연결을 지원합니다.
현재 Mria 아키텍처
EMQX 5.0은 고객에게 향상된 클러스터 확장성을 제공하기 위해 새로운 Mria 클러스터 아키텍처를 도입하였습니다.
Mria 아키텍처를 사용할 경우 하나의 EMQX 클러스터에서 최대 1억 개의 동시 MQTT 연결을 지원합니다.
Mria 아키텍처
EMQX Labs에서 개발한 하이브리드 클러스터링 아키텍처
Mnesia 기반 풀 메시 구조의 한계를 극복하고, 대규모 분산 MQTT 브로커 시스템 운영 가능

Mria는 비동기 트랜잭션 로그 복제를 지원하는 Mnesia의 향상된 버전입니다.
Mria는 새로운 네트워크 토폴로지를 기반으로 하며, Core 노드와 Replica 노드라는 두 가지 역할의 노드로 구성됩니다.
Core 노드의 동작은 4.x의 Mnesia 노드와 동일합니다.
Core 노드는 풀 메시 방식으로 클러스터를 구성하며, 각 노드는 트랜잭션을 시작하거나 락을 보유하는 등의 역할을 수행합니다.
따라서, EMQX v5에서도 Core 노드는 가능한 한 안정적인 환경에 배포되어야 합니다.
🥸 락을 보유한다
여러 노드 또는 프로세스가 동시에 같은 데이터에 접근하거나 수정하려고 할 때,
충돌이나 불일치를 방지하기 위해 " 락 " 을 걸어 선점권을 확보
락을 보유하고 있는 노드만 해당 작업을 완료할 수 있으며, 작업이 끝나면 락을 해제하여 다른 노드가 접근할 수 있게 함
Replica 노드는 트랜잭션 처리에 직접 관여하지 않으며,
Core 노드와 연결되어 Core 노드로부터 데이터 업데이트를 수동적으로 복제합니다.
Replica 노드는 로컬 데이터의 전체 복사본을 보유하게 되어,
읽기 작업의 효율성을 극대화하고, EMQX 라우팅 지연을 줄이는 데 도움이 됩니다.
또한, 쓰기 작업에 참여하지 않기 때문에 Replica 노드를 클러스터에 추가하더라도 쓰기 작업의 지연에는 영향을 주지 않습니다.
'EMQX' 카테고리의 다른 글
| [ EMQX ] EMQX 클러스터 with HAProxy (0) | 2025.06.30 |
|---|---|
| [ EMQX ] 로드 밸런서 (0) | 2025.05.28 |