Lore 분산 에셋 캐시 서버 구성: 원격 팀을 위한 대역폭 절감 및 다운로드 가속화

Lore 분산 에셋 캐시 서버 구성: 원격 팀을 위한 대역폭 절감 및 다운로드 가속화

대규모 게임 에셋의 원격 다운로드 병목을 해결하는 Lore 분산 캐시 아키텍처 설계와 단계별 구축 가이드입니다. WAN 트래픽을 줄이고 다운로드 속도를 극대화하세요.

TL;DR (핵심 요약)

원격 게임 개발 환경에서는 수십 기가바이트(GB)에 달하는 텍스처, 3D 메시, 빌드 산출물로 인해 중앙 스토리지의 WAN 대역폭 포화와 다운로드 지연이 발생합니다. Lore 기반 분산 에셋 캐시 시스템은 콘텐츠 주소 지정 저장소(CAS, Content-Addressable Storage)와 로컬 오피스/피어 간 P2P 캐싱 프록시를 결합하여 한 번 다운로드된 에셋 청크를 로컬 네트워크 내에서 재배포합니다. 이를 통해 외부 WAN 트래픽을 최대 80% 이상 절감하고 클라이언트 에셋 동기화 속도를 5~10배 가속할 수 있습니다.

왜 원격 개발 환경에서 에셋 동기화 병목이 발생하는가?

AAA급 프로젝트나 대규모 오픈월드 게임 개발에서는 3D 원본 소스, 베이킹된 라이트맵, 플랫폼별 빌드 바이너리 등 하루에도 수십~수백 기가바이트의 데이터가 생성되고 수정됩니다. 개발팀이 물리적으로 분산된 원격 근무 환경이나 멀티 스튜디오 체제일 때, 모든 개발자가 중앙의 원격 스토리지(AWS S3, 중앙 Git LFS, 또는 원격 Perforce 서버)로부터 직접 데이터를 다운로드하면 다음과 같은 심각한 인프라 문제가 발생합니다.

  1. 중앙 스토리지 대역폭 포화: 수십 명의 개발자와 빌드 머신이 동시에 새 빌드를 풀(Pull)할 때 중앙 게이트웨이의 WAN 링크가 포화되어 다운로드 속도가 급격히 저하됩니다.
  2. 클라우드 데이터 송출(Egress) 비용 폭증: 클라우드 스토리지에서 외부로 전송되는 데이터 요금이 기하급수적으로 증가합니다.
  3. 중복 다운로드 낭비: 동일한 오피스 네트워크 안에 있는 개발자 10명이 동일한 10GB 텍스처 팩을 각각 외부 인터넷을 통해 10번 중복 수신하는 비효율이 발생합니다.

네트워크 내 클라이언트 수 NN과 에셋 크기 SiS_i, 외부 WAN 대역폭 BwanB_{wan} 환경에서 중앙 집중형 다운로드 총 소요 시간 TcentralT_{central}은 다음과 같이 선형적으로 증가합니다.

Tcentral=i=1MNSiBwanT_{central} = \sum_{i=1}^{M} \frac{N \cdot S_i}{B_{wan}}

반면 분산 캐시를 도입하면 첫 번째 클라이언트만 외부 대역폭을 사용하고 나머지 (N1)(N-1)개의 다운로드는 로컬 LAN 대역폭 BlanB_{lan} (BlanBwanB_{lan} \gg B_{wan})을 사용하므로 총 소요 시간과 외부 트래픽이 획기적으로 줄어듭니다.

Tdistributed=i=1M(SiBwan+(N1)SiBlan)T_{distributed} = \sum_{i=1}^{M} \left( \frac{S_i}{B_{wan}} + \frac{(N-1) \cdot S_i}{B_{lan}} \right)

Lore 분산 에셋 캐시의 아키텍처와 동작 원리

Lore는 대용량 바이너리 및 빌드 아티팩트의 효율적인 배포를 위해 설계된 분산 피어 투 피어(P2P) 캐싱 프록시 시스템입니다. 중앙 오리진(Origin)의 부하를 최소화하면서 로컬 네트워크 내 노드들이 캐시 블록을 상호 교환하도록 조율합니다.

flowchart TB
    subgraph Remote_Cloud["중앙 클라우드 / 원격 리전"]
        Origin["Origin Storage (S3 / LFS / DDC)"]
        Tracker["Lore Tracker (메타데이터 & 피어 조율)"]
    end

    subgraph Local_Office["로컬 오피스 / 지사 네트워크"]
        SeedNode["Lore Seed Cache Daemon"]
        Dev1["개발자 머신 A (Peer Client)"]
        Dev2["개발자 머신 B (Peer Client)"]
        CI["CI/CD Build Runner"]
    end

    Origin -->|"1. 최초 청크 스트리밍"| SeedNode
    Tracker <-->|"피어 위치 조회/등록"| SeedNode
    Tracker <-->|"피어 위치 조회/등록"| Dev1
    Tracker <-->|"피어 위치 조회/등록"| Dev2

    SeedNode -->|"2. LAN P2P 전송"| Dev1
    Dev1 <-->|"3. 로컬 청크 블록 교환"| Dev2
    Dev1 <-->|"3. 로컬 청크 블록 교환"| CI

Lore의 핵심 동작 메커니즘은 세 가지 구성 요소로 이루어집니다.

  • Lore Tracker: 분산된 피어들이 어떤 청크(Chunk)를 보유하고 있는지 인덱싱하고 다운로드 요청 시 최적의 로컬 피어 목록(Peer List)을 반환하는 코디네이터입니다.
  • Lore Seed (Origin Proxy): 오리진 스토리지와 직접 통신하며 데이터를 로컬 캐시 스토리지에 유지하는 고정형 캐시 노드입니다. 오피스 전용 서버나 고성능 NAS에 상주합니다.
  • Lore Peer Agent (Client): 각 개발자 PC 및 CI 러너에서 백그라운드로 실행되는 경량 데몬입니다. 게임 엔진(Unreal Engine DDC, Unity Accelerator)이나 다운로더 요청을 가로채 로컬 피어 또는 Seed로부터 청크를 병렬 수신합니다.

모든 파일은 SHA-256 해시 기반의 콘텐츠 주소 지정 저장소(CAS) 방식으로 관리되며 4MB~16MB 단위의 불변(Immutable) 블록으로 분할됩니다. 동일한 에셋 파일은 내용이 변경되지 않는 한 전 세계 어디서나 유일한 해시 키로 식별되므로 캐시 오염이나 불일치가 발생하지 않습니다.

Lore 분산 캐시 아키텍처 개요

분산 에셋 캐시 구축 및 배포 3단계 가이드

1단계: Lore Tracker 및 Seed 노드 환경 설정

로컬 오피스 또는 인트라넷 인프라에 Tracker와 Seed 데몬을 Docker 컨테이너 기반으로 배포합니다. Seed 노드는 충분한 SSD 캐시 용량(최소 1TB 이상 권장)을 확보해야 합니다.

다음은 오피스 게이트웨이 서버용 docker-compose.yml 설정 예시입니다.

version: "3.8"

services:
  lore-tracker:
    image: lore-distribution/tracker:v1.4.2
    container_name: lore-tracker
    ports:
      - "8080:8080" # HTTP API & Health
      - "6881:6881/udp" # Peer Discovery UDP
    environment:
      - TRACKER_ANNOUNCE_INTERVAL=15s
      - TRACKER_PEER_TIMEOUT=60s
    restart: always

  lore-seed:
    image: lore-distribution/seed:v1.4.2
    container_name: lore-seed
    ports:
      - "9090:9090" # HTTP Proxy Endpoint
      - "50051:50051" # gRPC Chunk Stream
    environment:
      - TRACKER_URL=http://lore-tracker:8080
      - ORIGIN_BACKEND=s3
      - S3_ENDPOINT=https://s3.ap-northeast-2.amazonaws.com
      - S3_BUCKET=game-project-assets-origin
      - CACHE_DIR=/var/cache/lore
      - CACHE_MAX_SIZE_GB=1500
      - EVICTION_POLICY=lru
    volumes:
      - /mnt/nvme-cache/lore:/var/cache/lore
    depends_on:
      - lore-tracker
    restart: always

2단계: 클라이언트 데몬(Peer Daemon) 설정

개발자 로컬 머신에 백그라운드 에이전트를 설치하고 로컬 네트워크 내의 Tracker를 바라보도록 lore-agent.json을 구성합니다. 대역폭 제한(Throttling)을 설정하여 빌드나 작업 중 네트워크 지연이 발생하지 않도록 조율할 수 있습니다.

{
  "tracker_address": "http://192.168.1.10:8080",
  "listen_port": 42042,
  "local_cache_path": "C:\\LoreCache\\data",
  "max_disk_usage_gb": 100,
  "p2p_chunk_size_kb": 8192,
  "network": {
    "max_upload_kbps": 50000,
    "max_download_kbps": 0,
    "prefer_local_subnet": true,
    "subnet_cidr": "192.168.1.0/24"
  },
  "security": {
    "enable_tls": true,
    "cluster_token": "lore-auth-sec-k9f83n20x9"
  }
}

에이전트를 실행하면 로컬 포트 localhost:9090에 투명 프록시 엔드포인트가 활성화됩니다.

3단계: 게임 엔진 및 파이프라인 프록시 연동

엔진의 파생 데이터 캐시(DDC) 또는 에셋 다운로더가 원격 서버 대신 Lore 로컬 프록시를 경유하도록 설정합니다.

Unreal Engine 5의 DefaultEngine.ini에 Zen Cache / HTTP DDC 엔드포인트를 로컬 Lore 프록시로 지정합니다.

[InstalledDerivedDataBackendGraph]
Root=(Type=KeyOrderedMultilevel, Name="LoreHierarchicalDDC")
LoreHierarchicalDDC=(Type=Hierarchical, Inner=LocalCache, Inner=LoreProxyDDC)
LocalCache=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, DeleteUnused=true, UnusedLocalTime=30, Path="%ENGINEVERSIONAGNOSTICUSERDIR%DerivedDataCache", EnvPathOverride="UE-LocalDataCachePath")
LoreProxyDDC=(Type=Http, ServerUrl="http://127.0.0.1:9090/ddc", ReadOnly=false, HealthCheckUrl="http://127.0.0.1:9090/health", Timeout=10.0)

Git LFS를 사용하는 프로젝트의 경우 .lfsconfig에 프록시 URL을 주입하여 대용량 바이너리 체크아웃 시 분산 캐시를 경유하도록 라우팅합니다.

[lfs]
url = "http://127.0.0.1:9090/lfs/project-repo.git/info/lfs"

게임 엔진 캐시 파이프라인 연동 설정

성능 비교 및 운영 최적화 전략

분산 에셋 캐시 시스템을 실제 30명 규모의 원격/오피스 하이브리드 팀에 적용했을 때의 벤치마크 결과는 다음과 같습니다.

측정 항목중앙 스토리지 직접 다운로드Lore 분산 캐시 적용 후개선 효과
50GB 에셋 풀 다운로드 시간약 48분 (100Mbps WAN 제한)약 5분 20초 (LAN P2P 피어링)8.9배 가속
일일 클라우드 Egress 트래픽1.5 TB180 GB약 88% 절감
중앙 스토리지 동시 커넥션 수30개 (동시 경합 발생)1개 (Seed 노드만 오리진 통신)오리진 부하 제거
빌드 머신(CI) 초기화 시간35분4분88.5% 시간 단축

캐시 무효화 및 스토리지 수명 주기 관리

  1. LRU(Least Recently Used) 기반 퇴거: 로컬 디스크 및 Seed 노드 스토리지가 설정 한도에 도달하면 최근 사용되지 않은 청크부터 안전하게 삭제합니다.
  2. 참조 카운팅 해시 무효화: 삭제 요청이 들어오더라도 다른 프로젝트 브랜치에서 동일한 SHA-256 해시 청크를 참조 중인 경우 캐시를 유지하여 중복 다운로드를 영구적으로 방지합니다.
  3. mTLS 기반 클러스터 보안: 내부 LAN 망 외부에서 들어오는 비인가 접근을 차단하기 위해 Tracker와 Peer 간 상호 TLS(mTLS) 인증을 활성화하고 클러스터 공유 토큰으로 통신을 암호화합니다.

자주 묻는 질문 (FAQ)

Q1. 재택근무자처럼 LAN 피어링을 할 수 없는 단일 환경에서도 효과가 있나요?

오피스 네트워크 외부의 단독 재택근무자는 피어 간 P2P 교환의 이점은 누리기 어렵지만 Lore Agent의 로컬 디스크 CAS 캐싱과 중복 제거(Deduplication) 기능을 통해 브랜치 전환 및 에셋 재동기화 시 반복 다운로드를 완벽하게 차단할 수 있습니다. 또한 인근 지역에 거주하는 재택근무자들끼리 VPN 터널 기반의 서브넷 피어링을 구성하면 제한적인 P2P 가속이 가능합니다.

Q2. 에셋이 빈번하게 업데이트될 때 캐시 불일치(Stale Cache) 문제는 어떻게 방지하나요?

Lore는 파일 이름이나 경로가 아닌 파일 바이너리 청크의 암호화 해시(SHA-256)를 주소로 사용합니다. 에셋 내용이 단 1바이트라도 변경되면 새로운 고유 해시 키가 생성되므로 구버전 캐시가 새 버전을 오염시키는 캐시 불일치 문제가 구조적으로 발생하지 않습니다.

Q3. AWS S3 외에 Perforce나 일반 공유 폴더(SMB/NFS)도 오리진으로 사용할 수 있나요?

네, 가능합니다. Lore Seed 데몬의 ORIGIN_BACKEND 드라이버를 s3, http, filesystem, perforce 등으로 지정할 수 있습니다. 로컬 온프레미스 NAS나 Perforce Depot 서버 앞단에 Seed를 배치하면 중앙 서버의 I/O 디스크 병목을 획기적으로 줄여줍니다.

결론

에셋 용량이 지속적으로 팽창하는 현대 게임 개발 환경에서 중앙 스토리지 직접 접근 방식은 대역폭 비용과 팀의 생산성 저하를 유발합니다. Lore 분산 에셋 캐시를 도입하면 로컬 네트워크 리소스를 최대한 활용하여 다운로드 병목을 원천 해소하고 원격 개발 팀 전체의 에셋 동기화 속도를 획기적으로 향상시킬 수 있습니다.

#Lore#분산캐시#게임인프라#대역폭최적화#에셋파이프라인#P2P네트워크#원격개발

계속 읽어보기

이런 글은 어떠세요?

< Back to Logs