EMQX로 대규모 IoT 플랫폼 구축과 튜닝
EMQX 기반 대규모 IoT 플랫폼의 구성, 성능 최적화, 모니터링과 확장 전략을 초심자도 이해하기 쉬운 구성으로 정리한 설명서
목차
소개
EMQX는 MQTT 기반으로 설계된 고성능 메시지 브로커다. 대량의 디바이스를 안정적으로 연결하기 위한 설계 요소와 튜닝 포인트를 중심으로 설명한다. 처음 접하는 엔지니어도 아키텍처와 설정 요소를 빠르게 이해하도록 구성했다.
아키텍처 개요
대규모 배포는 단일 노드가 아니라 클러스터 기반으로 접근해야 한다. 기본 구성은 다음과 같다.
- 엣지 디바이스 → 로드밸런서 → EMQX 클러스터
- 메트릭 수집: Prometheus + Grafana
- 영속성 필요 시: 외부 데이터베이스(예: InfluxDB, PostgreSQL) 연동
이 구조는 연결 수 증가와 메시지 처리량 확대에 유연하게 대응한다.
설치 및 초기 설정
패키지 설치
공식 배포 패키지 또는 도커 이미지를 사용한다. 운영 환경에서는 시스템 튜닝 전후로 테스트 환경에서 먼저 검증하는 것이 안전하다.
클러스터 구성 기본 절차
- 각 노드에 동일한 EMQX 버전 설치
- 노드 간 네트워크 포트(4369, 8080/18083, 1883 등) 허용
- 한 노드에서 나머지 노드로 cluster join 실행
emqx start
emqx_ctl cluster join emqx@10.0.0.2
emqx_ctl cluster status
emqx_ctl listeners show
핵심 설정과 튜닝 포인트
성능에 직접 영향을 주는 항목은 네트워크, 커널, EMQX 프로세스 설정이다. 아래 항목을 우선적으로 검토한다.
운영체제 및 커널 레벨
- 파일 디스크립터(fd) 수 증가
- 네트워크 버퍼(tcp_rmem, tcp_wmem) 조정
- epoll 등 비동기 I/O 활용
EMQX 설정 예시
아래는 대표적인 설정 예시다. 실제 값은 하드웨어와 테스트 결과에 따라 조정한다.
listener.tcp.external = 1883
listener.ssl.external = 8883
listener.ws.external = 8083
node.name = emqx@127.0.0.1
node.max_ports = 65536
mqtt.max_packet_size = 65536
mqtt.keepalive = 600
mqtt.max_inflight = 20
dashboard.default.fleet = false
세부 튜닝 포인트
- Keepalive와 세션 만료 정책으로 리소스 해제 기준 설정
- QoS 처리와 인플라이트 메시지 수 제한으로 메모리 스파이크 방지
- 로드밸런서에서의 세션 지속성(Session Stickiness) 최소화
모니터링과 로깅
성능 최적화를 위해 실시간 지표 수집이 필수다. Prometheus와 Grafana를 권장한다.
- emqx-prometheus 플러그인 활성화
- 핵심 지표: 동시 연결 수, 메시지 처리율, CPU/메모리 사용률, 가비지 컬렉션 지연
- 알람 기준 설정: 연결 폭주, 메시지 지연 증가, 노드 다운
emqx_ctl plugins load emqx_prometheus
# Prometheus에서 /metrics 엔드포인트 수집
스케일링 전략
수평 확장이 기본 전략이다. 단계별 권장 절차는 다음과 같다.
- 소규모 클러스터로 성능 특성 수집
- 노드 추가 후 클러스터 안정성 검증
- 로드밸런서 구성 최적화(레벨4/레벨7 차이 고려)
확장 시 주의할 점은 상태 유지(Session state) 관리와 브로드캐스트 메시지 증가이다. 필요 시 애플리케이션 레벨에서 메시지 라우팅을 재설계한다.
테스트와 검증
튜닝은 측정과 반복이 핵심이다. 부하 테스트 도구(MQTT 스텁)를 활용해 다음 항목을 확인한다.
- 최대 동시 연결 수
- 메시지 지연 및 손실률
- 스파이크 대응 능력
운영상 권장 사항
- 정기적인 버전 업과 보안 패치 적용
- 백업 및 복구 시나리오 마련
- 운영 중 장애 시 빠른 롤백 계획
결론
EMQX로 대규모 IoT 플랫폼을 안정적으로 운영하려면 클러스터 설계, OS 및 EMQX 튜닝, 모니터링 체계가 함께 갖춰져야 한다. 각 단계에서 측정을 기반으로 값을 조정하면 예측 가능한 성능을 얻을 수 있다.