MCP 아키텍처 설계기 — 글로벌 인프라의 뼈대를 세우다
2025년 5월, REINDEERS 플랫폼의 인프라 재설계가 본격적으로 시작되었다. 4월 한 달 동안 우리는 기존 시스템을 전면 점검했고, AWS 싱가폴 리전에 산재된 비효율적인 구조를 확인했다. CI/CD는 단순 스크립트 수준에 머물렀고, 운영 스테이지도 명확히 구분되지 않았다. 소스 관리조차 통합되지 않아 빌드가 환경마다 달랐다. 결국 우리는 아키텍처를 완전히 다시 세워야 했다.
새로운 MCP(Multi-Cloud Point) 구조는 “홍콩을 메인 리전, 서울을 DR 리전”으로 설정하고, 각 지역의 접속은 DNSPod의 Geo Routing을 이용해 가장 가까운 리전으로 유도하도록 설계했다. 프런트엔드는 COS(Object Storage)에 정적 배포 후, Tencent CDN으로 자동 퍼블리시되며, Git push 한 번으로 모든 리전이 갱신된다. CI/CD는 Drone을 도입했다. 단순히 스크립트를 실행하는 수준이 아닌, YAML 기반의 self-service CI로 바꿔서 모든 빌드/배포 파이프라인을 코드로 관리한다.
kind: pipeline
type: docker
name: frontend-build
steps:
- name: install
image: node:20
commands:
- npm ci
- name: build
image: node:20
commands:
- npm run build
- name: deploy
image: tencentcloudtools/cli
environment:
COS_BUCKET: reindeers-front-hk
commands:
- tccli cos cp ./dist cos://${COS_BUCKET}/ --recursive
이 Drone 설정은 GitHub Action보다 훨씬 단순하면서도 빠르다. 서버 자원은 모두 CVM Auto-Scaling 그룹으로 구성되어, 트래픽 변화에 따라 자동으로 인스턴스를 확장한다. API 서버는 TKE(Kubernetes Engine) 위에서 운영되며, Ingress Controller가 CLB(Cloud Load Balancer)와 연결되어 헬스체크를 통과한 Pod만 외부에 노출된다.
데이터베이스는 TencentDB for MySQL 8.0을 사용했다. 서울-홍콩 간에는 DTS(Data Transmission Service)를 이용한 실시간 이중화 복제를 구성했다. Master는 서울(ap-seoul), Slave는 홍콩(ap-hongkong)에 위치하며, GTID 기반 복제를 통해 장애 발생 시 즉시 롤오버가 가능하다. 복제 지연은 평균 150ms 이내로 유지된다.
CHANGE MASTER TO
MASTER_HOST='seoul-db.reindeers.internal',
MASTER_USER='repl_user',
MASTER_PASSWORD='********',
MASTER_AUTO_POSITION=1;
START SLAVE;
SHOW SLAVE STATUS\G
프런트엔드는 Vue3 + Nuxt로 새로 작성했다. React + Java로 되어 있던 기존 구조는 유지보수가 어렵고, CSR과 SSR이 혼재되어 SEO와 초기 로딩 모두 불안정했다. Nuxt로 전환하면서 코드 스플리팅, SSR 캐싱, 라우팅 구조가 개선되었고, 정적 빌드 파일은 COS에 저장되어 CDN 엣지에서 서빙된다.
CDN 구조는 다음과 같다.
- ap-seoul: origin
- ap-hongkong: backup + edge
- ap-bangkok: local cache
- ap-shanghai: mainland optimized node
COS 업로드 이벤트는 SCF(Serverless Cloud Function)로 트리거되어 모든 리전의 COS 버킷을 자동 동기화한다. Python SDK로 작성된 이 함수는 4개의 리전에 동시에 CopyObject 명령을 수행하며, Cloud Log Service(CLS)에 로그가 남는다.
from tencentcloud.cos import CosS3Client
def sync_handler(event, context):
client = CosS3Client(...)
for region in ["ap-hongkong", "ap-seoul", "ap-shanghai", "ap-bangkok"]:
client.copy_object(
Bucket=f"reindeers-front-{region}",
CopySource="ap-hongkong/reindeers-front-hk/index.html",
Key="index.html"
)
보안은 CAM(Cloud Access Management)과 KMS(Key Management Service)를 통해 강화했다. API 키는 각 서비스 계정별로 최소 권한 원칙에 따라 분리되며, GitHub Secrets에 저장되는 값은 Drone 빌드 시 임시 환경 변수로만 사용된다. IAM 사용자 정책은 JSON 기반으로 정의되어 코드로 버전 관리된다.
실제 시스템을 설계하면서 가장 신경 쓴 부분은 “운영 자동화와 지역 확장성”이었다. 이 MCP 구조는 2026년 인도차이나 리전으로 확장될 것을 전제로 설계되었으며, 모든 구성 요소가 코드 기반으로 재현 가능하도록 Terraform과 YAML로 문서화되었다. 시스템 엔지니어링의 기준은 단순했다.
“한 명이 만들어도, 열 명이 유지보수할 수 있어야 한다.”
이 원칙 아래, 우리는 모든 서버 설정·배포 파이프라인·DB 복제 구성까지 형상 관리에 포함시켰다. 이제 한 줄의 코드 변경이 전 세계의 CDN 엣지까지 반영되는 데 걸리는 시간은 90초를 넘지 않는다.
이것이 REINDEERS의 새로운 글로벌 인프라, ‘MCP’의 첫 번째 완성본이다.
Comments
Post a Comment