홈으로 돌아가기

Rust에서 OLTP DB 설계: 원칙

이 글은 Rust에서 기초부터 OLTP 데이터베이스 설계 원칙을 설명합니다: 기본적으로 제한적, traits를 통한 계약 우선, 하이브리드 비동기. 통합 스토리지, MVCC, WAL 구현. 프로덕션에서의 예측 가능성과 안정성에 초점.

기초부터 OLTP DB: 아키텍처와 Rust 구현
Advertisement 728x90

OLTP 데이터베이스 아키텍처: Rust로 구현하는 원칙부터 실전까지

핵심 OLTP 엔진 하위 시스템이 구현되었습니다: 데이터베이스당 단일 파일 통합 저장소, UNDO-log MVCC 기반 디스크 저장소, WAL 및 ARIES 기반 복구, 공유 버퍼풀, 인메모리 엔진, PostgreSQL과 호환되는 pgwire 프로토콜. 코드는 작동하지만 부하 테스트와 엣지 케이스 안정화가 필요합니다. 이는 최종 제품이 아닌 확립된 계약을 가진 초기 단계입니다.

핵심 설계 원칙

이 프로젝트는 의사 결정을 위한 엄격한 규칙에 의존합니다. 모든 새로운 결정은 이 규칙을 준수하거나 이탈을 정당화해야 합니다.

기본적으로 제한적

구성 요소는 스로틀링 대신 실패 시 폐쇄 동작을 하는 명시적 제한을 가집니다. 이는 부하 하에서 예측 가능성을 보장합니다.

Google AdInline article slot

| 구성 요소 | 제한 | 위반 시 조치 | SQLSTATE |

|-----------|---------|------------------------|----------|

| BufferPool | buffer_pool_size_mb | 제거(CLOCK), WAL 우선 플러시 | — |

Google AdInline article slot

| TxnWriteSet | txn_max_write_set_mb | DML 거부 | 54023 |

| UndoStore | undo_max_size_mb | 쓰기 거부 | 53100 |

| Connection pool | max_connections | 새 연결 거부 | 53300 |

Google AdInline article slot

| Statement timeout | statement_timeout_ms | 쿼리 취소 | 57014 |

| Snapshot age | max_snapshot_age | 오래된 스냅샷 강제 종료 | 40001 |

실패 시 폐쇄는 애플리케이션 재시도나 서킷 브레이커 로직을 위한 명확한 SQLSTATE 코드를 제공합니다.

계약 우선 접근법

아키텍처 계약은 Rust 트레이트(TableEngine, PageProvider, TransactionLogSink, StorageIo)에 정의됩니다. 이는 컴파일 타임에 불변성을 강제하여 구현 이탈을 방지합니다.

왜 Rust인가?

Rust는 예측 가능한 지연 시간, 메모리 할당 제어, 타입 안전성을 위해 선택되었습니다. 비동기/동기 경계에서 Send/Sync, 런타임 문제 대신 명시적 오류. C++는 추가적인 규율이 필요하며, Go는 OLTP 테일 레이턴시를 위한 GC로 인해 적합하지 않습니다.

책임 분리

데이터베이스는 비즈니스 로직 없이 데이터 엔진으로 기능합니다: 초기에는 트리거, PL/pgSQL, 저장 프로시저가 없습니다. 사용자 정의 함수는 샌드박싱과 부작용 없이 나중에 추가될 수 있습니다.

하이브리드 비동기성

  • 네트워크/pgwire 계층: 비동기(수락, TLS, 전송).
  • 코어(쿼리 실행, 저장소, WAL, MVCC): 정확성과 디버깅을 위한 동기.
  • 경계는 브리지를 통한 단방향입니다.

StorageIo는 트랜잭션 로직을 재작성하지 않고 미래의 비동기 I/O를 허용하도록 추상화되었습니다.

| 계층 | 런타임 | 예시 |

|------|---------|---------|

| 네트워크/프로토콜 | 비동기 | pgwire, TLS |

| 쿼리 실행 | 동기 | 계획, 실행 |

| 저장소/WAL | 동기(나중에 비동기 I/O) | HeapStore, BufferPool |

| MVCC/트랜잭션 | 동기 | 스냅샷, 잠금 |

PostgreSQL 호환성

Pgwire는 클라이언트 마이그레이션 없이 드라이버 및 ORM과의 통합을 가능하게 합니다. 호환성은 PostgreSQL 내부(MVCC 힙, VACUUM)를 복사하지 않고 경계 계층을 통한 와이어 레벨에서 이루어집니다. 코어는 아키텍처 자유를 유지합니다.

플랫폼 제약과 신뢰성

크로스 플랫폼 타협 없이 io_uring과 eBPF에 집중하기 위해 Linux 전용입니다. 우선순위: 데이터 손상 없음, 최적화의 안전한 롤백, 사용자 입력에 대한 복원력, 내장 보안.

핵심 요약

  • 부하 하 예측 가능성을 위한 실패 시 폐쇄와 기본적 제한.
  • 불변성 제어를 위한 Rust 트레이트 기반 계약 우선.
  • 하이브리드 비동기/동기: I/O 가속 전 코어 안정성.
  • PostgreSQL 내부 복사 없이 pgwire 호환성.
  • 순수성과 테스트 가능성을 위한 비즈니스 로직 없는 데이터 엔진.

— Editorial Team

Advertisement 728x90

다음 읽기