Storage and Compute Architecture
시스템·워크로드·스토리지 티어의 경계가 수렴하는 데이터 아키텍처 패턴
개요
트랜잭션·분석·하이브리드·공유 스토리지 시스템의 경계가 흐려지고 있다. OLTP/OLAP의 분리가 HTAP·LTAP로 수렴하고, 테이블 포맷이 카탈로그로 거버넌스되며, 스트림과 테이블이 같은 추상화로 통합된다. 이 토픽은 Data Infrastructure Patterns(광범위한 인프라 패턴)에서 시스템·스토리지 티어·워크로드 경계라는 좁고 깊은 아키텍처 축을 추출한다.
워크로드/스토리지 분류 체계
시스템 수·워크로드 수·가시성·durable copy 수로 아키텍처를 기술:
- Storage-Workload Architecture Taxonomy — OLTP/OLAP/HTAP/LTAP, tiering vs materializing
- Can We Agree on a Storage-Workload Architecture Taxonomy
| Type | Systems | Workloads | Copies | Example |
|---|---|---|---|---|
| Single Tier | 1 | 1 | 1 | Postgres + SSD |
| Internal Tiering | 1 | 1 | 1 | Kafka tiered storage |
| Hybrid (HTAP) | 1 | 2 | 1 | SingleStore, AliSQL DuckDB |
| Materializing | 2 | 2 | 2 | ETL/Connectors |
| Shared Tiering | 2 | 2 | 1 | LTAP, Apache Fluss |
스트림-테이블 이중성
batch vs streaming은 거짓 이분법 — “테이블 = 스트림의 materialization, 스트림 = 테이블의 history”. 통일은 더 나은 glue가 아니라 구분을 무의미하게 만드는 추상화에서 나온다.
- Real-Time Stream Processing — stream-table duality, Apache Fluss(table-first 스트리밍 스토리지), Flink streaming-first
- When Tables Became the Language of Time · From Events To Real-Time Profiles On Apache Fluss
카탈로그 중심 lakehouse
파일시스템 경로 의존성에서 벗어나, 카탈로그가 테이블 ID·발견·접근 제어·커밋 비준의 권위 있는 시스템이 된다.
- Catalog-Managed Tables — Delta Lake 4.1 + Unity Catalog, Catalog Commits GA, Hive→Iceberg 마이그레이션(column ID 기반 스키마)
- Distributed SQL Engine Operations — 공유 Iceberg 위 multi-engine 라우팅(이종 엔진, “테이블 최적화가 라우팅을 푼다”)
- Why We Moved from Hive-Style Data Lakes to Apache Iceberg · Routing Multiple Query Engines with Iceberg
파티션·청크·part 크기 관리
물리적 분할 단위의 크기가 메모리·pruning·압축·백필·planner를 동시에 좌우한다. “좋은” 전략은 정적이지 않다 — ingest 증가로 day-one 최적이 병목이 된다.
- Partition Sizing and Management — wide partition(Netflix Cassandra 동적 분할), 너무 많은 part(Cloudflare ClickHouse planner contention), TimescaleDB chunk 축소
- Dynamic Repartitioning for Time Series Workloads at Netflix · ClickHouse Query Plan Lock Contention at Cloudflare · Why We Shrank TimescaleDB Chunks from 30 Days to 7
실행 엔진의 진화
- Columnar Execution Engine — Velox + Gluten, Microsoft Fabric(JVM 우회 C++ 벡터화)
- DuckDB — 임베디드 OLAP, SQL 트랜스파일링, AliSQL HTAP 엔진, SQL 내 통계(the-stats-duck)
- Multimodal Data Processing Engine — Ray Data vs Daft(멀티모달 CPU+GPU 배치 처리)
- Database Concurrency Control — Blink-tree, 고동시성 인덱스 운영
멀티모달·반정형 스토리지
- Object Storage Evolution — S3 Tables/Vectors/Files, stage-and-commit
- Semi-Structured Data — Parquet Variant, shredding
- Lance + DuckDB가 멀티모달 저장 spine(→ Multimodal Data Processing Engine)
공통 원칙
- 경계의 수렴: OLTP/OLAP/HTAP/LTAP가 tiering·materialization으로 blend — “zero-copy” marketing보다 시스템·워크로드·copy 차원으로 정확히 기술
- 카탈로그가 권위: 파일 경로가 아닌 카탈로그가 테이블 ID·거버넌스·동시성 조정
- 미래 단위만 조정 = 안전: 기존 데이터 rewrite 없이 미래 파티션/청크부터 새 전략
- 데이터 모델도 차원: 3NF(OLTP) vs Kimball(분석) — 둘 다 원하면 materialization 필요
- 테이블 최적화가 라우팅을 푼다: compaction·sort가 각 쿼리에 viable한 엔진 집합 확장
dew_277~286 — “무엇을 하나로 셀 것인가”의 재설계
이번 묶음에서 반복되는 형태가 하나 있다: 물리 레이아웃을 건드리지 않고 메타데이터 레이어에서 문제를 푼다.
| 문제 | 해법 | 바꾼 것 |
|---|---|---|
| compaction이 동시 트랜잭션을 무효화 | Compaction Conflict Resolution — compaction map | 재실행 → position remap (분 → 밀리초) |
| 세그먼트 100만 개에서 컨트롤 플레인 붕괴 | Control Plane Cardinality — Segment Group | 저장 단위는 두고 조율 단위만 확대 (2자릿수 ↓) |
| CDC의 small-file + 커밋 메타데이터 폭증 | DuckLake — 카탈로그를 DB에 | 파일 포맷은 Parquet 그대로, 카탈로그 위치만 (40× 빠른 flush) |
| 벡터 인덱스를 어디에 둘까 | Puffin-Backed Derived Data | 별도 시스템 → 테이블 포맷 사이드카 |
공통 진단 질문: “물리적 데이터 조각이 너무 많은 것인가, 아니면 컨트롤 플레인이 추적해야 할 것이 단순히 너무 많은 것인가?” — 물리적 granularity가 여전히 유용하다면 데이터 레이아웃을 바꾸는 것보다 조율 단위를 바꾸는 것이 더 나은 답이다.
⚠️ 나쁜 신호 두 가지: 큰 단위가 바람직해서가 아니라 메타데이터를 통제하려고 물리 크기를 키우고 있음, 스케일링 임계 아래로 유지할 목적만으로 인위적 테이블 경계를 만들고 있음.
오브젝트 스토리지가 조율 프리미티브를 얻다
Object-Storage-Native WAL — 2024년 11월 S3 conditional write가 eventual → strong consistency 이후 가장 실질적인 변화다. if-none-match(원자적 할당)와 if-match(CAS)만으로 외부 조율 서비스 없이 오브젝트 스토리지 위에 lock-free 자료구조를 만들 수 있다.
S3가 인터넷의 malloc이라면 conditional write는 포인터가 풍부한 구조를 구성하고 변형하는 데 쓸 수 있다.
Chroma의 wal3는 30년 된 lock-free 연결 리스트 큐를 그대로 올렸다 — fragment=노드, manifest=header. 그리고 scalable commutativity rule 덕분에 컬렉션마다 다른 prefix = 컬렉션당 독립 스케일링 단위가 공짜로 나온다. 중앙 집중 로그(단일 Kafka 클러스터)가 새 고객을 받는 능력을 본질적으로 제한하는 것과 대비된다.
setsum(order-agnostic 체크섬)으로 digest(GC된 prefix) ⊎ digest(라이브) == digest(전체 이력) 불변식을 O(1)로 유지하는 것이 진짜 기여다:
시스템은 두 번 만들어져야 한다 — 기능을 위해 한 번, 검증을 위해 한 번.
쓰기 시점 레이아웃이 읽기 비용을 결정한다
Direct Lake and VertiPaq가 이것을 정량적으로 보여준다. transcoding이 컬럼 단위 on-demand이므로 쿼리 레이턴시와 capacity 소비가 “Parquet을 어떻게 썼는가”의 속성이 된다.
가장 놀라운 발견: encoding_stats footer 필드 하나의 유무로 cold first-touch가 10,857 ms → 689 ms (~15×). 페이지 내용은 동일한 채로. 인코딩만으로는 부족하고 선언이 인코딩의 일부다. → Silent Failures and Data Integrity의 또 다른 얼굴 — 파일은 완벽히 유효하고 데이터도 맞는데 15배 느리다.
그리고 row group 크기는 양 끝이 모두 실패한다 (1,172개 작은 그룹 → cold 3.5× 느림 / 16M행 = segment 상한 → 9개 segment로 scan pool이 굶음). geometry를 추정에서 유도하지 마라 — DuckDB가 143,980,961행 테이블을 14.9M으로 9.7배 과소 추정했다.
하드웨어까지 내려가면
AI Accelerator Architecture — memory wall이 여섯 아키텍처를 갈랐다. Cerebras는 “memory wall이 웨이퍼를 자른 결과”라며 톱질을 건너뛰고, Groq는 비결정성을 전부 제거해 실행 전에 레이턴시를 안다. 데이터 엔지니어 입장에서 실용적인 것은 decode가 memory-bandwidth-bound라는 사실 — 긴 컨텍스트에서는 weight-bandwidth-bound가 KV-bandwidth-bound로 옮겨갈 뿐 사라지지 않는다.
관련 위키
- Cost and Efficiency — 조율·저장 비용의 경제학
- Evaluation and Measurement — 인프라 벤치마크를 소유하기
- Storage-Workload Architecture Taxonomy
- Catalog-Managed Tables
- Partition Sizing and Management
- Real-Time Stream Processing
- Columnar Execution Engine
- DuckDB
- Distributed SQL Engine Operations
- Object Storage Evolution
- Database Concurrency Control
- Multimodal Data Processing Engine
- Compaction Conflict Resolution — 레이아웃 충돌을 remap으로
- Control Plane Cardinality — 조율 단위 분리
- Object-Storage-Native WAL — conditional write와 자기 검증
- Direct Lake and VertiPaq — 쓰기 레이아웃이 읽기 비용을 결정
- Puffin-Backed Derived Data — 사이드카 파생 데이터
- Lake Point Query Indexing
- Disaggregated OLTP Architecture
- AI Accelerator Architecture — memory wall과 컴퓨트 아키텍처
- AI Training Storage
관련 이슈: DEW #256, #258, #259, #260, #262, #266, #268, #270, #272, #273, #274, #276, #277, #279, #281, #284, #285, #286