본문 바로가기
1. 개발/1.8. ActiveMQ

클러스터 내에서 'Server ID' 중복 시 발생하는 현상은?

by 엉짱 2026. 4. 11.
반응형

클러스터 내에서 'Server ID' 중복 시 발생하는 현상은?

엔터프라이즈 환경에서 메시지 브로커(ActiveMQ, Artemis 등)를 다중 노드로 구성할 때, 인프라 엔지니어들이 설정 파일(broker.xml 등)의 네트워크 포트나 브릿지 파라미터 튜닝에는 엄청난 공을 들입니다. 하지만 의외로 가장 기초적이고 치명적인 장애는 매우 단순한 '복사 및 붙여넣기(Copy & Paste)' 실수에서 비롯됩니다.

분산 시스템의 모든 노드는 자신을 증명할 고유한 신분증을 가져야 하며, 브로커 인프라에서는 이를 'Server ID (또는 Node ID)'라고 부릅니다.

만약 클러스터 내에 완벽하게 동일한 신분증(ID)을 가진 브로커 두 대가 동시에 구동된다면, 시스템 내부에서는 어떤 일이 벌어질까요? 본 가이드에서는 Server ID 중복이 유발하는 기괴한 라우팅 장애의 물리적 원인과, 이를 사전에 차단하기 위한 인프라 배포의 대원칙을 상세히 해부합니다.


1. 'Server ID (Node ID)'의 아키텍처적 역할

ActiveMQ나 Artemis 브로커를 최초로 기동하면, 엔진은 빈 스토리지(Data 디렉토리)를 초기화하면서 자신만의 고유한 UUID(Universally Unique Identifier)를 생성하여 디스크의 특정 메타데이터 파일(server.lock 또는 nodeManager 관련 파일)에 영구적으로 기록합니다.

이 식별자는 클러스터 아키텍처 내부에서 다음과 같은 절대적인 기준점으로 사용됩니다.

  • 토폴로지 맵핑: "나는 Node-A입니다"라고 클러스터의 다른 노드들에게 자신의 존재와 위치(IP, Port)를 방송(Broadcast)하는 주체입니다.
  • 루프(Loop) 방지: 브로커를 넘나드는 메시지의 헤더에는 '거쳐온 노드들의 ID 목록'이 기록됩니다. 브로커는 메시지 헤더에 자신의 ID가 이미 존재하면 무한 루프를 막기 위해 메시지를 드롭(Drop)합니다.
  • 수요 기반 라우팅: "Node-A에 특정 큐의 컨슈머가 존재한다"는 구독 정보(Advisory)를 추적하는 기준 키(Key) 값입니다.

2. 신분증 중복을 유발하는 치명적인 인프라 배포 실수

정상적인 기동 과정에서는 절대 중복이 발생할 수 없습니다. 이 재앙은 100% 인프라 프로비저닝 과정에서의 휴먼 에러나 잘못된 자동화 파이프라인에서 기인합니다.

  • 가상 머신(VM) 스냅샷 클로닝: 이미 한 번이라도 구동되어 Data 디렉토리에 UUID가 새겨진 마스터 VM을 그대로 복제(Clone)하여 2번, 3번 노드를 찍어내는 경우입니다. (Sysprep 과정에서 애플리케이션의 데이터 폴더를 초기화하지 않은 경우)
  • 물리 서버 간 디렉토리 복사: 브로커 설정 파일(xml)을 맞추기가 귀찮다는 이유로, 1번 서버에 설치된 ActiveMQ 전체 디렉토리(바이너리와 data 폴더 포함)를 tar로 압축하여 2번 서버로 그대로 복사하는 관행입니다.
  • 잘못된 컨테이너(Docker/K8s) 빌드: 브로커의 data 디렉토리를 외부 볼륨(PVC)으로 빼지 않고, 로컬 테스트 목적으로 한 번 구동했던 브로커의 상태를 그대로 Docker Image 내부에 구워(Bake)버린 경우입니다. 이 이미지를 쿠버네티스에서 레플리카 3개로 띄우면 3대의 브로커가 모두 동일한 ID를 가지게 됩니다.

3. 중복 시 발생하는 3단계 아키텍처 재앙

두 대 이상의 브로커가 같은 ID를 가지고 클러스터 망에 연결되는 순간, 인프라는 조용하지만 치명적으로 무너져 내립니다.

A. 토폴로지 인지 장애 (Topology Flapping)
클러스터 코디네이터(혹은 브로드캐스트 리시버)는 동일한 ID(예: Node-123)로부터 서로 다른 두 개의 IP 주소에서 생존 신고(Heartbeat)를 받게 됩니다.
브로커들의 내부 라우팅 테이블은 Node-123이 10.0.0.1에 있다고 기록했다가, 0.1초 뒤에 10.0.0.2에 있다고 덮어쓰는 행위를 무한히 반복합니다. 클러스터 망 전체가 지진이 난 것처럼 요동치며 CPU 사용률이 급증합니다.

B. 라우팅 블랙홀 (Routing Blackhole)
프로듀서가 메시지를 보내고 클러스터 내의 컨슈머들이 이를 가져가려 할 때, 브로커는 메시지를 어디로 보내야 할지 판단 능력을 상실합니다.
분명히 A 브로커에 컨슈머가 접속해 있는데도, 클러스터는 B 브로커(동일 ID)에 컨슈머가 있다고 착각하여 엉뚱한 곳으로 메시지를 보냅니다. 결국 메시지는 소비되지 못하고 허공에 갇혀버리는 블랙홀 현상이 발생합니다.

C. 사일런트 드롭 (Silent Message Drop)
가장 찾기 힘든 최악의 장애입니다. 앞서 언급했듯 브로커는 무한 루프를 막기 위해 메시지가 거쳐온 노드 ID를 검사합니다.
1번 서버(ID: XYZ)에 들어온 메시지가 정상적인 부하 분산 로직에 의해 2번 서버(ID: XYZ)로 넘어갔다고 가정해 봅시다. 2번 서버는 메시지 헤더를 열어보고 깜짝 놀랍니다. "어? 이 메시지는 이미 나(XYZ)를 거쳐 갔던 메시지네? 무한 루프에 빠졌군!" 결국 2번 서버는 이 메시지가 정상적인 분산 트래픽임에도 불구하고 루프로 오인하여 커널 레벨에서 조용히 삭제(Drop)해 버립니다. 에러 로그조차 명확히 남지 않아 데이터 유실의 원인을 찾지 못해 밤을 새우게 됩니다.


4. 장애의 진단과 시스템 로그 분석

이러한 현상이 의심될 때 인프라 엔지니어가 가장 먼저 확인해야 할 것은 각 브로커 노드의 artemis.log (또는 activemq.log) 파일입니다.

  • 진단 로그 1: 클러스터 연결 단계에서 다음과 같이 노드 ID가 충돌한다는 명시적인 경고(WARN)나 에러 로그가 쏟아지는지 확인합니다.
    WARN: AMQ222208: Duplicate node ID detected...
  • 진단 로그 2: 클러스터 노드가 지속적으로 연결되었다가 끊어지는 현상(Connected / Disconnected)이 초 단위로 반복 기록된다면 토폴로지 플래핑(Flapping)을 강하게 의심해야 합니다.

5. 무결점 인프라 배포를 위한 아키텍처 가이드 (Best Practices)

Server ID 중복이라는 원시적인 장애를 인프라 레벨에서 원천 차단하기 위해서는 배포 파이프라인에 다음과 같은 엄격한 룰을 적용해야 합니다.

1. Data 디렉토리의 철저한 격리와 초기화
가상 머신(VM) 이미지를 만들거나 브로커 디렉토리를 복사할 때는, 반드시 data 폴더 하위의 모든 영구 스토리지 파일(저널, 바인딩, server.lock, nodeManager 등)을 완벽하게 삭제(rm -rf)한 상태의 '클린(Clean)' 버전을 베이스 이미지로 삼아야 합니다. 브로커 프로세스가 구동될 때 빈 디렉토리를 감지하고 스스로 새로운 UUID를 발급하도록 유도해야 합니다.

2. 컨테이너/Kubernetes 환경의 Stateful 설정
쿠버네티스(K8s) 환경에서 브로커를 배포할 때는 절대로 Deployment 컨트롤러를 사용하여 동일한 디스크를 공유하게 해서는 안 됩니다.
반드시 StatefulSet을 사용하여 각 파드(Pod)가 서로 물리적으로 격리된 고유의 PersistentVolumeClaim(PVC)을 마운트하도록 설계해야 합니다. 이를 통해 파드가 재시작되더라도 자신만의 고유한 ID를 유지하면서, 동시에 다른 파드와 ID가 겹치는 재앙을 막을 수 있습니다.

3. 기동 전 UUID 검사 스크립트화
운영 자동화 도구(Ansible, Terraform)를 사용하여 수십 대의 브로커를 동시에 프로비저닝할 때, pre-start 훅(Hook) 스크립트를 작성하여 클러스터 내의 다른 장비들과 현재 디스크에 기록된 UUID 문자열이 겹치지 않는지 크로스 체크(Cross-check)하는 방어 로직을 추가하는 것도 훌륭한 인프라 안전장치입니다.

결론적으로 분산 환경에서 브로커의 Server ID는 단순한 메타데이터가 아니라 클러스터의 신뢰를 유지하는 근간입니다. 데이터를 복사하는 편리함 이면에 숨겨진 아키텍처적 위험성을 명확히 인지하고, 애플리케이션의 '무상태(Stateless)' 영역과 데이터의 '유상태(Stateful)' 영역을 철저하게 분리하는 배포 파이프라인을 구축하시기 바랍니다.

반응형