- 금융 거래 데이터베이스 TigerBeetle은 차변(debit) 과 대변(credit) 을 네이티브 지원하는 새로운 데이터베이스로, 기존 SQL 데이터베이스가 한 건의 거래에 10~20회의 쿼리를 필요로 하던 것과 달리 단일 라운드트립으로 8,190건의 거래를 처리
- 수많은 시스템이 빠른 코딩과 의존성 확장을 택하는 반면, 이 프로젝트는 코드를 천천히 쓰기, 결정적 시뮬레이션 테스트(DST), 제로 디펜던시 같은 반(反)상식 전략을 고수함
- 단일 노드 아키텍처에 의존하는 기존 OLTP 데이터베이스와 차별화하여 분산 기본값, 시계 고장 허용(cluster time), 스토리지 결함 허용을 설계에 내재화했으며, Viewstamped Replication과 Zig 선택으로 구현 단순성과 가시성을 확보
- NASA의 Power of Ten에서 영감을 받은 TigerStyle 방법론을 적용하여 함수당 평균 2개 이상의 assertion 사용, 정적 메모리 할당 강제, 프로덕션 환경에서도 assertion 활성화 등 엄격한 코딩 표준 준수
- 실시간 결제·게이밍·에너지 과금 등 초거래화 시대에 맞춘 구조로, 차세대 OLTP의 성능·정확성 기준점을 제시하고 기존 20~30년 된 SQL 데이터베이스를 대체할 차세대 트랜잭션 처리 시스템으로 부상
차변/대변 중심 데이터베이스의 필요성
- TigerBeetle은 "금융 거래 데이터베이스"로 차변(debit)과 대변(credit)을 핵심 프리미티브로 사용
- 1985년 Jim Gray가 정의한 트랜잭션의 본질은 SQL 트랜잭션이 아닌 비즈니스 트랜잭션(차변/대변) 이었음
- Gray는 20년 후에도 표준 트랜잭션 처리를 "DebitCredit"으로 정의: 은행 계좌에서 차변 처리하고 복식부기를 수행한 뒤 터미널에 응답
- 차변/대변은 단순히 회계나 은행만을 위한 것이 아니라 거래의 본질을 나타내는 공통 언어이며, ACID 같은 보장을 제공하는 이유
- 기존 SQL 데이터베이스로 차변/대변 구현 시 문제점
- 하나의 차변/대변 처리를 위해 계좌 잔액 조회, 행 잠금, 코드 내 의사결정 대기, 차변/대변 기록 등 10~20회의 SQL 쿼리가 필요
- 네트워크 왕복 시간 동안 행 잠금을 유지해야 하며, 많은 거래가 동일한 "하우스 계좌"에 접근하는 핫 로우 문제 악화
- 인도, 브라질의 월간 수십억 건 즉시 결제, 미국 FedNow, 에너지/게임/클라우드의 실시간 빌링 등으로 세계는 10년 내 최소 3자릿수 규모로 더 트랜잭션 중심이 되었으나 현재 사용하는 SQL 데이터베이스는 20~30년 전 기술
- TigerBeetle의 차별화 포인트
- 차변/대변을 1급 프리미티브로 설계하여 단일 1MiB 쿼리에 8,190건의 거래를 하나의 라운드트립으로 처리
- 창립자 Joran은 이를 "1000x 성능 아이디어"라 부르지만 "특별한 것 아님"이라고 표현
- 일반적으로 데이터베이스는 구축에 10년이 걸리지만, TigerBeetle은 3.5년 만에 완성되어 Jepsen 테스트를 통과
- 2025년 6월 Kyle Kingsbury는 모든 머신에서 다양한 위치를 손상시키면서도 TigerBeetle의 기반을 깨뜨릴 수 없었음 (내구성에 영향을 주지 않는 읽기 쿼리 엔진에서 1건의 정확성 버그만 발견)
현대적 데이터베이스 설계
기본 분산 아키텍처
- Postgres와 MySQL이 구축된 시대에는 단일 노드 패러다임이 지배적이었으나, 현재 공유 클라우드 하드웨어 시대에는 분산 패러다임이 주류
- 현대 데이터베이스는 엄격한 직렬화 가능성을 제공하며 머신 간 트랜잭션을 복제하여 중복성, 장애 허용성, 고가용성 확보 필요
- 현재 가장 인기 있는 OLTP 데이터베이스 중 일부는 여전히 단일 노드 아키텍처에 크게 의존하며, 자동 페일오버가 기본적으로 내장되지 않은 경우 존재
- TigerBeetle의 분산 설계
- 기본적으로 분산되도록 구축되어 클러스터 내 원하는 수의 머신에 바이너리만 설치하면 됨
- 비동기 복제, Zookeeper 등이 불필요하며, MIT의 선구적인 Viewstamped Replication 합의 프로토콜 구현에 투자
- Zig 툴체인을 제외하고 제로 디펜던시를 유지하며, 모든 핵심 의존성에 직접 투자
클럭 장애 허용성
- TigerBeetle은 트랜잭션 데이터베이스로서 물리적 타임스탬프의 정확성이 감사 및 규정 준수를 위해 중요
- Linux에는 여러 클럭이 있음:
CLOCK_MONOTONIC_RAW,CLOCK_MONOTONIC,CLOCK_BOOTTIME - 하드웨어 클럭의 물리적 불완전성으로 클럭이 다른 속도로 작동하여 "drift" 오류 발생, 짧은 시간 내 "skew" 오류로 누적
- 일반적으로 NTP가 이러한 오류를 수정하지만, 부분적 네트워크 장애로 NTP가 조용히 중단되면 고가용성 합의 클러스터가 어둠 속에서 실행될 수 있음
- Linux에는 여러 클럭이 있음:
- 클러스터 타임 구현
- 클러스터 내 대다수 클럭을 결합하여 장애 허용 클럭인 "클러스터 타임" 구성
- 필요시 서버의 시스템 시간을 다시 정렬하거나, 결함 있는 클럭이 너무 많으면 안전하게 종료
- Chrony, PTP, NTP가 작동을 멈춘 경우를 실제로 감지하고 운영자에게 경고
- 서버 간 오프셋 클럭 시간을 추적하고 샘플링한 뒤 Marzullo 알고리듬을 통해 가장 정확한 간격 추정
스토리지 장애 처리
-
기존 데이터베이스의 가정
- 디스크 장애 시 오류 메시지와 함께 예측 가능하게 실패한다고 가정
- SQLite 문서: "SQLite는 손상이나 I/O 오류 감지를 위해 데이터베이스 파일에 중복성을 추가하지 않으며, 읽은 데이터가 이전에 쓴 데이터와 정확히 동일하다고 가정"
-
실제 스토리지 장애 시나리오
- 디스크가 조용히 손상된 데이터 반환, I/O 잘못된 방향 전달(읽기/쓰기 경로), 오류 코드 없이 갑자기 느려지는 gray failure 등 발생 가능
-
TigerBeetle의 스토리지 장애 허용성
- Protocol Aware Recovery 사용으로 모든 복제본에서 데이터 복사본이 손상되지 않는 한 가용성 유지
- 모든 데이터가 불변이며, 체크섬 및 해시 체인으로 손상이나 변조가 없음을 강력히 보장
- 자체 페이지 캐시, O_DIRECT로 디스크에 데이터 쓰기, 원시 블록 디바이스에서 직접 실행(파일시스템 불필요)으로 디스크와 소프트웨어 사이 레이어 최소화
- 기성 LSM 대신 자체 구현한 LSM Forest(약 20개의 LSM 트리) 사용
- 스토리지 장애 허용을 주장할 뿐 아니라 Jepsen에 의해 검증된 유일한 분산 데이터베이스
- 로컬 머신 장애 시 디스크 섹터만 실패해도 스토리지 엔진이 글로벌 합의에 연결되어 클러스터를 통해 자가 치유
Zig 프로그래밍 언어 선택
-
기존 데이터베이스의 언어
- Postgres는 C(1970년대), MySQL은 C와 C++(1979), MSSQL도 C와 C++로 작성
- 프로그래밍 언어는 지난 40년간 크게 발전했으며, 현대적으로 구축한다면 Rust나 Zig 선택 가능
-
TigerBeetle이 Zig를 선택한 이유
- 전체 C 에코시스템 활용 가능, 뛰어난 툴체인과 컴파일러 제공
- 작성이 쉽고 특히 읽기가 쉬우며, 경우에 따라 TypeScript만큼 쉬우면서 훨씬 빠름
- 정적 메모리 할당 가능, TigerBeetle의 핵심 원칙
- 우수한 개발자 경험, 빠른 학습 가능(따라서 TigerBeetle 소스 코드에 빠르게 진입 가능)
- 초기 Rust 팀 멤버인 Matklad(Rust Analyzer 창시자), Brian Anderson(Graydon과 함께 Rust 공동 창시자) 등이 TigerBeetle에서 근무
- Rust에서 동적 메모리 할당을 사용하지 않는 것은 "하드 모드"이지만 Zig에서는 쉬움
Deterministic Simulation Testing과 VOPR
DST의 기본 개념
-
Deterministic Simulation Testing (DST) 는 FoundationDB 팀(현재 Apple 소유)이 대중화한 혁신적 테스트 기법
- 더 안전하고 버그 없는 분산 데이터베이스를 이전보다 짧은 시간에 개발하는 데 활용
- 분산 시스템에는 무한한 동시성 문제 조합 존재: 메시지 손실, 예측 불가능한 스레드 실행 순서 등
- 기존 단위 테스트와 통합 테스트로는 불충분하며, 형식 검증(formal verification)은 비용이 많이 들고 느림
-
DST 작동 원리
- 특정 시간선에서 시스템이 직면할 거의 모든 가능한 시나리오를 결정론적으로 실행하는 시뮬레이터
- OS, 네트워크, 디스크 문제나 다양한 지연 같은 외부 요인도 고려
- 짧은 시간에 수년 분량의 테스트 제공(시간 자체가 결정론적이 되어 while true 루프 가능)
- 데이터베이스(I/O 집약적, 컴퓨팅 비집약적)에 특히 적합
- Jepsen 테스트는 DST가 할 수 있는 것의 부분집합
TigerBeetle의 VOPR
-
VOPR(Viewstamped Operation Replicator) 개요
- 영화 WarGames의 WOPR 시뮬레이터에서 이름을 따온 자체 개발 테스트 클러스터
- 노드가 리더를 선출하는 방식부터 개별 상태 및 네트워크 장애까지 무수히 다른 조건에서 TigerBeetle을 지속적으로 테스트
- 단일 스레드에서 전체 분산 클러스터를 가상으로 시뮬레이션 가능
-
VOPR의 규모
- 지구상에서 가장 큰 DST 클러스터로 1,000개 CPU 코어에서 실행
- Hetzner가 그렇게 많은 코어를 원하는지 확인하는 특별 이메일을 보낼 정도로 비정상적으로 큰 규모
- VOPR-1000은 24x7x365 실행되어 프로덕션 전 가능한 한 희귀한 조건 포착
- 시뮬레이터에서 시간이 결정론적으로 추상화되고 약 700배 가속되어, 하루에 약 2천 년의 시뮬레이션 런타임 축적
DST 게임화
- TigerBeetle은 DST를 게임으로 전환하여 시스템 반응에서 다양한 장애 시나리오를 플레이 가능
- 게임은 sim.tigerbeetle.com에서 플레이 가능
- 브라우저에서 실제 VOPR 인스턴스를 실행하여 TigerBeetle 시뮬레이션
- WebAssembly로 컴파일되었으며, TigerBeetle 엔지니어들이 실제 시스템을 시각화하기 위해 게임 프론트엔드 구축
TigerStyle과 Power of Ten
TigerStyle 방법론
-
TigerStyle은 TigerBeetle의 엔지니어링 방법론으로 GitHub에 공개
- "엔지니어링과 예술, 숫자와 인간 직관, 이성과 경험, 1차 원리와 지식, 정밀함과 시의 교차점에서 진화하는 집단적 주고받기"
- 영화 Tron: Legacy의 "Biodigital Jazz" 개념 채택: 인간과 디지털 요소의 얽힘, "Grid"의 혼돈적이면서도 구조화된 특성, 기술 내에서 인간 잠재력의 즉흥적 정신 표현
- TigerBeetle에서는 과학뿐 아니라 예술도 주입하는 코드 정신
-
TigerStyle의 영향
- NASA의 완벽한 코드 작성 원칙인 Power of Ten에서 파생된 엔지니어링 및 코드 원칙 제시
- 단순성과 우아함 같은 주제부터 명명 방법 같은 응용까지 다룸
- Resonate, Turso 같은 다른 기업에도 영향을 미치기 시작
- Lex Fridman 팟캐스트에서도 논의됨
Assertion 사용
-
Power of Ten의 규칙 5: Assertion
- 코드 동작에 대한 기대를 작성하는 동시에 명시적으로 인코딩하는 개념(사후가 아님)
- 단일 라인으로 불리언으로 작성: assert(a > b)
-
TigerStyle의 assertion 규칙
- 모든 함수 인수, 반환 값, 전제조건, 불변성 assert, 함수당 평균 최소 2개의 assertion
- assertion이 중요하고 놀라운 경우 주석 대신 assertion 사용
- 프로그램이 실행되기 전에 설계 무결성을 확인하도록 컴파일 타임 상수 간 관계 assert
- 발생해야 하는 것뿐만 아니라 기대하지 않는 부정적 공간도 assert(흥미로운 버그가 나타날 수 있는 곳)
성능에 대한 사고
-
코드 작성보다 코드에 대한 추론 및 설계가 더 중요
- 성능을 해결하고 거대한 1000배 승리를 얻는 최적의 시기는 설계 단계이며, 이는 측정이나 프로파일링이 불가능한 정확한 시점
-
TigerStyle의 성능 원칙
- "네 가지 기본 색상"(네트워크, 스토리지, 메모리, CPU)과 "두 가지 질감"(대역폭과 지연)에 대한 기본적인 냅킨 수학 수행
- 제어 평면과 데이터 평면 구분, 액세스 일괄 처리, 핫 루프를 독립 실행형 함수로 추출하여 컴파일러 의존성 감소 등 전술적 팁 제공
직접 체험
- TigerBeetle은 현대 연구를 오래된 형식에 적용하여 전례 없는 성능과 안정성 보장 제공
- 대변/차변 네이티브 모델링, 분산 기본값, 스토리지·시계 결함 허용, DST 기반 품질 보증을 결합한 현대적 OLTP 엔진
- 시스템 및 스토리지 엔지니어링에 대한 예술 형식 개발, 그 과정에서 재미를 잊지 않음
- DST의 영리한 활용 덕분에 단 몇 년 만에 Jepsen 표준으로 구축
- 설치는 단일 바이너리로 간단하며, 공식 사이트의 간단 설치 스크립트로 curl 명령만으로 빠르게 시작해서 체험 가능