Ruby on Rails에서 SQLite 활용: 성능 개선, 백업, 고급 활용 사례

SQLite on Rails: To Production and Beyond - Dan Milne

작성자
Ruby Australia
발행일
2025년 06월 06일

핵심 요약

  • 1 Rails 7.1/8부터 SQLite 성능이 크게 향상되어 프로덕션 환경에서 사용을 고려할 수 있으며, 특히 WAL 모드와 트랜잭션 처리 개선이 핵심입니다.
  • 2 Lightstream, SQLite3 Arsync, LiteFS 등 다양한 도구를 통해 SQLite 데이터베이스의 안정적인 백업 및 라이브 복제가 가능합니다.
  • 3 SQLite는 단일 호스트 환경에서 높은 성능을 제공하며, API 대신 내부 데이터 동기화, 분산 엣지 캐시 등 Rails 앱의 보조 시스템 및 성능 최적화에 활용될 수 있습니다.

도입

이 발표는 Ruby on Rails 환경에서 SQLite 데이터베이스의 발전과 다양한 활용 방안을 다룹니다. 과거 프로덕션 사용에 대한 우려가 있었던 SQLite는 최근 Rails 7.1 및 8 버전에서 대대적인 성능 개선이 이루어졌으며, 특히 Basecamp와 같은 대규모 서비스에서도 활용될 정도로 그 잠재력이 재평가되고 있습니다. 발표자는 SQLite의 기본적인 특성부터 최신 기술을 활용한 백업 및 복제 전략, 그리고 Rails 애플리케이션 내에서의 고급 활용 사례까지 폭넓게 제시합니다.

SQLite의 기본 특성 및 Rails에서의 성능 개선

SQLite는 2004년부터 버전 3가 사용되어 온 경량 데이터베이스로, 클라이언트-서버 방식이 아닌 라이브러리 및 파일 기반의 데이터베이스입니다. 수십억 개의 인스턴스에서 사용될 만큼 널리 퍼져 있으며, 단일 호스트 환경에서 강력한 성능을 발휘합니다. 최근 Ruby on Rails 생태계에서는 Steven Mann, Ben Johnson(Fractal Mind), Mike Delisio 등의 노력으로 SQLite의 성능이 비약적으로 향상되었습니다.

  • WAL(Write-Ahead Logging) 모드: Rails 7.1부터 기본으로 활성화되어 쓰기 작업 중에도 무제한 읽기 작업을 허용하여 동시성을 크게 개선했습니다.
  • 트랜잭션 처리 개선:
    • 기존 deferred 트랜잭션은 쓰기 작업이 중간에 락을 시도하여 busy exception을 유발할 수 있었으나, 이제 쓰기 트랜잭션에 immediate 모드를 기본 적용하여 락을 즉시 획득, busy exception 발생 빈도를 줄였습니다.
    • busy handler가 C 구현에서 Ruby 구현으로 변경되면서 GVL(Global VM Lock)을 차단하지 않고 sleep을 사용하도록 개선되어 스레드 블로킹 문제를 해결했습니다.
    • busy handler의 지수 백오프 전략 대신 1밀리초 sleep을 사용하여 오래된 트랜잭션이 busy exception을 받을 확률을 낮췄습니다.
  • 고립된 연결 풀 (Isolated Connection Pools): Fractal Mind의 active_record_enhanced_sqlite_adapter에서 제안된 기능으로, 읽기 및 쓰기 연결 풀을 분리하여 쓰기 작업이 읽기 작업을 차단하지 않도록 합니다 (Rails 8 기본 기능으로 포함되지 않음).

SQLite 백업 및 복제 전략

SQLite는 다양한 백업 및 복제 도구를 제공하여 데이터 안정성을 확보할 수 있습니다.

  • .backup 명령: 데이터베이스의 바이트 단위 복사본을 생성하며, 읽기/쓰기 작업을 차단하지 않습니다.
  • VACUUM INTO file 명령: 데이터베이스를 새 파일로 압축하여 더 효율적인 복사본을 생성하며, 이 또한 작업을 차단하지 않습니다.
  • Lightstream (Fly.io): WAL 시스템에 연동하여 SQLite 데이터베이스 변경 사항(트랜잭션 및 WAL 파일)을 S3 또는 SFTP 서버로 1초 간격으로 동기화합니다. “세대(generation)” 개념을 통해 주기적으로 전체 스냅샷을 찍어 델타 파일의 크기 증가를 관리합니다.
  • SQLite3 Arsync: rsync와 유사하게 데이터베이스의 변경된 페이지만 복사하여 효율적인 증분 백업을 수행합니다. 원본과 복제본 모두 동기화 중에도 사용 가능합니다.
  • LiteFS (Fly.io): FUSE 마운트 포인트를 통해 실시간으로 여러 호스트에 SQLite 데이터베이스를 복제합니다. 쓰기 작업은 FUSE 레이어를 통해 가로채여 복제본으로 전파되며, 복제본은 읽기 전용으로 작동합니다.

Rails 앱에서의 고급 활용 사례

SQLite는 메인 프로덕션 데이터베이스 외에도 Rails 애플리케이션의 성능 최적화 및 보조 시스템 통합에 유용하게 활용될 수 있습니다.

  • API 대체: 외부 데이터를 가져오는 보조 시스템(예: 스크래핑 서비스)의 경우, API 호출 대신 SQLite 데이터베이스를 Rails 앱 내부에 동기화하여 직접 접근함으로써 훨씬 빠른 데이터 처리가 가능합니다. Active Record 모듈을 통해 읽기 전용으로 설정하여 활용할 수 있습니다.
  • 분산 엣지 캐시: LiteFS와 같은 도구를 사용하여 주요 서버의 SQLite 데이터베이스를 여러 웹 서버에 복제하고, 웹 서버는 이 로컬 캐시된 데이터를 활용하여 프론트엔드 서비스의 응답 속도를 향상시킬 수 있습니다.

결론

최근 Ruby on Rails의 SQLite 관련 개선 사항들은 이 경량 데이터베이스를 프로덕션 환경에서도 충분히 고려할 만한 강력한 옵션으로 만들었습니다. 트랜잭션 처리의 최적화와 WAL 모드의 기본화는 동시성 문제를 크게 완화했으며, Lightstream, SQLite3 Arsync, LiteFS와 같은 혁신적인 도구들은 백업 및 복제 전략을 단순화하고 확장성을 높였습니다. 단일 호스트 환경에 적합한 SQLite는 메인 데이터베이스뿐만 아니라 보조 시스템 통합, API 대체, 분산 엣지 캐싱 등 다양한 방식으로 Rails 애플리케이션의 성능과 효율성을 극대화하는 데 기여할 수 있습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!