키-값 저장소(Key-Value Store) 설계, 어디까지 파고들 수 있을까?

by DD
4개월 전
조회수 6

요구 사항 정의(Requirements)의 중요성을 강조하며, 기능적/비기능적 요구 사항을 명확히 해야 함

메모리 우선(Memory-First) 아키텍처를 채택하여 P99 지연 시간(Latency) 목표 달성을 위한 설계

일관성(Consistency), 지연 시간(Latency), 내구성(Durability) 간의 트레이드오프(Trade-offs)를 분석하고, 튜닝 가능한 설계를 제안

운영(Operations) 측면에서 단일 노드 실패, 디스크 실패, AZ 실패 등 다양한 장애 시나리오(Failure Scenarios)를 고려

요구 사항 정의의 중요성

시스템 설계의 핵심은 요구 사항을 정확하게 파악하는 것이다. 기능적 요구 사항(Functional Requirements)은 Get과 Put 연산으로 단순하게 정의되지만, 비기능적 요구 사항(Non-Functional Requirements)은 시스템의 제약 조건을 결정한다. 4TB 데이터, 20ms 지연 시간, 초당 10만 요청 처리, 64바이트 키, 1KB 값, 90% 읽기/10% 쓰기 비율 등의 제약 조건은 시스템 설계를 구체화하는 데 필수적이다.

메모리 우선 아키텍처와 지연 시간 최적화

20ms의 P99 지연 시간 목표를 달성하기 위해 메모리 우선(Memory-First) 아키텍처를 채택한다. 디스크 접근은 지연 시간을 증가시키므로, 읽기 경로는 메모리에, 쓰기 경로는 비동기적으로 디스크에 저장한다. 이러한 설계는 인메모리 룩업(In-memory Lookup)을 통해 빠른 응답 시간을 보장하며, 디스크는 내구성을 위한 보조 수단으로 활용된다. 하지만, 메모리 사용량과 비용에 대한 고려가 필요하다.

일관성, 지연 시간, 내구성 간의 트레이드오프

시스템 설계에서 일관성(Consistency), 지연 시간(Latency), 내구성(Durability)은 상충 관계에 있다. 20ms P99 지연 시간을 위해서는 쿼럼(Quorum) 기반의 읽기/쓰기(R=2, W=2)를 사용하는 것이 좋지만, 이는 지연 시간을 증가시킬 수 있다. 따라서, 요청별로 일관성 수준을 선택할 수 있도록 하여, 튜닝 가능한 설계(Tunable Design)를 제공하는 것이 중요하다. 또한, 비동기 쓰기를 통해 지연 시간을 개선할 수 있지만, 데이터 손실의 위험이 있다.

장애 시나리오 및 운영 고려 사항

단일 노드 실패, 디스크 실패, AZ 실패 등 다양한 장애 시나리오에 대한 대비가 필요하다. 단일 노드 실패 시에는 노드 교체(Node Replacement)를 통해, 디스크 실패 시에는 자가 격리(Self-Demote)를 통해 시스템의 안정성을 유지해야 한다. AZ 실패 시에는 복제 팩터(Replication Factor)를 고려하여, 쿼럼 유지를 위한 설계를 해야 한다. 운영 측면에서는 모니터링(Monitoring), 경고(Alerting), 롤아웃 계획(Rollout Plan)을 통해 시스템의 안정적인 운영을 보장해야 한다.

핫 키(Hot Key) 문제 해결 전략

핫 키(Hot Key)는 특정 키에 대한 과도한 트래픽으로 인해 시스템 성능을 저하시키는 문제이다. 이를 해결하기 위해 캐싱(Caching), 요청 병합(Request Coalescing), 파티션 분할(Partition Splitting), 핫 키 전용 처리(Special handling for hot keys) 등의 전략을 사용할 수 있다. 이러한 전략들은 시스템의 복잡성을 증가시키지만, 핫 키로 인한 성능 저하를 방지하는 데 효과적이다.

Designing A Key-Value Store