멀티 서버 아키텍처: 관심사의 분리

이 글은 우리의 인프라가 관심사의 분리를 통해 확장성, 신뢰성, 성능을 달성하기 위해 어떻게 전문화된 서버를 사용하는지 설명합니다.

문제점: 모놀리식 서버의 한계

모든 것을 한 서버에서 실행하면 다음과 같은 문제가 발생합니다:

  • 자원 경쟁: 웹 서버가 검색 서비스와 CPU/메모리를 두고 경쟁

  • 확장 어려움: 구성 요소를 독립적으로 확장할 수 없음

  • 단일 장애점: 한 서버 다운 = 전체 시스템 다운

  • 비용 비효율성: 워크로드별로 인스턴스 유형을 최적화할 수 없음

  • 배포 위험: 한 구성 요소 배포가 다른 모든 구성 요소에 영향

우리는 여러 서버에 걸쳐 관심사의 분리가 필요합니다.

해결책: 전문화된 서버 역할

우리는 각각의 워크로드에 최적화된 전문화된 서버를 실행합니다:

graph TB
    subgraph prod[프로덕션 ERP 서버]
        erp[내부 관리 시스템
인사, 재무, 제조
24/7 가동 시간
공유 스토리지 및 이메일] end subgraph web[공개 웹사이트 서버] www[공개 웹사이트
제품 카탈로그, 블로그
24/7 가동 시간
CDN 뒤에 위치] end subgraph dev[개발/스테이징 서버] devenv[개발 및 스테이징
이메일 캠페인
야간/주말에 전원 꺼짐] end subgraph search[검색 서비스 서버] searchsvc[벡터 검색
필터 추출
관련 검색어
24/7 가동 시간] end subgraph cache[캐시 서버 - Valkey] valkey[RediSearch 인덱스
쿼리 임베딩
자동 완성
24/7 가동 시간] end www --> searchsvc searchsvc --> valkey

왜 서버를 분리하나요?

1. 자원 격리

각 서버는 한 가지 유형의 워크로드를 실행합니다:

웹 서버: HTTP 요청 처리에 최적화

  • 높은 네트워크 대역폭

  • 중간 수준 CPU

  • 중간 수준 메모리

  • 캐싱을 위한 빠른 디스크

검색 서비스: 벡터 연산에 최적화

  • 높은 CPU (코사인 유사도)

  • 높은 메모리 (임베딩 캐시)

  • 낮은 디스크 I/O

캐시 서버: 메모리 접근에 최적화

  • 매우 높은 메모리

  • 낮은 CPU

  • 빠른 네트워크

장점: 워크로드 간 자원 경쟁이 없음.

2. 독립적 확장

각 구성 요소를 독립적으로 확장할 수 있습니다:

  • 트래픽이 많나요? 로드 밸런서 뒤에 웹 서버를 더 추가합니다.

  • 검색이 느리나요? 검색 서버 CPU를 업그레이드하거나 복제본을 추가합니다.

  • 캐시 미스가 많나요? 캐시 서버 메모리를 늘립니다.

  • 장점: 필요한 것만 확장하고, 모든 것을 확장하지 않음.

3. 장애 격리

장애가 격리됩니다:

검색 서비스가 다운되었나요? 웹사이트는 캐시된 결과를 계속 제공합니다.

캐시 서버가 다운되었나요? 검색 서비스는 캐시 없이 계산합니다 (느리지만 기능함).

웹 서버가 다운되었나요? 내부 ERP는 영향을 받지 않습니다.

장점: 부분적 장애가 전체 시스템으로 전파되지 않음.

4. 배포 안전성

환경을 통해 배포합니다:

개발 → 디버그 도구로 변경 사항 테스트

스테이징 → 프로덕션과 유사한 환경에서 테스트

프로덕션 → 확신을 가지고 배포

장점: 사용자에게 도달하기 전에 문제를 발견.

5. 비용 최적화

서버별로 비용을 최적화합니다:

  • 개발 서버: 야간/주말에 전원 꺼짐 (50% 비용 절감)

  • IPv6 전용 서버: 탄력적 IP 비용 없음 (인스턴스당 월 $5 절감)

  • 적정 크기 인스턴스: 워크로드별로 필요한 자원에만 비용 지불

  • 장점: 성능을 희생하지 않고 인프라 비용 절감.

서버 간 데이터 흐름

데이터가 어떻게 흐르는지 이해하면 분리가 왜 중요한지 설명하는 데 도움이 됩니다:

사용자 요청 흐름

제품 페이지 요청:

sequenceDiagram
    participant User
    participant CDN
    participant Web as Web Server
    participant Search as Search Service
    participant Cache as Cache Server
    
    User->>CDN: 제품 페이지 요청
    CDN->>CDN: 캐시 확인
    alt Cache hit
        CDN->>User: 캐시된 페이지 제공
    else Cache miss
        CDN->>Web: 요청 전달
        Web->>Search: 관련 제품 가져오기
        Search->>Cache: 임베딩 쿼리
        Cache->>Search: 결과 반환
        Search->>Web: 관련 제품
        Web->>CDN: 렌더링된 페이지
        CDN->>CDN: 응답 캐싱
        CDN->>User: 페이지 제공
    end

검색 쿼리 흐름:

sequenceDiagram
    participant User
    participant Web as Web Server
    participant Search as Search Service
    participant Cache as Cache Server
    
    User->>Web: 검색 쿼리 제출
    Web->>Search: 쿼리 전달
    Search->>Search: 필터 추출
    Search->>Search: 임베딩 계산
    Search->>Cache: 벡터 검색
    Cache->>Search: 순위가 매겨진 결과
    Search->>Web: 제품 일치 항목
    Web->>User: 결과 렌더링

장점: 각 서버가 최적화된 작업을 수행.

서버별 저장 전략

다른 서버는 다른 저장 전략을 사용합니다:

웹 서버

S3 기반 정적 파일: S3에서 제공되는 이미지, CSS, JS

  • 높은 가용성

  • 로컬 디스크 사용 없음

  • CDN 친화적

로컬 캐시: Nginx가 렌더링된 페이지 캐싱

  • 빠른 반복 접근

  • 자동 무효화

검색 서비스

NumPy 배열: 이진 배열로 저장된 제품 임베딩

  • 빠른 벡터 연산

  • 효율성을 위한 메모리 매핑

  • 65K 제품 × 768 차원 = ~190 MB

JSON 파일: 필터 매핑, 구문 테이블

  • 사람이 읽을 수 있음

  • 업데이트 용이

  • 작은 크기 (<10 MB)

캐시 서버

Valkey (Redis): 쿼리 임베딩, 인기 쿼리, 자동 완성

  • 속도를 위한 메모리 내 저장

  • 벡터 인덱스를 위한 RediSearch

  • 내구성을 위한 지속성

왜 다른 저장소를 사용하나요?

  • NumPy: 벡터 수학에 최적화 (코사인 유사도)

  • JSON: 사람이 편집하는 데 최적화 (필터 규칙)

  • Valkey: 키-값 조회에 최적화 (쿼리 캐시)

CDN 아키텍처

공개 웹사이트는 콘텐츠 전송 네트워크 뒤에 위치합니다:

무엇이 캐시되나요

정적 자산 (긴 TTL):

  • 이미지, CSS, JavaScript

  • 글꼴, 아이콘

  • 1년 동안 캐시

제품 페이지 (중간 TTL):

  • 제품 설명

  • 사양

  • 1시간 동안 캐시

쿼리 페이지 (짧은 TTL):

  • 검색 결과

  • 필터 조합

  • 5분 동안 캐시

캐시되지 않음:

  • 사용자별 콘텐츠

  • API 엔드포인트

  • 동적 검색

왜 CDN이 중요한가

  • 글로벌 지연 시간: 에지 로케이션이 사용자에게 더 가까운 곳에서 콘텐츠 제공

  • 오리진 보호: CDN이 트래픽 급증을 흡수, 오리진 서버 보호

  • DDoS 완화: CDN이 악성 트래픽을 오리진에 도달하기 전에 필터링

  • 비용 절감: 오리진 요청 감소 = 컴퓨팅 비용 절감

배포 파이프라인

문제를 조기에 발견하기 위해 환경을 통해 배포합니다:

개발 환경

목적: 디버그 도구를 통한 빠른 반복 기능:

  • 코드 변경 시 자동 재로드

  • 상세한 오류 페이지

  • 디버그 도구 모음

  • 캐싱 없음

장점: 개발자를 위한 빠른 피드백 루프.

스테이징 환경

목적: 프로덕션과 유사한 테스트 기능:

  • 프로덕션과 동일한 구성

  • 동일한 서버 설정 (Gunicorn, Nginx)

  • 동일한 캐싱 동작

  • 프로덕션 데이터로부터 격리

장점: 배포 전 프로덕션 특정 문제 발견.

프로덕션 환경

목적: 실제 사용자 제공 기능:

  • 성능에 최적화

  • 전체 캐싱 활성화

  • 모니터링 및 경고

  • 충돌 시 자동 재시작

장점: 안정적이고 신뢰할 수 있는 서비스.

참고 자료

기술 개념

AWS 서비스

  • CloudFront - AWS CDN 문서

  • S3 - AWS 객체 저장소 문서

  • DynamoDB - AWS NoSQL 데이터베이스 문서

관련 글

요약

우리의 멀티 서버 아키텍처는 전문화된 서버에 걸쳐 관심사를 분리합니다:

프로덕션 ERP 서버:

  • 내부 관리 시스템

  • 24/7 가동 시간

  • 공유 스토리지 및 이메일

공개 웹사이트 서버:

  • 고객 대면 웹사이트

  • 24/7 가동 시간

  • S3 기반 정적 파일과 함께 CDN 뒤에 위치

개발/스테이징 서버:

  • 안전한 테스트 환경

  • 이메일 캠페인 처리

  • 비용 최적화 (야간/주말에 전원 꺼짐)

검색 서비스 서버:

  • 벡터 유사도 검색

  • 필터 추출

  • NumPy 기반 임베딩

캐시 서버 (Valkey):

  • 쿼리 임베딩 캐시

  • RediSearch 벡터 인덱스

  • 인기 쿼리 순위

주요 장점:

  • 자원 격리: 워크로드 간 경쟁 없음

  • 독립적 확장: 필요한 것만 확장

  • 장애 격리: 장애가 전파되지 않음

  • 배포 안전성: 프로덕션 전 테스트

  • 비용 최적화: 적정 크기 인스턴스, 전원 일정

  • 성능: CDN 캐싱, 전문화된 저장 전략

이 아키텍처는 높은 가용성, 낮은 지연 시간, 관리 가능한 비용을 유지하면서 수백만 건의 요청을 제공할 수 있게 합니다.


← 문서 색인으로 돌아가기