LiteVFS入門

2024/01/23に公開

LiteVFSはSQLiteのVFS拡張機能を使ってバックエンドをLiteFS Cloudにする実験的なソースコード

LiteFSだけではカバーできない環境に対応するために検証しているらしい

https://github.com/superfly/litevfs

Fuseを使ったLiteFSのVFS版

LiteVFSはRustで書かれているので、システムに応じた拡張バイナリをビルドする

git clone https://github.com/superfly/litevfs.git
cd litevfs
cargo build --release

当方macOSなのでtarget/release/liblitevfs.dylibがバイナリになる

LiteFSのトークンが必要なので https://fly.io/dashboard/ > LiteFS Cloud から作って環境変数に入れる

export LITEFS_CLOUD_TOKEN=XXX

クラスタ内にexample.sqliteというDBを追加した

Node.jsとbetter-sqlite3で読み書きしてみる

import sqlite from "better-sqlite3";

const extDb = new sqlite(":memory:");
extDb.loadExtension(
  "target/release/liblitevfs.dylib",
  "sqlite3_litevfs_init_default_vfs"
);
extDb.close();

最初に先程ビルドした拡張の読み込みが必要になる。このインスタンスは使い回せないのですぐ閉じる

以下のようなtableを定義してダッシュボードからimportしてスキーマを更新した

/**
CREATE TABLE example (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    data TEXT
)
 */
const db = new sqlite("example.sqlite");

console.log("read test:");
const result = db
  .prepare("select * from example order by id desc limit 1")
  .all();
console.log(result);

console.log("write test:");

db.pragma("litevfs_acquire_lease");

const randomString = Math.random().toString(36).substring(7);
const ret = db
  .prepare("INSERT INTO example (data) VALUES (?)")
  .run(randomString);
console.log(ret);

db.pragma("litevfs_release_lease");

実行する度にデータが増えていることが分かる

node main.mjs
read test:
[ { id: 14, data: 'njq0h' } ]
write test:
{ changes: 1, lastInsertRowid: 15 }

db.pragma("litevfs_acquire_lease")db.pragma("litevfs_release_lease")を書込みの前後に実行しないと動作しない

実体はクラウドにHTTPでアクセスしにいっているのでrm example.sqliteしてもデータは読み書きできる

以上を理解すると内部のソースコードを読める

LiteVFSはWasmでビルドしてブラウザ上で動かすことも想定している

ブラウザ上で動かすということはEdgeランタイム向けにもなっている

素朴に実行する全操作がHTTP越しになるので遅い。中の人によるとキャッシュ機構があるらしい

Discussion