
2026/03/27 3:58
**Show HN:** *Turbolite – S3 からの冷却 JOIN クエリを 250 ms 未満で応答する SQLite VFS*
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約:
Turbolite は、Amazon S3(および他のオブジェクトストア)を高速で SQLite 互換の仮想ファイルシステムに変える Rust ベースのツールです。データを圧縮された 16 MB の「ページグループ」として保存し、シーク可能な範囲 GET リクエストを使用することで、Turbolite はサブ 250 ms のコールドレイテンシでポイント検索とジョインを実行できます。これは、Tigris などの競合ソリューションよりも約 2 倍速いです。プランベースのフロントランニングとリアクティブなインライン/バックグラウンドフェッチングによる適応的プリフェッチは往復時間をさらに短縮し、ページごとの暗号化により読み取り速度を落とさずにデータを安全に保護します。ライブラリは Rust クレート、SQLite ロード可能拡張、および Python、Node.js、Go 用の言語バインディングとして利用でき、S3、Tigris、R2、MinIO の複数バックエンドとテスト用ローカル専用モードをサポートしています。
将来的な計画には、マニフェスト内の trie を使用してクロステーブルアクセスパターンを予測するプリディクティブプリフェッチエンジンや、WAL(書き込み前ログ)、マルチライタサポート、およびより広範な SQLite 機能カバレッジの追加が含まれます。これらはチェックポイントを介して耐久性を維持しながら実装されます。オブジェクトストレージ上でほぼネイティブな SQLite パフォーマンスを可能にすることで、Turbolite はスタートアップや分析チームがインフラコストを削減し、専用サーバーを避け、データ中心のアプリケーションのデプロイを簡素化できるよう支援します。
要約スケルトン
本文の主旨(メインメッセージ)
Turbolite は Rust ベースの SQLite 仮想ファイルシステムで、圧縮・オプションで暗号化されたページグループと適応的プリフェッチを通じて、S3 上でサブ 250 ms のコールドレイテンシでポイント検索やジョインを直接実行できるほか、ほぼ全ての SQLite 機能をサポートします。
根拠 / 推論(なぜそう言われているか)
- zstd 圧縮された 16 MB オブジェクトをページタイプ別にグループ化し、約 256 KB のチャンクでシーク可能な範囲 GET を実現しています。
- プランベースのフロントランニングとリアクティブなインライン/バックグラウンドフェッチングという二層構造のプリフェッチにより往復時間を削減します。
- ベンチマークでは、S3 Express One Zone 上で 77–259 ms の検索が可能で、Tigris 上では 118–384 ms、プリフェッチ時のフルスキャンは約 600 ms と報告されています。
関連ケース / 背景(文脈・過去事例・周辺情報)
- Turbolite は AWS S3、Tigris、R2、MinIO の複数バックエンドをサポートし、ローカル専用モードで実行できます。
- Rust ライブラリ、SQLite ロード可能拡張、および Python・Node.js・Go 用の言語パッケージとして提供されています。
- 他の SQLite‑over‑network ソリューションとは異なり、圧縮グループ上でシーク可能な範囲 GET を組み合わせ、ページごとの暗号化と最小限の書き込みコスト(1 つの PUT per group)を実現しています。
将来起こること(テキストに記載された将来開発・予測)
- 実験的なプリディクティブプリフェッチエンジンは、マニフェスト内の trie を使用してクロステーブルパターンを事前取得します。
- 今後のリリースでは WAL シッピング、マルチライタサポート、およびより広範な機能カバレッジを追加しつつ、チェックポイントで耐久性を維持することが目標です。
影響(ユーザー/企業/業界へのインパクト)
- ユーザーは専用サーバーをプロビジョニングせずにオブジェクトストレージ上で低レイテンシの SQLite クエリを実行でき、データ中心のスタートアップや分析ワークロードに恩恵があります。
- 企業は S3 Express One Zone や類似バックエンドを活用しつつインフラコストを削減し、テスト時にはローカル専用モードで簡単に検証できます。
- このアプローチは、圧縮・暗号化されたページグループと適応的プリフェッチを組み合わせてオブジェクトストレージ上でほぼネイティブな SQLite パフォーマンスを提供できることを示すことで、データベース‑as‑a‑サービス市場全体に影響を与える可能性があります。
本文
turbolite – S3 から直接ポイント検索と結合を実行できる、Rust ベースの SQLite VFS。サブ 250 ms のコールドレイテンシを実現します。
- ページ単位圧縮(zstd)&暗号化(AES‑256)で効率とセキュリティを両立。S3 から独立して利用可能です。
- 実験的プロダクトで、バグが存在しデータ破損の恐れがあります。慎重にご使用ください。
なぜ turbolite?
| 機能 | 利点 |
|---|---|
| S3 Express One Zone | 1 桁 ms の GET |
| Tigris | 極めて高速 |
| Turbolite はローカルディスクとクラウドストレージのギャップを縮小する |
turbopuffer に触発された設計で、クラウド制約に最適化。初期目標は Neon's >500 ms コールドスタートを上回ること → 成功しました。
使い道
- サーバーごとにデータベースを持つ → ボリュームを利用。
- 数百〜数千のデータベース(テナント、ワークスペース、デバイス)を単一ボリュームで管理。書き込み元は 1 つでも可。
配布
| フォーマット | 内容 |
|---|---|
| Rust ライブラリ | 直接インポート |
| SQLite 可搬拡張 (.so / .dylib) | で読み込み |
| Python / Node.js パッケージ | NPM / PyPI から取得 |
| Go バインディング | GitHub の依存関係経由 |
AWS S3、Tigris、R2、MinIO 等、S3 対応ストレージならどれでも動作。標準 SQLite VFS を採用しているため、FTS、R‑tree、JSON、WAL モード、VACUUM、autovacuum などほぼ全機能が使用可能です。
クイックスタート
Python
import turbolite # S3 対応ストレージ(Tigris)からのコールドクエリ conn = turbolite.connect( "my.db", mode="s3", bucket="my-bucket", endpoint="https://t3.storage.dev" ) conn.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)") conn.execute("INSERT INTO users VALUES (1, 'alice', 'alice@example.com')") conn.commit() alice = conn.cursor().execute("SELECT * FROM users").fetchone() print(alice[1]) # → "alice"
Node.js
const { Database } = require('turbolite'); const db = new Database('my.db'); db.exec(`CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)`); db.exec(`INSERT INTO users VALUES (1, 'alice')`); console.log(db.query("SELECT * FROM users")); // [{ id: 1, name: 'alice' }] db.close();
Rust
use turbolite::{register, CompressedVfs}; let vfs = CompressedVfs::new("/path/to/data", 3); // zstd レベル 3 register("turbolite", vfs)?; let conn = rusqlite::Connection::open_with_flags_and_vfs( "mydb.db", rusqlite::OpenFlags::SQLITE_OPEN_READ_WRITE | rusqlite::OpenFlags::SQLITE_OPEN_CREATE, "turbolite", )?;
アーキテクチャ
- ページグループ – 同一タイプ(インターナル、インデックスリーフ、データリーフ)のページを S3 オブジェクトにまとめる(約 256 ページ ≈ 16 MB / 64 KB ページ)。
- マニフェスト – 明示的ポインタで SQLite の暗黙の
を置き換える。古いページグループは上書きせず、マニフェストアップロードはアトミック。page * size - 圧縮 – zstd フレーム(約 4 ページ単位)。範囲 GET により必要なサブチャンク(≈256 KB)だけを取得。
- プリフェッチ
- クエリプラン前処理 –
を傍受し、最初の読み込み前に必要ページグループ全てを事前取得。EXPLAIN QUERY PLAN - リアクティブスケジュール – B‑tree のミッスクウンタから導出される 2 種類(SEARCH & LOOKUP)。
- クエリプラン前処理 –
パフォーマンス
| クエリ | コールド (S3 Express) | コールド (Tigris) |
|---|---|---|
| Post + user lookup + join | 77 ms | 259 ms |
| Profile (5 JOINs) | 188 ms | 681 ms |
| Who‑liked (index search + join) | 118 ms | 384 ms |
| Mutual friends (multi‑search join) | 77 ms | 201 ms |
| Indexed filter (covered index scan) | 75 ms | 159 ms |
| Full scan + filter | 591 ms | 921 ms |
- ベンチマークは EC2 c5.2xlarge + S3 Express One Zone(GET 約 4 ms)で実施。
- プリフェッチスレッド数:8(デフォルト
)。num_cpus + 1 - キャッシュ階層:なし・インターナル・インデックス・データ。
チューニング
| パラメータ | デフォルト |
|---|---|
| |
| 256 |
| BTreeAware |
| false |
| Durable |
プリフェッチスケジュール
- SCAN (frontrun) – バルクで全グループを事前取得。
- SEARCH (reactive) –
。[0.3, 0.3, 0.4] - LOOKUP (reactive) –
。[0.0, 0.1, 0.2]
接続ごとに
SELECT turbolite_config_set(...) で変更可能です。
耐久性
| ステージ | S3 にデータはあるか |
|---|---|
| チェックポイント後 | はい(ページグループ+マニフェスト) |
| チェックポイント間 | ローカル WAL のみ |
チェックポイント頻度:SQLite 自動チェックポイント(1000 フレームごと)。
2 つの同期モード:
- Durable – チェックポイント時にアップロードし、排他ロック。
- LocalThenFlush – ローカルキャッシュへ書き込み、後で呼び出し側が S3 にフラッシュ。
暗号化 & 圧縮
- 圧縮 – ページグループに zstd(シーク可能マルチフレーム)。カスタム辞書もサポート。
- 暗号化 – S3 では AES‑256‑GCM、ローカルデータは AES‑256‑CTR。キー回転は
で実施。rotate_encryption_key
制限事項
- 単一ライターのみ。複数ライターはマニフェストを破壊する恐れあり。
- WAL の送信は未対応(計画中)。
- SQLite の全機能が完全にサポートされるわけではありません。
インストール
| 言語 | コマンド |
|---|---|
| Python | |
| Node.js | |
| Rust | Cargo.toml に を追加(S3 用には ) |
| Go | で共有ライブラリをビルドし、cgo でリンク |
可搬拡張のロード例:
# リポジトリクローン後 make ext # turbolite.{so,dylib} を生成 sqlite3_enable_load_extension(db, 1); sqlite3_load_extension(db, "path/to/turbolite", NULL, NULL);
関連プロジェクト
- Litestream – WAL の S3 送信(バックアップ)。
- sqlite_web_vfs + sqlite_zstd_vfs – 圧縮範囲リクエスト。
- mvsqlite – FoundationDB KV ストアでページを管理。
- Verneuil – DB を 64 KB チャンクに分割し、マニフェストを使用。
turbolite はシーク可能圧縮ページグループ、マニフェスト駆動ポインタ、適応型プリフェッチ、オプション暗号化を組み合わせた、標準 SQLite VFS 内で完結する点が特徴です。
ベンチマーク
バンドルされた実行ファイルを使用:
# 基本ベンチ(100k 投稿) TIERED_TEST_BUCKET=my-bucket AWS_ENDPOINT_URL=https://t3.storage.dev \ cargo run --features zstd,tiered --bin tiered-bench --release -- --sizes 100000 # スケジュールを調整 cargo run --features zstd,tiered --bin tiered-tune --release \ --prefix "databases/my-db" \ --query "SELECT * FROM users WHERE id = ?1"
全テストは
benchmark/ ディレクトリにあります。
セキュリティモデル
- S3 データ:AES‑256‑GCM、フレームごとに一意のランダム nonce(認証付き)。
- ローカルキャッシュ:AES‑256‑CTR、ページ番号/オフセットを使った決定的 nonce。
ライセンスは Apache‑2.0 です。