MQTT 브리지로 브로커 간 메시지 동기화 설정
Mosquitto 브리지를 중심으로 브로커 간 MQTT 동기화 개념부터 설정 파일 예제, 테스트 명령어, QoS·보안 고려사항과 장애 대응 절차를 정리한 설명
목차
개요
여러 MQTT 브로커를 운영할 때 브로커 간 메시지 동기화는 시스템 확장과 가용성 확보를 위해 중요하다. 이 글에서는 mqtt 브리지 설정 방법을 단계별로 설명한다. 초보자도 이해할 수 있도록 개념부터 실제 mosquitto 브리지 예제까지 차근차근 다룬다.
브리지 개념 이해
브리지는 한 브로커에서 다른 브로커로 메시지를 전달하는 역할을 한다. 중앙 브로커와 엣지 브로커를 연결하거나, 데이터 센터 간 메시지를 동기화하는 데 유용하다. 브로커 간 mqtt 동기화 시 주요 고려사항은 토픽 매핑, QoS, 보존(retain) 설정, 루프 방지이다.
토픽 흐름과 매핑
브리지 설정으로 모든 토픽을 전달할 수도 있고 특정 토픽만 전송할 수도 있다. 일반적으로 원격 토픽과 로컬 토픽을 매핑하여 트래픽을 제어한다. 예를 들어 센서 토픽은 엣지에서 중앙으로, 제어 명령은 중앙에서 엣지로 전달하도록 구성한다.
QoS와 보존 정책
QoS는 메시지 전달 보장 수준을 결정한다. 브리지에서 QoS를 적절히 설정하면 네트워크 불안정 시에도 메시지 유실을 줄일 수 있다. 보존 메시지(retain)는 브리지에서 전송될 때 의도치 않은 오래된 상태가 전파될 수 있어 주의가 필요하다.
Mosquitto 브리지 설정 예제
다음 예제는 로컬 브로커(mosquitto)가 원격 브로커로 일부 토픽을 브리지하는 설정이다. 설정 파일은 /etc/mosquitto/conf.d/bridge.conf로 분리하는 편이 관리하기 좋다.
connection bridge_to_remote
address remote.example.com:1883
topic sensors/# out 1
topic commands/# in 1
start_type automatic
try_private false
notifications true
keepalive_interval 60
설명:
- connection: 브리지 이름
- address: 원격 브로커 주소와 포트
- topic sensors/# out 1: 로컬의 sensors/# 토픽을 원격으로 전송(QoS 1)
- topic commands/# in 1: 원격의 commands/# 토픽을 로컬로 수신(QoS 1)
- start_type: 브리지 시작 방식
- try_private false: 연결 방식 설정 (호환성 용도)
TLS와 인증 설정
공개 네트워크에서 브리징할 때는 TLS와 사용자 인증이 필요하다. mosquitto에서는 cafile, certfile, keyfile 옵션을 사용해 TLS 연결을 구성한다. 사용자 인증은 username과 passwordfile로 처리한다.
connection secure_bridge
address remote.example.com:8883
topic sensors/# out 1
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/client.crt
keyfile /etc/mosquitto/certs/client.key
username bridgeuser
password_file /etc/mosquitto/bridge_passwd
테스트 및 검증 절차
설정 후에는 연결 상태와 토픽 흐름을 확인한다. 로컬 브로커에서 브리지 로그를 확인하고, 원격 브로커에서 구독하여 메시지 흐름을 검증한다.
- 브리지 로그 확인: systemctl status mosquitto 또는 /var/log/mosquitto/mosquitto.log
- 원격 브로커 구독:
mosquitto_sub -h remote.example.com -t 'sensors/#' -v - 로컬 발행 테스트:
mosquitto_pub -t 'sensors/temp' -m '22.5'
이 과정을 통해 메시지가 원격 브로커로 정상 전송되는지 확인할 수 있다. 반대로 원격에서 로컬로 전달되는 토픽도 동일하게 점검한다.
루프 방지와 필터링
브리지 구성에서 주의할 점은 메시지 루프다. A 브로커가 B로 전송한 메시지가 다시 A로 돌아오는 상황을 피해야 한다. 이를 위해 토픽 필터와 방향(out/in)을 명확히 설정한다. 필요하면 토픽 이름에 접두사를 붙여 원본을 구분한다.
예: 접두사 사용
topic sensors/# out 1 sensors/from_local/
topic commands/# in 1 commands/from_remote/
이처럼 접두사를 붙이면 각 브로커가 수신한 메시지를 구분하여 재전송 루프를 막을 수 있다.
장애 대응과 운영 팁
브리지 운영 중 자주 발생하는 문제와 해결 방법은 다음과 같다.
- 연결 실패: 네트워크 또는 포트 차단 여부 확인, 방화벽 설정 점검
- 인증 오류: 사용자명과 비밀번호, 인증서 경로 확인
- 메시지 지연: QoS 조정과 keepalive 값 검토, 네트워크 상태 점검
- 루프 발생: 토픽 매핑과 방향 설정 재검토
- 로그 과다 발생: notifications 옵션과 로그 레벨 조정
정기적으로 브리지 상태를 모니터링하고 로그를 분석하면 장애를 조기에 발견할 수 있다. 또한 트래픽이 많은 토픽은 별도 큐나 처리 우선순위를 검토하는 것이 좋다.
실무 적용 체크리스트
- 브리지 대상 토픽 목록 작성
- QoS와 retain 정책 정의
- TLS 및 인증 구성 여부 결정
- 토픽 접두사나 매핑 규칙 설계
- 모니터링과 로그 수집 방안 마련
- 장애 대응 절차 문서화
마무리
브로커 간 mqtt 동기화는 설계와 테스트가 중요하다. mosquitto 브리지 예제처럼 기본 설정을 이해한 뒤 서비스 환경에 맞춰 QoS, 보안, 토픽 매핑을 적용하면 안정적인 메시지 전달이 가능하다. 처음에는 작은 범위로 브리지를 구성해 점차 확장하는 접근을 권장한다.