본문으로 건너뛰기
피드

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

Go에서 Rust로 옮길 때 진짜로 바뀌는 것들

이 글은 Go 백엔드 서비스를 Rust로 옮길 때 속도보다 컴파일 타임 보장, 런타임 트레이드오프, 개발자 경험이 더 중요하다고 설명한다. nil 패닉, 데이터 레이스, 에러 처리, 제네릭, 비동기 모델, 마이그레이션 전략까지 실무 관점에서 Go와 Rust를 길게 비교한다.

backend

Python 3.15에서 헤드라인은 못 탔지만 꽤 쓸만한 기능들

Python 3.15에는 lazy imports나 Tachyon profiler 같은 큰 기능 말고도 실무에서 바로 체감될 만한 작은 개선들이 들어가. TaskGroup 취소, 컨텍스트 매니저 데코레이터 개선, 스레드 안전 이터레이터처럼 평소 애매하게 불편했던 지점들이 꽤 깔끔해졌어.

backend

심평원, DUR부터 의료영상 심사까지 클라우드로 갈아엎는다

심평원이 정보시스템 클라우드 전환과 함께 병·의원 업무에 직접 닿는 DUR, 의료영상 AI 심사, 요양급여내역 조회 시스템을 고도화한다. 핵심은 설치형 프로그램 중심이던 연계를 웹과 API 기반으로 넓히고, 진료·청구 과정에서 실시간 확인과 자동 판독을 강화하는 쪽이다.

backend

윈도우 에러 코드 7번 ‘ERROR_ARENA_TRASHED’는 어디서 왔을까

ERROR_ARENA_TRASHED는 Win32에서 실제로 쓰이는 현대적 에러라기보다 MS-DOS 시절 메모리 관리 구조에서 넘어온 잔재야. MS-DOS가 메모리 블록 앞의 arena 시그니처를 훑다가 예상한 값이 아니면 ‘arena가 망가졌다’고 보고 이 에러를 냈다는 이야기야.

backend

C/C++ 컴파일러의 느슨한 메모리 동시성 버그를 자동으로 잡는 박사논문

C와 C++ 컴파일러에서 relaxed memory 동시성 버그를 찾는 자동 테스트 프레임워크를 다룬 박사논문이 공개됐어. Téléchat, Atomic-mixer 같은 도구로 소스 수준 동작과 컴파일된 프로그램 동작을 비교하고, LLVM과 GCC 툴체인에서 실제 버그를 찾아낸 내용이 핵심이야.