본문 바로가기

DB

Rust로 다시 태어난 SQLite: Limbo 프로젝트를 소개합니다

728x90
반응형

SQLite는 많은 개발자들에게 사랑받는 내장형 데이터베이스입니다. 하지만 SQLite의 닫힌 개발 모델과 C 언어의 메모리 안정성 문제를 보완하기 위해 Turso 팀은 새로운 도전을 시작했습니다. 오늘은 SQLite를 Rust로 완전히 재구현한 Limbo 프로젝트를 소개합니다.

반응형

SQLite를 왜 다시 구현했을까?

SQLite는 강력하고 널리 사용되지만, 몇 가지 단점이 있었습니다.

  1. 테스트와 유지보수의 어려움: SQLite의 테스트 스위트는 폐쇄적이고, 코드 기반은 메모리 안정성을 보장하지 않는 C로 작성되었습니다.
  2. 새로운 기능 추가의 어려움: SQLite의 구조상 대규모 변경이나 혁신적인 기능을 추가하는 것이 까다로웠습니다.

그래서 처음에는 SQLite를 포크하여 libSQL을 개발했습니다. libSQL은 12,000개 이상의 GitHub 스타와 85명의 기여자를 통해 큰 성공을 거두며, Turso 플랫폼의 핵심 엔진이 되었습니다. 하지만 제한된 범위 내에서만 발전 가능성이 있던 포크에서 벗어나, 아예 처음부터 SQLite를 재구현하는 실험에 착수했습니다.


Limbo: Rust 기반 SQLite 재구현

Limbo는 Rust의 메모리 안전성과 현대적인 소프트웨어 아키텍처를 활용하여 SQLite를 완전히 새롭게 설계한 프로젝트입니다. 이 프로젝트는 SQLite와 100% 호환되면서도 더 높은 안정성과 성능을 제공합니다.

Limbo의 주요 특징

  1. 완전 비동기 I/O 지원
    Limbo는 비동기 I/O를 기본 설계에 통합했습니다. SQLite와 달리, Limbo는 비동기 작업을 위해 추가적인 스레드가 필요하지 않습니다. 특히 네트워크를 통한 SQLite 사용(예: HTTP, 원격 저장소) 환경에서 뛰어난 성능을 발휘합니다.
  2. WASM 친화적 설계
    SQLite는 WASM 환경 지원이 제한적이지만, Limbo는 처음부터 WASM을 염두에 두고 설계되었습니다. 이를 통해 브라우저 환경에서 SQLite를 사용하는 것이 더욱 간편해졌습니다. 아래는 Limbo-WASM을 활용한 코드 예제입니다:
  3. javascript
    코드 복사
    import { drizzle } from 'drizzle-orm/better-sqlite3'; import * as s from 'drizzle-orm/sqlite-core'; import { Database } from 'limbo-wasm'; const sqlite = new Database('sqlite.db'); const db = drizzle({ client: sqlite }); const users = s.sqliteTable("users", { id: s.integer(), name: s.text(), }); const result = db.select().from(users).all(); console.log(result);
  4. SQLite보다 뛰어난 성능
    초기 벤치마크 결과, Limbo는 일부 작업에서 SQLite보다 빠릅니다. 예를 들어, SELECT * FROM users LIMIT 1 쿼리에서 SQLite는 620ns가 소요된 반면, Limbo는 506ns로 20% 더 빠른 성능을 보여주었습니다.
  5. 단순성 유지
    Limbo는 현대적인 환경에서 덜 중요한 기능들을 제거하고, 기본 설정만으로도 우수한 성능을 제공합니다. 예를 들어, SQLite의 복잡한 튜닝 없이도 높은 성능을 발휘합니다.

안정성과 신뢰성을 높이는 방법: DST와 Antithesis

SQLite의 안정성은 전 세계적으로 잘 알려져 있습니다. Limbo는 SQLite 수준 이상의 안정성을 목표로 하며, 이를 위해 **Deterministic Simulation Testing(DST)**을 도입했습니다.

DST는 예외적인 상황을 시뮬레이터에서 재현하고, 발견된 문제를 100% 재현 가능하게 만드는 테스트 기법입니다. 이를 통해 Limbo는 코드 변경 후에도 높은 신뢰성을 유지할 수 있습니다.

추가적으로, Limbo는 Antithesis와 협력하여 하드웨어 및 소프트웨어 오류를 시뮬레이션하며 테스트를 진행하고 있습니다. 예를 들어, io_uring 구현에서 드물게 발생하는 "부분 쓰기(partial writes)" 문제를 발견하고 해결했습니다.


현재 개발 상태와 미래

Limbo는 아직 초기 단계지만, 다음과 같은 중요한 성과를 이뤘습니다:

  • 비동기 I/O 구현 완료
  • WASM 빌드 및 브라우저 지원
  • SQLite와 동등하거나 우수한 성능

Turso 팀은 Limbo를 지속적으로 개선하고, SQLite와 완벽히 호환되면서도 현대적인 데이터베이스로 발전시키는 것을 목표로 하고 있습니다.


728x90

결론: Limbo가 만들어갈 새로운 데이터베이스 시대

Limbo는 SQLite의 단순성과 성능을 계승하면서도, Rust의 메모리 안전성과 현대적 설계를 통해 완전히 새로운 차원의 데이터베이스를 제시합니다.

데이터베이스의 미래에 관심이 있다면, Limbo 프로젝트를 주목해 보세요! GitHub에서 프로젝트를 확인하고 기여할 수도 있습니다: Limbo GitHub.

SQLite의 진화와 혁신이 궁금하다면, Limbo와 함께 미래를 탐구해 보세요! 🚀

https://turso.tech/blog/introducing-limbo-a-complete-rewrite-of-sqlite-in-rust

 

Introducing Limbo: A complete rewrite of SQLite in Rust

we forked SQLite with the libSQL project. What would it be like if we just rewrote it?

turso.tech

728x90
반응형