OLTP 코어 구축: API 계약, 페이지 크기, 적응형 튜닝
새로운 OLTP 데이터베이스를 개발하며 Rust의 트레이트 인터페이스를 활용해 격리된 계층 구조를 엄격히 구현했습니다. 각 계층은 명확한 API 계약을 가지며, 테이블스페이스별로 페이지 크기를 설정할 수 있고, 리소스 브로커가 수동 튜닝 없이 설정을 관리합니다. 진단 기능은 USDT와 eBPF를 통해 통합됩니다.
페이지 크기와 테이블스페이스 설정
데이터 페이지 크기는 순수 OLTP의 경우 4~8KB, NVMe 기반 HTAP의 경우 16~32KB 범위입니다. 각 테이블스페이스는 생성 후 고정 페이지 크기를 가진 별도의 파일입니다. 기본값은 16KB입니다. PageId는 복합 구조로 [tablespace_id:16][page_index:48]입니다. BufferPool은 크기별로 요청을 서브 캐시에 라우팅합니다.
파일 시작 부분의 슈퍼블록은 페이지 크기와 독립적으로 테이블스페이스 메타데이터를 저장합니다. 마운트 시 설정을 확인하며, 불일치 시 저하 없이 시작을 차단합니다.
아키텍처 계층과 API 계약
코어는 네 개의 계층으로 나뉩니다:
- 어댑터 계층 (async tokio): TLS 종료, 와이어 프로토콜 파싱.
#[async_trait]
pub trait NetworkAdapter {
async fn handle_connection(&self, stream: Box<dyn ConnectionStream>) -> Result<(), NetworkError>;
}
- CompatLayer: SQL을 AST로 파싱, pg_catalog 에뮬레이션, LogicalPlan으로 변환, 지원되지 않는 기능 거부 (오류 0A000).
pub trait CompatLayer {
fn translate_query(&self, ast: SqlAst) -> Result<LogicalPlan, CompatError>;
}
- Core Engine (sync): 옵티마이저, 실행기, 트랜잭션 매니저. spawn_blocking 풀에서 실행.
pub trait ExecutionEngine {
fn execute_plan(&self, plan: LogicalPlan, session: &Session) -> Result<ResultSet, ExecutionError>;
}
- StorageManager: PageProvider와 TransactionLogSink 위의 파사드. 코어가 페이지와 UNDO 레코드를 요청.
pub trait StorageManager {
fn pin_page(&self, page_id: PageId, mode: LockMode) -> Result<PageGuard, StorageError>;
fn append_undo(&self, txn_id: TxnId, record: UndoRecord) -> Result<UndoPtr, StorageError>;
}
계층 경계는 세부 사항 유출을 방지합니다: 락 메트릭은 비동기 대기를 제외합니다.
적응형 튜닝과 리소스 브로커
약 60개의 파라미터를 예산, 가드레일, 오버라이드로 분리합니다. 운영자는 고수준 제한을 설정:
[resources]
memory_budget = "16GB"
cpu_budget = "auto"
io_iops = 5000
어드바이저(MemoryAdvisor, IoAdvisor, CpuAdvisor)가 매초 리소스를 재분배:
- CpuAdvisor: DOP와 스레드 풀 vs 스로틀링.
- MemoryAdvisor: 부하 시 BufferPool vs work_mem.
- IoAdvisor: 트랜잭션 우선순위, 클라우드 버스트 인식.
보호 장치
- 히스테리시스: 5초 창, 5% 단위로 진동 방지.
- 하드 플로어: BufferPool/UNDO 최소 128MB.
- 우아한 전환: 새 할당에 새 제한 적용.
- 전문가 오버라이드가 자동 튜닝 우선.
백그라운드 UNDO 로그 정리로 VACUUM 대체. 재시작 없이 런타임 변경.
진단: USDT 프로브와 eBPF
진단 메커니즘은 바이너리에 내장. 런타임 분석을 위한 USDT 프로브, 오버헤드 없는 추적을 위한 eBPF.
주요 요점:
- 테이블스페이스별 페이지 크기와 시작 확인.
- 계층 간 엄격한 트레이트 계약으로 유출 방지.
- 리소스 브로커: 예산 → 가드레일이 포함된 자동 튜닝.
- 코어 내 eBPF/USDT 진단.
- 수동 튜닝 대신 적응형 메커니즘 채택.
— Editorial Team
아직 댓글이 없습니다.