asynchronous-replication

2 개의 포스트

R2 로컬 업로드로 글로벌 (새 탭에서 열림)

Cloudflare는 전 세계 어디에서나 R2 객체 스토리지의 업로드 성능을 극대화할 수 있는 'Local Uploads' 기능을 오픈 베타로 출시했습니다. 이 기능은 클라이언트와 가장 가까운 위치에 데이터를 먼저 기록한 뒤 버킷이 위치한 지역으로 비동기 복제하는 방식을 통해, 지리적 거리로 인한 업로드 지연 시간을 최대 75%까지 단축합니다. 특히 데이터의 즉각적인 접근성과 강력한 일관성을 유지하면서도 글로벌 서비스의 쓰기 성능을 획기적으로 개선한 것이 핵심입니다. ### 전 세계 업로드 성능의 비약적 향상 * **TTLB(Time to Last Byte) 감축**: 내부 테스트 결과, 클라이언트와 버킷의 지역이 다를 때 업로드 완료까지 걸리는 시간이 최대 75% 감소했습니다. * **성능 벤치마크**: 북미 서부에서 아시아 태평양 지역 버킷으로 5MB 크기의 객체를 업로드할 때, 기존 약 2초 소요되던 시간이 Local Uploads 적용 후 약 500ms 수준으로 단축되었습니다. * **글로벌 사용자 경험 최적화**: 전 세계에 분산된 사용자로부터 미디어 콘텐츠를 수집하거나 IoT 장치의 로그 및 텔레메트리 데이터를 전송받는 애플리케이션에 이상적입니다. ### 데이터 처리 메커니즘과 거리 문제 해결 * **기존 방식의 한계**: 기존에는 사용자가 어디에 있든 데이터가 버킷이 지정된 지역의 스토리지까지 물리적으로 이동해야 했으므로, 거리가 멀수록 대기 시간과 불안정성이 증가했습니다. * **로컬 우선 쓰기**: 클라이언트가 버킷과 다른 지역에 있을 경우, R2 게이트웨이는 데이터를 클라이언트 인근 스토리지 인프라에 즉시 기록하고 메타데이터만 버킷 지역에 게시합니다. * **즉각적인 가용성**: 로컬에 쓰기가 완료되는 즉시 객체에 접근할 수 있으며, 배경에서 복제 작업이 진행되는 중에도 데이터 읽기가 가능해 대기 시간이 전혀 없습니다. ### 아키텍처 및 내부 구현 기술 * **Cloudflare Queues 활용**: 복제 작업(Replication Task)을 비동기적으로 처리하기 위해 Cloudflare Queues를 도입했습니다. 이를 통해 실패 시 재시도 처리와 부하 조절(Rate limiting)을 효율적으로 관리합니다. * **원자적 작업 처리**: 메타데이터 저장 시 객체 메타데이터 저장, 보류 중인 복제 키 생성, 복제 작업 마커 생성을 원자적(Atomic)으로 수행하여 데이터 무결성을 보장합니다. * **구성 요소**: 인증과 라우팅을 담당하는 'R2 Gateway Worker', 메타데이터를 관리하는 'Durable Object Metadata Service', 그리고 실제 암호화된 데이터를 저장하는 분산 스토리지 인프라가 협업합니다. ### 사용 환경 및 권장 사항 * **적용 방법**: Cloudflare 대시보드 설정이나 Wrangler 명령(`npx wrangler r2 bucket local-uploads enable [BUCKET]`)을 통해 기존 버킷에서 즉시 활성화할 수 있습니다. * **제한 사항**: 데이터 주권 준수가 필요한 지역 제한(Jurisdiction restriction, 예: EU 전용) 버킷에서는 이 기능을 사용할 수 없습니다. * **활용 팁**: 대시보드의 R2 버킷 메트릭 페이지에서 '지역별 요청 분포'를 확인하여, 읽기/쓰기 요청이 전 세계적으로 분산되어 있다면 Local Uploads를 활성화하는 것이 성능 최적화에 큰 도움이 됩니다.

복제의 재정의: 저지연 멀티테넌트 데이터 복제 플랫폼 구축기 (새 탭에서 열림)

데이터독(Datadog)은 모놀리식 포스트그레스(Postgres) 데이터베이스의 확장성 한계와 수동 데이터 파이프라인의 복잡성을 해결하기 위해 자동화된 관리형 데이터 복제 플랫폼을 구축했습니다. 이 플랫폼은 체계적인 변경 데이터 캡처(CDC)와 비동기 복제 방식을 통해 데이터 일관성을 유지하면서도 시스템 성능을 비약적으로 향상시켰습니다. 결과적으로 엔지니어링 팀은 인프라 관리의 부담에서 벗어나 안정적이고 낮은 지연 시간으로 대규모 데이터를 다양한 서비스 간에 자유롭게 이동시킬 수 있게 되었습니다. **포스트그레스의 확장성 한계와 데이터 재건축** * 서비스 초기에는 포스트그레스의 ACID 보장과 편의성이 유용했으나, 데이터량이 증가하면서 복잡한 조인 및 집계 쿼리의 응답 시간이 수 밀리초에서 수 초 단위로 급격히 악화되었습니다. * 특정 조직의 메트릭 요약 페이지에서 수십만 개의 행을 조인할 때 P90 지연 시간이 7초에 달했으며, 인덱스 팽창(Bloat)과 VACUUM 작업 부하로 인한 I/O 병목 현상이 발생했습니다. * OLTP 부하와 검색/필터링 부하를 분리하기 위해, 복제 과정에서 데이터를 비정규화(Denormalization)하여 전용 검색 플랫폼으로 전송하는 아키텍처로 전환했습니다. * 이러한 최적화를 통해 페이지 로드 시간을 최대 97% 단축(30초 → 1초)하고, 복제 지연 시간을 500ms 수준으로 유지하는 성과를 거두었습니다. **Temporal을 활용한 복제 파이프라인 프로비저닝 자동화** * Debezium, Kafka, Elasticsearch 등 다양한 기술 스택이 결합된 복제 파이프라인을 수동으로 구축하는 과정은 운영상 큰 부담이 되었습니다. * 포스트그레스의 `wal_level` 설정, 논리적 복제 슬롯 생성, 사용자 권한 관리, Kafka 토픽 매핑 등 반복적이고 오류가 잦은 단계를 Temporal 워크플로우를 통해 모듈화했습니다. * WAL(Write-Ahead Log) 보존 문제를 해결하기 위한 하트비트 테이블 설정부터 싱크 커넥터 배포까지의 모든 과정을 오케스트레이션하여 운영 탄력성을 높였습니다. * 자동화된 플랫폼 덕분에 개발자들은 인프라 설정 대신 혁신에 집중할 수 있게 되었으며, 멀티 테넌트 환경에서도 일관된 파이프라인 관리가 가능해졌습니다. **성능과 확장성을 위한 비동기 복제 전략** * 강한 일관성을 보장하는 동기 복제 대신, 대규모 고처리량 환경에 적합한 비동기 복제 방식을 채택했습니다. * 동기 복제는 네트워크 지연이나 복제본의 응답 상태가 기본 시스템의 성능에 직접적인 영향을 주지만, 비동기 방식은 애플리케이션의 쓰기 성능을 네트워크 지연으로부터 격리합니다. * 장애 발생 시 미세한 데이터 지연이 발생할 수 있는 트레이드오프가 있으나, 이는 확장성과 가용성을 우선시하는 데이터독의 분산 환경에 더 적합한 선택이었습니다. **결론 및 권장사항** 대규모 시스템에서 데이터베이스의 성능 저하를 방지하려면 OLTP와 읽기 전용 검색 워크로드를 분리하는 것이 필수적입니다. 이때 발생하는 복잡한 데이터 이동 문제는 Temporal과 같은 워크플로우 엔진으로 자동화하여 운영 비용을 낮추고, 비동기 복제 모델을 통해 시스템의 전체적인 처리량과 가용성을 확보하는 전략이 권장됩니다.