7.3. 자동 발견 (Auto-Discovery)¶
Backend.AI GO는 mDNS(Multicast DNS) — macOS에서는 Bonjour라고도 알려진 — 를 사용하여 로컬 네트워크에서 인스턴스를 자동으로 공지하고 발견합니다. mDNS 광고가 활성화되면, 피어들이 IP를 수동으로 설정하지 않고도 노드를 확인하고 연결을 시작할 수 있습니다.
mDNS 발견 작동 방식¶
mDNS는 중앙 DNS 서버 없이 멀티캐스트 주소(224.0.0.251 IPv4, ff02::fb IPv6)를 사용하여 UDP 포트 5353으로 동작하는 제로 구성 프로토콜입니다. 노드는 멀티캐스트 그룹으로 공지를 보내고, 동일 서브넷의 모든 다른 노드가 이를 수신합니다.
Backend.AI GO는 _bago._tcp.local. 서비스 유형으로 등록됩니다. 네트워크에서 이 유형을 검색하는 모든 인스턴스가 공지를 확인할 수 있습니다.
광고 및 발견 흐름¶
노드 A (광고자) 노드 B (발견자)
| |
|--- mDNS 공지 -----------------> | (UDP 5353 멀티캐스트)
| _bago._tcp.local. |
| TXT: name, version, |
| fingerprint, port, |
| engines, models, |
| accelerator |
| |
| [노드 B가 A 발견] |
| |
|<-- 약 20-30초마다 재공지 ----------| (데몬이 활성 상태 유지)
| |
|--- 정상 종료 공지 ---------------> | (ServiceRemoved 이벤트)
| (종료 시) |
각 인스턴스는 발견 리스너도 실행하므로, 동일한 노드가 광고와 피어 발견을 동시에 수행할 수 있습니다.
TXT 레코드 형식¶
광고 시 Backend.AI GO는 mDNS TXT 레코드에 다음 데이터를 포함합니다:
| 필드 | 필수 여부 | 설명 | 예시 |
|---|---|---|---|
name | 필수 | 사람이 읽을 수 있는 노드 이름 | My GO Node |
fingerprint | 필수 | 고유 노드 식별자 | fp_a1b2c3... |
port | 필수 | 관리 API 포트 | 11434 |
version | 필수 | 애플리케이션 버전 | 0.9.0 |
engines | 선택 | 쉼표로 구분된 설치된 엔진 목록 | llama-cpp,mlx |
models | 선택 | 로컬에서 사용 가능한 모델 수 | 5 |
accelerator | 선택 | 기본 하드웨어 가속기 | metal, cuda, rocm, cpu |
설치된 엔진이 없거나 엔진 관리자를 사용할 수 없는 경우 engines 및 models 필드는 생략됩니다. 가속기가 감지되지 않으면 accelerator 필드도 생략됩니다.
기능 데이터는 다음 경우에 자동으로 업데이트됩니다:
- 엔진 설치 또는 제거 시 (
engines-changed이벤트 발생). - 모델 라이브러리 변경 시 (
models-updated이벤트 발생).
mDNS 광고 설정¶
이 노드에서 광고 활성화¶
- Backend.AI GO에서 설정을 엽니다.
- 노드 탭으로 이동합니다.
- 노드 공유 섹션 아래에서 노드 정보를 찾아 노드 이름을 설정합니다 (광고 활성화 전에 반드시 필요합니다).
- 네트워크 광고 아래에서 로컬 네트워크에서 광고 (Bonjour/mDNS) 토글을 ON으로 설정합니다.
활성화되면 이 인스턴스는 20~30초마다 자신을 공지합니다. 동일 서브넷의 다른 Backend.AI GO 인스턴스는 발견 목록에서 이를 확인할 수 있습니다.
네트워크에서 노드 발견¶
- 설정 > 노드 > 연결된 노드를 엽니다.
- 노드 추가를 클릭합니다.
- 노드 추가 대화 상자에 발견된 노드의 실시간 목록이 표시됩니다.
- 노드를 선택하고 연결을 클릭한 후, 대상 노드의 연결 키 또는 QR 코드를 사용하여 연결을 완료합니다.
발견된 노드에는 다음 정보가 표시됩니다:
- 노드 이름 및 IP 주소
- 소프트웨어 버전
- 설치된 추론 엔진 (예:
llama-cpp,mlx) - 로컬에서 사용 가능한 모델 수
- 하드웨어 가속기 유형 (예:
metal,cuda,rocm,cpu)
자기 노드 필터링¶
각 노드는 첫 실행 시 고유한 핑거프린트를 생성합니다. 발견 서비스는 이 핑거프린트를 사용하여 자신의 mDNS 공지를 필터링합니다. 광고 중이더라도 자신의 노드는 발견된 노드 목록에 나타나지 않습니다.
오래된 노드 감지¶
노드가 종료 공지 없이 갑자기 종료되면, 발견 서비스는 해당 노드를 오래된 것으로 표시하고 자동으로 제거합니다.
- 오래된 노드 임계값: 90초 이내에 재공지되지 않은 노드는 오래된 것으로 간주됩니다. mDNS 데몬은 일반적으로 20~30초마다 재공지하므로, 90초는 노드를 오프라인으로 판단하기 전에 세 번의 공지를 허용합니다.
- 주기적 정리: 30초마다 발견 서비스는 노드 레지스트리에서 오래된 항목을 제거합니다.
- 읽기 시점 필터링:
get_discovered_nodes()는 매 호출 시 오래된 노드를 필터링하여, 예약된 정리 실행 사이에도 추가적인 안전 장치를 제공합니다.
노드가 다시 온라인 상태가 되면 재공지하며 즉시 피어 목록에 다시 나타납니다.
발견 문제 해결¶
노드가 나타나지 않는 경우¶
- 동일 서브넷 필요: mDNS 멀티캐스트는 라우터 경계를 넘지 않습니다. 두 노드 모두 동일한 Layer 2 네트워크 세그먼트에 있어야 합니다. VLAN이나 라우팅된 서브넷은 발견을 차단합니다.
- 방화벽 규칙: 참여하는 모든 컴퓨터에서 멀티캐스트 트래픽에 대해 UDP 포트 5353이 열려 있는지 확인하세요. 많은 운영 체제 방화벽이 신뢰할 수 없는 네트워크 프로필에서 기본적으로 멀티캐스트를 차단합니다.
- mDNS 광고가 비활성화된 경우: 발견하려는 노드의 설정 > 노드 > 노드 공유에서 로컬 네트워크에서 광고 토글이 ON인지 확인하세요.
- 노드 이름이 설정되지 않은 경우: 노드 이름이 설정되어 있지 않으면 광고 토글이 비활성화됩니다. 광고 활성화 전에 이름이 설정되어 있는지 확인하세요.
노드가 예상치 않게 사라지는 경우¶
- mDNS 공지가 90초 이내에 수신되지 않으면 노드가 피어 목록에서 사라집니다. 이는 다음과 같은 경우에 발생할 수 있습니다:
- 광고하는 노드의 방화벽이 멀티캐스트 발신 패킷을 차단하는 경우.
- 노드의 네트워크 인터페이스가 변경되는 경우 (예: Wi-Fi에서 이더넷으로 전환).
- 시스템이 절전 모드로 전환되어 mDNS 데몬이 일시 중지되는 경우.
플랫폼별 참고 사항¶
| 플랫폼 | mDNS 구현 | 참고 사항 |
|---|---|---|
| macOS | Bonjour (내장) | 완전히 지원됩니다. 추가 소프트웨어가 필요 없습니다. |
| Linux | Avahi (일반적) 또는 systemd-resolved | mDNS가 작동하지 않으면 avahi-daemon을 설치하세요. ufw 또는 firewalld에서 포트 5353이 허용되어 있는지 확인하세요. |
| Windows | Windows mDNS (Windows 10부터 내장) | 지원됩니다. 네트워크 및 공유 센터에서 네트워크 검색 기능이 활성화되어 있는지 확인하세요. |
연결에는 여전히 승인이 필요합니다¶
mDNS 발견은 노드가 존재함을 공지할 뿐입니다. 발견된 노드에 연결하려면 여전히 대상 노드에서 생성한 연결 키 또는 QR 코드가 필요합니다 (설정 > 노드 > 노드 공유 > 연결 키 생성). 발견은 수동 IP 조회를 없애 장벽을 낮추지만, 인증 단계를 건너뛰지는 않습니다.
연결 후 원격 모델 발견¶
두 노드가 연결되면 Backend.AI GO는 카탈로그 교환을 수행합니다:
- 핸드셰이크: 연결 시 원격 노드가 활성 백엔드(로드된 모델 및 서비스) 목록을 전송합니다.
- 동적 업데이트: 원격 노드에서 모델이 로드되거나 언로드되면 로컬 인스턴스가 다음 새로고침 시 알림을 받습니다.
- 모델 선택기: 원격 모델은 채팅 인터페이스의 모델 선택기에서 노드 이름별로 그룹화되어 나타납니다.
로컬 모델 발견¶
로컬 컴퓨터에서 Backend.AI GO는 파일 시스템과 활성 프로세스도 모니터링합니다:
- 폴더 모니터링:
models/디렉토리에 모델을 다운로드하면 Backend.AI GO가 파일 유형(GGUF, safetensors)을 감지하고 적절한 실행기(llama.cpp, MLX)를 결정합니다. - 프로세스 바인딩: 모델이 로드되면 로컬 라우터에 등록되며, 라우터는 해당 기능을 프론트엔드 UI에 노출합니다.