database-scaling

3 개의 포스트

12개월 이내에 K8 (새 탭에서 열림)

피그마(Figma)는 급격한 사용자 증가에 따른 데이터베이스 부하 문제를 해결하기 위해 단일 PostgreSQL 환경에서 Vitess 기반의 수평적 샤딩 아키텍처로 성공적으로 전환했습니다. 이 과정에서 피그마는 서비스 중단 없이 대규모 데이터를 마이그레이션했으며, 수직적 확장의 한계를 극복하고 무한한 확장성을 갖춘 데이터 플랫폼을 구축했습니다. 결론적으로 이들은 기술적 부채를 체계적으로 관리하며 분산 데이터베이스 시스템으로의 진화가 서비스 성장의 필수 요소임을 입증했습니다. **수직적 확장과 수직적 분할의 한계** * 피그마는 초기 AWS RDS의 가장 큰 인스턴스(r5.24xlarge 등)를 사용하며 수직적 확장(Vertical Scaling)에 의존했으나, 결국 CPU와 IOPS의 물리적 한계에 도달했습니다. * 이를 해결하기 위해 먼저 테이블 단위로 데이터베이스를 나누는 '수직적 분할(Vertical Partitioning)'을 시행하여 특정 도메인(파일, 조직 등)을 별도 데이터베이스 인스턴스로 분리했습니다. * 수직적 분할은 일시적으로 숨통을 틔워주었지만, 각 도메인 내의 데이터가 계속 비대해지면서 단일 인스턴스가 감당할 수 없는 수준에 이르러 결국 수평적 샤딩이 불가피해졌습니다. **Vitess 도입을 통한 수평적 샤딩** * 피그마는 유튜브와 슬랙 등에서 검증된 오픈소스 데이터베이스 클러스터링 시스템인 Vitess를 도입하여 대규모 수평적 확장을 구현했습니다. * Vitess는 애플리케이션 계층에서 복잡한 샤딩 로직을 처리할 필요 없이, SQL 프록시 역할을 수행하며 쿼리를 적절한 샤드(Shard)로 라우팅해주는 기능을 제공합니다. * 데이터 분산의 핵심인 '샤딩 키(Sharding Key)'를 신중하게 선정하여 데이터가 특정 노드에 쏠리는 핫스팟 현상을 방지하고 부하를 고르게 분산시켰습니다. **무중단 마이그레이션과 데이터 정합성 보장** * 서비스를 운영하면서 데이터를 옮기기 위해 Vitess의 'MoveTables' 및 'VReplication' 기능을 활용하여 구형 데이터베이스에서 신규 샤드 클러스터로 데이터를 실시간 복제했습니다. * 마이그레이션 중 데이터 유실이나 오염을 방지하기 위해 'Shadow Mode'를 운영하여, 실제 쓰기 작업을 수행하기 전 구 데이터베이스와 신규 데이터베이스의 결과를 비교 검증했습니다. * 최종 전환 시점에는 짧은 읽기 전용(Read-only) 모드를 거쳐 트래픽을 신규 클러스터로 전환함으로써 사용자 경험에 지장을 주지 않는 제로 다운타임에 가까운 마이그레이션을 달성했습니다. **운영 자동화와 가시성 확보** * 수백 개의 샤드를 효율적으로 관리하기 위해 데이터베이스 팀은 쿼리 분석 및 자동 킬러(Query Killer) 시스템을 구축하여 비효율적인 쿼리가 전체 시스템에 영향을 주지 않도록 제어했습니다. * 대규모 분산 환경에서의 모니터링을 위해 통합 대시보드를 구축하고, 각 샤드의 성능 지표를 실시간으로 추적하여 병목 현상을 사전에 감지하고 대응하는 체계를 갖추었습니다. 성공적인 데이터베이스 스케일링은 단번에 이루어지는 것이 아니라, 수직적 분할로 시간을 벌고 그 사이 견고한 수평적 샤딩 전략을 수립하는 단계적인 접근이 필요합니다. 특히 Vitess와 같은 미들웨어 도입은 인프라 복잡성을 증가시키지만, 장기적으로는 트래픽 성장에 유연하게 대응할 수 있는 가장 확실한 투자입니다. 데이터 성장이 예견되는 초기 단계부터 데이터 간의 관계를 명확히 정의하고 적절한 샤딩 키를 고민하는 것이 미래의 마이그레이션 비용을 줄이는 핵심입니다.

Figma 데이터베이스 팀이 대 (새 탭에서 열림)

제시해주신 Figma의 기술 블로그 글 **"The growing pains of database architecture"**는 급격한 성장 과정에서 단일 Postgres 데이터베이스의 한계를 극복하기 위해 Figma 엔지니어링 팀이 수행한 아키텍처 혁신 과정을 다루고 있습니다. 이 글은 수직적 확장이 불가능한 시점에서 어떻게 가동 중단 없이 수평적 확장(Sharding) 체제로 전환했는지에 대한 기술적 여정을 상세히 설명합니다. --- Figma는 사용자 트래픽의 폭발적인 증가로 인해 AWS RDS의 가장 큰 인스턴스조차 감당할 수 없는 병목 현상에 직면했습니다. 이를 해결하기 위해 단순한 읽기 복제본 추가를 넘어, 데이터를 기능별로 나누는 '수직적 분할'과 동일 테이블을 여러 장비에 분산하는 '수평적 샤딩'을 단계적으로 도입했습니다. 결과적으로 Figma는 데이터베이스를 유연하게 확장할 수 있는 구조를 갖추게 되었으며, 이는 서비스 안정성과 성능을 획기적으로 향상시켰습니다. ### 수직적 확장의 한계와 초기 대응 * **단일 DB의 임계치 도달:** 초기에는 단일 AWS RDS 인스턴스에 모든 데이터를 저장했으나, 쓰기 작업량이 r5.24xlarge 등 최고 사양 인스턴스의 처리 용량을 넘어섰습니다. * **읽기 복제본(Read Replicas)의 활용:** 읽기 트래픽은 복제본을 통해 분산했으나, 데이터 수정이 빈번한 작업 특성상 복제 지연(Replication Lag)이 발생하여 사용자 경험에 악영향을 주었습니다. * **수직적 테이블 분할 (Vertical Partitioning):** 첫 번째 해결책으로 관련 있는 테이블들을 묶어 별도의 데이터베이스 인스턴스로 분리했습니다. 이는 단기적으로 부하를 분산했지만, 테이블 간 Join 쿼리가 불가능해지고 트랜잭션 관리가 복잡해지는 비용이 발생했습니다. ### 수평적 샤딩(Horizontal Sharding) 도입 과정 * **샤드 키(Shard Key) 선정:** 특정 테이블(예: 파일, 레이어)이 너무 커져서 단일 인스턴스에 담을 수 없게 되자, 데이터를 행(Row) 단위로 분산하는 샤딩을 결정했습니다. '조직 ID(Org ID)'를 주요 샤드 키로 설정하여 관련 데이터를 동일한 물리적 위치에 배치했습니다. * **쿼리 라우팅 계층 구축:** 애플리케이션과 DB 사이에 쿼리를 적절한 샤드로 전달하는 중간 계층(Query Router)을 직접 구현했습니다. 이를 통해 애플리케이션 코드는 데이터가 어느 물리적 서버에 있는지 몰라도 쿼리를 수행할 수 있게 되었습니다. * **Vitess의 검토와 채택:** 처음에는 자체 솔루션을 사용했으나, 관리의 복잡성을 줄이기 위해 오픈소스 데이터베이스 클러스터링 시스템인 Vitess 도입을 결정하고 이를 Postgres 환경에 맞게 최적화했습니다. ### 무중단 데이터 마이그레이션 전략 * **섀도우 쓰기(Shadow Writes):** 새로운 샤딩 환경을 구축한 후, 실시간 데이터를 기존 DB와 신규 DB에 동시에 기록하며 시스템의 안정성을 검증했습니다. * **데이터 검증(Data Validation):** 스냅샷 비교와 실시간 체크섬 확인을 통해 기존 데이터와 샤딩된 데이터 간의 일관성을 100% 보장했습니다. * **점진적 전환(Canary Rollout):** 전체 트래픽을 한 번에 옮기지 않고, 일부 사용자나 조직부터 단계적으로 신규 아키텍처로 전환하여 리스크를 최소화했습니다. ### 운영 효율화를 위한 도구 및 인프라 * **DBProxy 개발:** 수만 개의 애플리케이션 연결을 효율적으로 관리하기 위해 고성능 커넥션 풀링(Connection Pooling)과 쿼리 분석 기능을 갖춘 DBProxy를 구축했습니다. * **가시성(Observability) 확보:** 샤드별 부하 상태, 쿼리 성능, 복제 지연 등을 실시간으로 모니터링할 수 있는 대시보드를 구축하여 병목 지점을 즉각 파악하도록 했습니다. --- **결론 및 추천** Figma의 사례는 서비스 초기부터 복잡한 샤딩을 도입하기보다는, **수직적 분할 → 논리적 샤딩 → 물리적 샤딩**으로 이어지는 단계적 접근이 실무적으로 유효함을 보여줍니다. 데이터베이스 확장을 고민하는 팀이라면 처음부터 완벽한 분산 시스템을 구축하기보다, 데이터 간의 관계를 분석하여 적절한 샤드 키를 선정하고 쿼리 라우팅 계층을 추상화하는 작업부터 시작할 것을 권장합니다.

데이터베이스 아키텍처 (새 탭에서 열림)

피그마(Figma)는 급격한 사용자 증가에 따른 데이터베이스 부하 문제를 해결하기 위해 단일 Postgres 인스턴스에서 분산된 Vitess(MySQL 기반) 클러스터로 전환하는 대규모 샤딩 프로젝트를 성공적으로 완수했습니다. 이 과정에서 피그마 엔지니어링 팀은 서비스 중단 없이 테라바이트급 데이터를 이전하기 위해 정교한 실시간 복제 및 검증 시스템을 구축했습니다. 결론적으로 이들은 인프라의 한계를 미리 예측하고, 애플리케이션 계층의 수정을 최소화하면서도 수평적 확장이 가능한 데이터 아키텍처를 확보하게 되었습니다. ### 수직적 확장의 한계와 샤딩의 필연성 * 초기 피그마는 단일 AWS RDS Postgres 인스턴스에 의존했으나, 트래픽이 급증하며 가장 큰 인스턴스 크기로도 쓰기 부하를 감당할 수 없는 임계점에 도달했습니다. * 수직적 확장(Vertical Scaling)과 읽기 복제본(Read Replicas) 추가만으로는 쓰기 성능 문제를 해결할 수 없음을 인지하고, 데이터를 여러 노드에 나누어 저장하는 수평적 확장(Sharding)을 결정했습니다. * 자체적인 샤딩 솔루션을 구축하는 대신, 유튜브 등에서 검증된 오픈소스 데이터베이스 클러스터링 시스템인 Vitess를 도입하여 운영 복잡성을 관리하기로 했습니다. ### Postgres에서 Vitess로의 대규모 이관 전략 * 기존 Postgres 환경에서 MySQL 기반의 Vitess로 전환하는 것은 데이터 모델과 쿼리 호환성 측면에서 큰 도전이었으며, 이를 위해 'FDB(Figma Database)'라는 중간 레이어를 구축했습니다. * **Shadow Writing(새도우 라이팅):** 모든 쓰기 작업을 기존 DB와 새 Vitess DB에 동시에 수행하여 데이터 정합성을 실시간으로 확인했습니다. * **Logical Replication(논리적 복제):** 기존 데이터를 중단 없이 옮기기 위해 CDC(Change Data Capture) 기술을 활용하여 소스 데이터베이스의 변경 사항을 실시간으로 Vitess에 반영했습니다. ### 무중단 컷오버와 정합성 검증 * 데이터 이전의 신뢰성을 확보하기 위해 'Consistency Checker'를 가동하여 기존 DB와 새 DB의 레코드를 지속적으로 비교하고 불일치를 해결했습니다. * **Query Replay:** 실제 운영 트래픽을 복제하여 대상 시스템에 미리 실행해 봄으로써 성능 병목 지점과 쿼리 호환성 문제를 사전에 파악했습니다. * 최종 전환 시에는 아주 짧은 읽기 전용(Read-only) 시간을 가진 후, 트래픽의 방향을 Vitess로 돌리는 방식을 통해 사용자 경험에 영향을 주지 않고 성공적으로 전환했습니다. ### 개발자 경험 보존을 위한 쿼리 라우팅 * 샤딩된 환경에서도 개발자들이 개별 샤드의 위치를 신경 쓰지 않고 개발할 수 있도록 투명한 쿼리 라우팅 시스템을 구현했습니다. * 크로스 샤드 조인(Cross-shard join)과 같이 분산 환경에서 성능이 저하될 수 있는 쿼리들을 모니터링하고, 필요에 따라 스키마 설계를 최적화하여 분산 시스템의 성능 이점을 극대화했습니다. * 애플리케이션 코드의 대대적인 수정 없이도 샤딩된 데이터베이스를 활용할 수 있게 함으로써 피쳐 개발 속도를 유지했습니다. 급격히 성장하는 서비스에서 데이터베이스 확장은 피할 수 없는 과제이며, 이를 위해 서비스 초기부터 데이터 간의 관계(Entity Groups)를 명확히 정의해두는 것이 추후 샤딩 난이도를 낮추는 데 결정적인 역할을 합니다. 또한, 대규모 인프라 변경 시에는 완벽한 자동화보다는 단계적인 검증과 새도우 트래픽 테스트를 통해 데이터 유실 리스크를 최소화하는 보수적인 접근 방식이 권장됩니다.