본문으로 건너뛰기
피드

Redpanda Cloud Topics GA — S3에 직접 쓰는 스트리밍 엔진의 내부 아키텍처

backend 약 4분
vote
0
댓글
북마크

Redpanda 26.1에서 Cloud Topics가 GA 출시. 데이터를 로컬 Raft 대신 오브젝트 스토리지에 직접 써서 Cross-AZ 복제 비용을 없애고, L0/L1 파일 구조로 쓰기와 읽기를 각각 최적화하는 아키텍처를 상세히 설명.

  • 1

    데이터는 S3/GCS에, 메타데이터는 Raft 로그에 분리 저장

  • 2

    Cross-AZ 네트워킹 비용 원천 제거

  • 3

    L0(쓰기 최적화) → Reconciler → L1(읽기 최적화) 구조

  • 4

    트랜잭션/멱등성 보장은 Raft 플레이스홀더로 유지

  • Redpanda의 Cloud Topics가 26.1 버전에서 GA(일반 출시)됨 — 데이터를 로컬 디스크 대신 S3/GCS 같은 오브젝트 스토리지에 직접 저장하는 새로운 토픽 타입
    • 같은 클러스터 안에서 일반 토픽과 Cloud Topics를 섞어 쓸 수 있음
    • 핵심은 Cross-AZ 네트워킹 비용 회피 — Raft로 복제하지 않고 오브젝트 스토리지에 직접 쓰므로 AZ 간 데이터 전송 비용이 사라짐

쓰기 경로: 비용 최적화

  • 프로듀서 데이터가 들어오면 Kafka API 레이어를 거치지만, 로컬 Raft 로그에 전체 페이로드를 쓰지 않음
    • 메모리에서 시간(예: 0.25초) 또는 크기(예: 4MB) 기준으로 배칭
    • 모든 파티션과 토픽의 데이터를 동시에 모아서 하나의 L0 파일로 S3에 업로드 — PUT 요청 수를 대폭 줄임
  • L0 파일이 오브젝트 스토리지에 안전하게 저장되면, 각 파티션의 Raft 로그에는 플레이스홀더 배치(파일명 + 오프셋)만 복제
    • 그 후 프로듀서에 ACK 반환
    • 트랜잭션과 멱등성(idempotency) 보장은 이 플레이스홀더가 기존 Raft 경로를 재사용하기 때문에 그대로 유지됨

읽기 경로: L0 → L1 최적화

  • 대부분의 스트리밍 워크로드(tailing consumer)는 메모리 캐시에서 직접 읽으므로 지연이 낮음
  • 문제는 캐시 미스 시 L0 파일에서 읽어야 하는 경우
    • L0는 여러 파티션 데이터가 뒤섞여 있어서 특정 파티션 히스토리를 읽으려면 scattered read 발생
  • Reconciler라는 백그라운드 프로세스가 L0 데이터를 파티션별로 재정렬해서 L1 파일로 재작성
    • L1 파일은 훨씬 크고, 같은 파티션 범위가 물리적으로 함께 있고, 오프셋순 정렬됨
    • 읽기 시 Last Reconciled Offset 기준으로 L0/L1 분기 — 최근 데이터는 L0(또는 캐시), 과거 데이터는 L1에서 고효율 스트리밍

💡

> Kafka의 Tiered Storage와 달리, Cloud Topics는 처음부터 오브젝트 스토리지에 쓰는 구조라 Cross-AZ 복제 비용이 원천적으로 없음. 비용 민감한 대용량 스트리밍 워크로드에서 특히 유리함.


기술 맥락

  • Kafka 진영에서 Tiered Storage(KIP-405)가 "차가운 데이터를 오브젝트 스토리지로 내리는" 접근이었다면, Redpanda Cloud Topics는 아예 처음부터 오브젝트 스토리지에 쓰는 거예요. 설계 철학이 근본적으로 다르거든요
  • Cross-AZ 복제 비용이 왜 중요하냐면, AWS에서 AZ 간 데이터 전송이 GB당 $0.01인데, 대량 스트리밍에서는 이게 엄청 쌓여요. Raft 3-way 복제를 하면 같은 데이터가 AZ를 3번 넘나드는데, S3에 한 번 쓰면 S3 자체가 AZ 간 내구성을 보장하니까 이 비용이 사라지는 거
  • L0/L1 구조는 LSM-tree의 compaction과 비슷한 패턴이에요. 쓰기 최적화(L0, 여러 파티션 혼합)와 읽기 최적화(L1, 파티션별 정렬)를 분리하되, 백그라운드 reconciler가 점진적으로 변환하는 방식. 실시간 tailing은 메모리 캐시로 처리하고, 과거 데이터 조회만 L1에서 읽으니 대부분의 워크로드에서 지연 영향이 거의 없음

Kafka Tiered Storage가 '차가운 데이터를 내리는' 접근이라면, Cloud Topics는 아예 처음부터 오브젝트 스토리지에 쓰는 패러다임. 비용 구조 자체가 달라짐.

댓글

댓글

댓글을 불러오는 중...

backend

클릭하우스가 PgBouncer 처리량을 4배로 끌어올린 방법

ClickHouse Managed Postgres 팀은 단일 스레드인 PgBouncer를 여러 프로세스로 띄우고 `so_reuseport`와 피어링(peering)을 조합해 16 vCPU 머신을 제대로 쓰게 만들었다. 동일한 AWS 환경에서 단일 프로세스는 약 8.7만 TPS 근처에서 막혔지만, 16개 프로세스 구성은 약 33.6만 TPS까지 올라갔다.

backend

SQLite 쓸 거면 STRICT 테이블을 기본값으로 보자는 주장

SQLite의 STRICT 테이블은 INTEGER 컬럼에 문자열이 들어가는 식의 타입 실수를 막아주는 기능이다. 글쓴이는 SQLite 특유의 유연한 타입 시스템보다, 실수는 빨리 터뜨리는 쪽이 실무에서 낫다고 주장한다. 다만 기존 테이블을 바로 STRICT로 바꾸기 어렵고, SQLite 3.37.0 이상에서만 쓸 수 있다는 제약도 있다.

backend

왜 아직도 Lisp를 배워볼 만한가

Lisp는 괄호가 많은 이상한 언어처럼 보이지만, 핵심은 문법이 아니라 언어 자체를 확장할 수 있다는 점에 있음. 매크로, 코드-데이터 동일성, REPL 중심 개발이 합쳐지면 프로그램을 '작성'한다기보다 살아 있는 시스템을 계속 진화시키는 방식으로 개발하게 됨.

backend

EDB 포스트그레스 AI, 포레스터 멀티모델 데이터 플랫폼 리더 선정

EDB의 AI 데이터 플랫폼 EDB 포스트그레스 AI가 2026년 2분기 포레스터 웨이브 멀티모델 데이터 플랫폼 보고서에서 리더로 선정됐음. 트랜잭션, 분석, AI 워크로드를 하나의 플랫폼에서 다루는 흐름이 강해지는 가운데, EDB는 전략과 현재 제공 기능 모두에서 높은 평가를 받았다고 밝힘.

backend

Bun, Zig에서 Rust로 갈아탔다: 11일짜리 초대형 런타임 포팅 실험

Bun 팀이 53만 줄이 넘는 Zig 코드베이스를 Rust로 기계적으로 포팅했고, Bun v1.4.0부터 Rust 기반으로 전환될 예정임. 핵심 이유는 성능보다 안정성이었고, use-after-free, double-free, 메모리 누수 같은 문제를 컴파일러와 타입 시스템으로 더 빨리 잡기 위해서였음. Claude Code 워크플로 64개를 병렬로 돌려 11일 만에 전 플랫폼 테스트 통과까지 밀어붙인 사례라, LLM 기반 대규모 코드 마이그레이션의 꽤 강한 신호탄임.