SNKV- sqlite B-트리 엔진 기반 키-값 스토어
Source: Dev.to
개요
RocksDB, LevelDB 등 다양한 키‑값 저장소가 존재합니다.
SQLite는 SQL 데이터베이스이지만, 저장 엔진으로 활용되는 경우가 많습니다. 이러한 배경에서 SNKV가 만들어졌습니다:
- Repository:
아키텍처
SNKV의 아키텍처는 매우 단순합니다:
kvstore layer → b‑tree layer → pager → OS
하위 레이어들은 이미 검증된 배틀‑테스트를 거쳤으며, 프로덕션 환경에서도 사용할 수 있습니다.
C/C++ 프로젝트에서 SNKV 사용하기
-
단일 헤더 파일을 생성합니다:
make snkv.h또는 0.4.0 릴리스의 ZIP 파일을 다운로드합니다.
-
.c또는.cpp파일에 헤더를 포함하고, 첫 번째 포함 전에 구현 매크로를 정의합니다:#define SNKV_IMPLEMENTATION #include "snkv.h"이렇게 하면 구현이 실행 파일에 컴파일됩니다.
-
API 명세서를 검토하여 자세한 내용을 확인합니다:
Python 지원
Python 개발자는 pip을 통해 SNKV를 설치할 수 있습니다:
pip install snkv
Python API에 대한 문서는 다음을 참고하세요:
데이터 레이아웃
전체 SQL 레이어를 우회합니다. 데이터는 다음 형식으로 저장됩니다:
key_len | key | value
이 레이아웃 덕분에 O(log n) 시간에 키 프리픽스를 기반으로 값을 빠르게 가져올 수 있습니다.
각 테이블은 캐시된 읽기 커서를 유지하여 get, exists 등의 성능을 향상시킵니다.
트랜잭션 모델
- 읽기 트랜잭션은
kvstore_open후 자동으로 시작되어mxFrame을 찾는 데 필요한 시간을 줄입니다. - 쓰기 작업은 다음 순서로 진행됩니다:
- 현재 읽기 트랜잭션을 커밋합니다.
- 쓰기 트랜잭션을 실행하고 커밋합니다.
- 새로운 읽기 트랜잭션을 다시 시작합니다.
예제
- Python 예제:
- 일반 예제 (C/C++):
충돌 안전성 테스트
다음과 같은 충돌 테스트가 구현되었습니다:
- 10 GB WAL‑모드 데이터베이스에 결정적인 키‑값 쌍을 기록합니다.
- 활성 쓰기 중에
SIGKILL을 사용해 작성자를 강제로 종료합니다. - 재시작 후 다음을 검증합니다:
- 커밋된 모든 트랜잭션이 정확한 바이트 값으로 존재합니다.
- 부분 트랜잭션이 보이지 않습니다.
- 데이터베이스에 손상이 전혀 없습니다.
생태계 지원
SNKV는 SQLite와 동일한 저장 엔진을 사용하므로, SQLite 하위 레이어에 의존하는 도구들을 그대로 사용할 수 있습니다. 검증된 도구에는 다음이 포함됩니다:
- LiteFs
- WAL‑기반 백업 도구
- 롤백 저널 도구
기여
문제가 발생하거나 제안이 있으면 이슈를 열어 주세요:
피드백과 의견을 언제든 환영합니다.