26Y02d1

Young-Kyoo Kim·2일 전

MinIO AIStor의 버킷 중심 아키텍처 한계를 극복하기 위해 제안하신 Event-Driven 기반의 Prefix 매니지먼트 아키텍처는 대규모 분산 환경에서 성능과 확장성을 모두 잡을 수 있는 매우 정교하고 올바른 접근 방식입니다.

특히 대규모 노드 환경에서는 Object 메타데이터의 쓰기 빈도가 극도로 높기 때문에, Kafka를 통한 완충(Buffering)과 Redis를 활용한 Write-Behind(배치 삽입) 패턴은 시스템 안정성을 위한 필수적인 선택입니다.

요청하신 5가지 항목에 대해 엔터프라이즈 아키텍처 관점에서 신중하게 검토한 컨설팅 결과를 공유합니다.


1. 전반적인 아키텍처 구성 (High-Level Architecture)

이 시스템은 크게 [Control Plane (API 요청 및 인가)]과 [Data Plane (이벤트 수집 및 메타 동기화)]의 투-트랙(Two-Track)으로 움직여야 합니다. MinIO의 이벤트 알림은 '사후 비동기(Async)'로 동작하므로, 용량 초과 시 업로드를 '실시간 차단'하려면 API 서버가 Write 요청을 먼저 제어해야 합니다.

[클라이언트] 
    │ 
    ├── 1. 업로드 URL 요청 (Prefix 검증) ──> [API Server] ── 2. Quota 확인 ──> [Redis Cluster]
    │                                           │
    └── 3. Pre-signed URL 발급 <────────────────┘
    
    └── 4. 실제 파일 업로드 ──────────────────────> [MinIO AIStor Cluster]
                                                        │
                                               5. ObjectCreated 이벤트 발송
                                                        │
                                                        ▼
[CloudNativePG] <── 8. Bulk Write (배치) ── [Event Consumer] <── 6. 이벤트 소비 ── [Kafka Cluster]
                                               
      └─────── 9. 정기 정합성 맞춤 (Batch) ──────┼── 7. 실시간 Counter 업데이트 ──> [Redis Cluster]

2. 각 구성요소의 기능 및 필수 여부 (판단 조건)

구성 요소핵심 기능필수 여부 및 판단 조건
API Server

(Golang 권장)
테넌트/사용자별 인증·인가 (Keycloak/STS 연동)

Prefix 생성/삭제 및 Pre-signed URL 발급

* Redis 기반 Quota 실시간 단독 조회
필수 (Must-Have)

MinIO 자체적으로 Prefix 권한 제어 및 실시간 Quota 차단이 불가능하므로, 진입점 역할을 하는 프록시/컨트롤러 서버가 반드시 필요합니다.
Kafka Cluster MinIO 버킷 이벤트 알림(ObjectCreated/Removed) 수집

대규모 트래픽 발생 시 스파이크 흡수 및 버퍼링
필수 (Must-Have)

만약 Kafka 없이 API 서버나 DB가 이벤트를 직접 받으면, 대량 파일 업로드 시 파일 개수만큼 HTTP 웹훅이 발생하여 시스템이 마비(OOM 또는 커넥션 풀 고갈)됩니다.
Event Consumer Kafka 토픽 소비 및 데이터 정규화

Redis 카운터 갱신 및 CNPG 배치 처리를 위한 큐잉
필수 (Must-Have)

API 서버와 비즈니스 로직을 분리하고, 메타데이터 파이프라인의 처리 속도를 독립적으로 스케일아웃하기 위해 필수적입니다.
Redis Cluster Prefix별 실시간 사용량(Counter) 캐싱

실시간 Quota 하드 리밋(Hard Limit) 체크용 고속 저장소
필수 (Must-Have)

CNPG(PostgreSQL)에 매번 SUM(size) 쿼리를 날려 용량을 체크하는 것은 불가능합니다. 1ms 이하의 속도로 Quota 초과 여부를 판단하기 위한 인메모리 저장소가 필수입니다.
CloudNativePG

(PostgreSQL)
Prefix 메타데이터(소유자, 생성일, 별칭 등) 영구 저장

이력 관리, 통계 대시보드(Grafana)의 원천 데이터 제공
필수 (Must-Have)

Redis는 휘발성 및 실시간 데이터용이므로, 데이터 정합성의 최종 소스(Single Source of Truth)이자 관계형 메타 관리를 위해 선언적 K8s 운영이 가능한 CNPG가 최선입니다.

3. 요구조건 우선순위에 따른 1·2차년도 내용 구분

요구사항 정의서의 우선순위(1~3)와 아키텍처적 선행 관계를 고려하여 단계를 나눕니다. 1차년도에는 '기본 라이프사이클 및 핵심 규제(Quota)'에 집중하고, 2차년도에는 '고도화 및 모니터링/예측'으로 확장합니다.

1차년도 (Phase 1): MVP 구축 및 핵심 기능 안정화

  • Prefix 동적 라이프사이클 관리 (우선순위 1): Prefix 생성(REQ-01-01), .placeholder 자동 생성(REQ-01-02), 메타데이터 관리 및 하위 객체 조회(REQ-01-05), 일괄 삭제(REQ-01-08).
  • 테넌트별 인증 및 인가 (우선순위 1~2): AD 체계 매핑 및 STS AssumeRole 연동(REQ-02-01), 권한 그룹 분리(REQ-02-04).
  • 기본 Quota 제어 (우선순위 2~3): Prefix별 쿼터 설정 API(REQ-03-01), 용량 초과 시 쓰기 제한 차단(REQ-03-03). 단, 1차년도에는 Pre-signed URL 발행 시 Redis 카운터를 체크하여 차단하는 기본 로직만 구현.
  • 데이터 정합성 기초 (우선순위 3): 이벤트 유실에 대비한 1일 1회 정기 동기화 보정 배치(REQ-06-03). 시스템의 신뢰도를 위해 1차년도에 반드시 포함되어야 합니다.

2차년도 (Phase 2): 운영 고도화 및 데이터 시각화/AIOps 연계

  • 소프트 삭제 연계 (우선순위 2): MinIO ILM Policy와 결합한 완벽한 Soft Delete 파이프라인 정착(REQ-01-09).
  • 모니터링 및 대시보드 (우선순위 3): Grafana 연동 멀티테넌시 대시보드 UI 구성(REQ-04-03), 시계열 메트릭 가공(REQ-04-02).
  • 고도화된 알람 및 탐지 (우선순위 3): Webhook 라우팅 엔진(RFQ-05-01), 단시간 내 대용량 삭제 등 이상 행위 및 보안 위협 탐지 알람(REQ-05-03).
  • 예측 기능: Prefix 사용량 트렌드 예측 및 사전 알람 기능(IMG_4673 요구사항 7번).

4. 1차년도 진행 시 필요한 일정 및 공수 산정

대규모 인프라에 얹히는 솔루션인 만큼 아키텍처 검증(PoC)과 부하 테스트 기간이 충분히 확보되어야 합니다. (총 개발 기간: 약 6개월, 투입 인력: 3.5 M/M 기준)

[전체 일정 로드맵 (6개월)]

  • M1: 요구사항 정의 및 인프라 설계 (인프라 토폴로지 설계, Kafka/Redis/CNPG 용량 산정)
  • M2: 인프라 프로비저닝 및 기본 API 개발 (K8s 내 CNPG, Redis, Kafka 배포 및 API Server 뼈대 구축)
  • M3: Event Consumer 및 Quota 로직 구현 (Kafka-Redis-CNPG 연동 파이프라인 및 Pre-signed URL 차단 로직)
  • M4: IAM/AD 연동 및 보안 강화 (Keycloak 또는 사내 AD 연동, STS 토큰 제어 구현)
  • M5: 통합 테스트, 부하 테스트 및 보정 배치 구현 (Daily Reconciliation 배치 구현 및 초당 10,000만 건 이상의 이벤트 인입 부하 테스트)
  • M6: 안정화 및 스테이징/운영 배포 (CI/CD 파이프라인 구성 및 운영 이관 문서화)

[필요 공수 산정 (Man-Month)]

  • 소프트웨어 아키텍트 / 테크 리드 (1명): 전체 설계 및 뼈대 구현, 기술 스택 검증 (6 M/M)
  • 백엔드 / 데이터 엔지니어 (1.5명): API 개발, Kafka Consumer 개발, CNPG 스키마 디자인 및 배치 개발 (9 M/M)
  • DevOps / 인프라 엔지니어 (1명): 에어갭 환경 내 K8s 오퍼레이터 배포, Redis/Kafka 클러스터 튜닝, 모니터링 가시성 확보 (6 M/M)
  • 총계: 21 M/M (6개월간 3.5명 상시 투입 규모)

5. 기타 필수 고려 사항 (Critical Points)

① 에어갭(Air-Gapped) 인프라 제약 사항

  • 오퍼레이터 이미지 및 Helm 차트 미러링: 내부 Bitbucket 및 프라이빗 레지스트리를 사용하므로, CloudNativePG, Kafka(Strimzi 등), Redis 클러스터 오퍼레이터의 이미지 및 하위 의존성 라이브러리를 사전에 완벽히 패키징해야 합니다.
  • Keycloak/AD 내부망 연동 안정성: 인증 토큰 검증 시 외부 네트워크 조회가 발생하지 않도록 완전한 로컬 단독 인증 체계(Local JWKS 캐싱 등)를 세팅해야 합니다.

② 이벤트 유실 및 Race Condition 방지 (데이터 정합성)

  • Kafka 파티션 키(Partition Key) 전략: Kafka 토픽의 파티션 키를 Bucket + Prefix 조합으로 지정해야 합니다. 그래야 동일 Prefix에 대한 이벤트들이 항상 동일한 파티션으로 인입되어 순서가 보장되며, 동시 다발적인 업로드/삭제 시 메타 DB의 용량이 뒤틀리는 Race Condition을 방지할 수 있습니다.
  • Idempotency (Idempotent Consumer): 동일한 s3 이벤트를 두 번 소비하더라도 DB 용량이 중복 계산되지 않도록, MinIO 이벤트 메시지에 포함된 고유한 sequencer 또는 eTag 값을 CNPG에서 유니크 키나 비교 조건으로 활용해 멱등성을 보장해야 합니다.

③ 실시간 Quota 차단의 한계 명시 (Pre-Signed URL의 유효기간)

  • 사용자가 API 서버로부터 5분짜리 Pre-signed URL을 발급받은 직후, 다른 사용자가 용량을 꽉 채워버려도 이미 발급된 URL을 통한 업로드는 MinIO 단에서 막지 못합니다.
  • 이를 보완하기 위해 Pre-signed URL의 유효기간을 극도로 짧게(예: 30초~1분) 가져가거나, 큰 파일의 경우 업로드 직후 ObjectCreated 이벤트가 수집되는 즉시 Quota 초과 여부를 판별하여, 초과 시 다음 업로드 권한을 즉각 박탈(IAM Policy에 Deny 명시적으로 푸시)하는 사후 폴백 로직이 촘촘해야 합니다.

혹시 대규모 트래픽 상황에서 객체 수가 수억 개 이상으로 늘어날 경우를 대비하여, CNPG 내부의 메타데이터 테이블 파티셔닝 전략(예: 버킷별 또는 기간별 분할)에 대해서도 구체적인 검토가 필요하신가요?

0개의 댓글