MQTT · 2026-02-08

MQTT Keep Alive와 재연결로 연결 안정성 높이기

MQTT 연결 안정화를 위한 Keep Alive 설정 원칙과 단계별 재연결 전략을 정리한다. 구현 예제와 운영 체크리스트를 포함한 실무 지침

작성일 : 2026-02-08 ㆍ 작성자 : 관리자
post
목차

서론

IoT 환경에서 MQTT는 가볍고 효율적인 메시징 프로토콜이다. 그러나 네트워크 불안정이나 클라이언트 문제로 연결이 끊기기 쉽다. Keep Alive와 재연결 전략은 연결을 빠르게 감지하고 복구하는 핵심 수단이다. 이 글은 처음 접하는 사람도 이해할 수 있도록 원리, 설정 방법, 코드 예제, 운영 체크리스트를 차례로 설명한다.

Keep Alive의 역할과 작동 원리

Keep Alive의 목적

Keep Alive는 클라이언트와 브로커 사이의 생존 확인 수단이다. 주기적 PING 요청이나 패킷 전송으로 상대가 여전히 연결되어 있는지 확인한다. 이를 통해 연결 끊김을 빠르게 감지하고 재연결 절차를 시작할 수 있다.

기본 동작 원리

클라이언트는 Keep Alive 간격을 브로커에 알린다. 지정된 시간 내에 데이터가 오가지 않으면 PINGREQ를 보내고, 브로커는 PINGRESP로 응답한다. 응답이 없으면 연결 불능으로 판단한다. 이 메커니즘은 단순하지만 네트워크 지연이나 패킷 손실에 민감할 수 있다.

mqtt keepalive 설정 실무 원칙

간격 설정 기준

  • 환경을 고려한 균형: 너무 짧으면 오버헤드 증가, 너무 길면 감지 지연이 발생한다.
  • 디바이스 전력 프로필: 배터리 기반 디바이스는 긴 간격 권장.
  • 네트워크 특성: 지연이 큰 네트워크에서는 여유 시간을 둔다.
  • 서비스 요구 수준: 실시간성이 중요하면 짧게 설정한다.

권장 값 예시

일반적인 환경에서는 30~120초를 권장한다. 저전력 센서에서는 300초 이상도 고려된다. 중요한 점은 브로커와 클라이언트가 같은 기대치를 갖도록 문서화하는 것이다.

구현 예제: Python(paho-mqtt) 기본 설정

아래 예제는 paho-mqtt 클라이언트에서 keepalive를 설정하고 연결 상태를 감시하는 간단한 코드다.

import paho.mqtt.client as mqtt

KEEPALIVE = 60

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected")
    else:
        print("Connect failed:", rc)

def on_disconnect(client, userdata, rc):
    print("Disconnected", rc)

client = mqtt.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.connect("broker.example.com", 1883, KEEPALIVE)
client.loop_start()

mqtt 재연결 전략

기본 재연결 흐름

  • 연결 끊김 감지
  • 짧은 초기 대기 후 재시도
  • 반복 실패 시 대기 시간을 늘림
  • 성공 시 상태 복구(구독 재등록 등)

여기서 핵심은 무한 재시도 시 시스템 리소스를 고갈시키지 않도록 제어하는 것이다.

Exponential Backoff와 Jitter

단순 고정 간격 재시도는 네트워크 문제가 있을 때 동시 재시도로 부하를 유발한다. 지수적 증가(exponential backoff)와 임의 지연(jitter)을 더하면 충돌을 줄일 수 있다.

// 의사 코드: 재연결 정책
base = 1  # 초
max_wait = 300
attempt = 0

while not connected:
    wait = min(max_wait, base * (2 ** attempt))
    wait = wait * (0.5 + random())  # jitter 적용
    sleep(wait)
    try_reconnect()
    attempt += 1

운영에서 고려할 점

상태 복구 절차

  • 재연결 성공 시 구독 재등록을 자동화한다.
  • 발행 중단 시 메시지 손실을 최소화하도록 QoS 설정을 검토한다.
  • 중요 메시지는 지속성(persistent) 저장소와 연동한다.

모니터링과 경보

연결 실패율, 재연결 시도 횟수, 평균 복구 시간(MTTTR)을 모니터링한다. 임계치 초과 시 운영자에게 알림을 보낸다. 로그는 원인 분석에 필수적이다.

브로커와 네트워크 구성

  • 브로커 HA 구성으로 접속 지점을 분산한다.
  • 로드밸런서 뒤에 브로커를 둘 때는 세션 지속성(Sticky session) 요구 여부를 확인한다.
  • 네트워크 장비의 TCP 타임아웃과 MQTT Keep Alive 값의 조화를 검토한다.

체크리스트

  • Keep Alive 값이 디바이스 특성과 일치하는가?
  • 재연결 전략에 지수 백오프와 지터가 적용되어 있는가?
  • 재연결 후 구독과 발행 상태가 복원되는가?
  • 모니터링 지표와 경보가 설정되어 있는가?
  • 브로커와 네트워크 타임아웃 간 불일치가 없는가?

요약

Keep Alive는 연결 감지의 기본 수단이다. 적절한 mqtt keepalive 설정과 설계된 mqtt 재연결 전략은 시스템의 복원력을 크게 높인다. 지수 백오프와 지터, 구독 복구, 모니터링을 결합하면 실무에서 우수한 mqtt 연결 안정화 팁으로 작동한다. 마지막으로 설정 값과 절차는 반드시 실환경에서 검증해 문서화한다.

mqtt keepalive 설정 mqtt 재연결 전략 mqtt 연결 안정화 팁 mqtt paho-mqtt 재연결 IoT 안정성 네트워크 회복성