SQLite의 강점
- 단순성: DB가 파일로 존재하고 엔진이 앱 프로세스에 임베디드되어 운영 및 배포가 단순합니다.
- 제어: DB 설정이 모놀리스 내 통합되어 버전 관리가 용이하며, Git 브랜치별 독립 DB 구성이 가능합니다.
- 속도: 프로세스 간 오버헤드 없이 쿼리 응답 시간을 밀리초에서 마이크로초 단위로 단축합니다.
Rails 환경에서의 SQLite 과제 및 해결책
Rails 멀티 워커 환경에서 SQLite는 SQLite3::BusyException
및 GVL(Global VM Lock) 문제로 성능 저하를 겪습니다.
* WAL(Write Ahead Logging): Rails 7.1부터 기본 적용, 동시 읽기/쓰기 성능을 향상시킵니다.
* active_record_enhanced_sqlite3_adapter
Gem:
* 트랜잭션 잠금: 트랜잭션 시작 시 쓰기 잠금을 미리 획득하여 동시 쓰기 에러를 방지하고 데이터 일관성을 유지합니다.
* GVL 문제: Ruby sleep
활용 busy_timeout
재구현으로 SQLite C 코드 실행 중 GVL을 해제, 진정한 동시성을 제공합니다.
* Rails 8의 개선: 위 최적화 기능 대부분이 Rails 8에서 기본 제공될 예정입니다.
Solid Gems 및 Lightstream
Rails 핵심 컴포넌트를 SQLite 기반으로 운영하고 안정적인 백업 솔루션을 구축합니다. * Solid Queue, Solid Cache, Solid Cable: 각 컴포넌트를 별도 SQLite DB로 백업하여 병렬 처리와 운영 단순화를 이룹니다. * Solid Errors: 로컬 에러 모니터링 도구로, 에러를 SQLite에 저장하고 대시보드를 통해 관리합니다. * Lightstream: SQLite DB 변경 사항을 S3 호환 스토리지로 스트리밍하여 포인트 인 타임 백업을 제공하며, 백업 검증 기능도 포함합니다.
기타 확장 및 개발 편의성
- SQLite 확장: UUID/ULID, 지리 데이터, 벡터 검색 등 다양한 기능 활용이 가능합니다.
- 데이터베이스 브랜칭: Git 브랜치 이름에 따라 동적으로 DB 파일을 생성, 브랜치별 격리된 개발 환경을 구축합니다.