LiteFS及びFly.io最新情報
LiteFS+SQLiteでフルスタックNext.jsアプリケーションを作るから1年弱経過して、現在も1.0未満ですがいくつかの重要なアップデートがあったので共有します。
LiteFS Cloudの提供
2022年時点ではデプロイのタイミングなどでデータベースが吹き飛ばないようVolumeをアタッチして開発者が管理する必要がありましたが、Fly.ioによってLiteFS Cloudが提供されるようになり、バックアップ/リストアが自動化されました。
環境変数にLITEFS_CLOUD_TOKENをセットするだけで、LiteFSはFly.ioの外でセルフホストしつつバックアップにLiteFS Cloudを使うということも可能なようです。
内蔵HTTPプロキシ
LiteFSは単一のプライマリノードのファイルシステムですべての更新操作を行うので、通常は複数ノードで動作する分散構成の場合はロードバランサやアプリケーションのレイヤーでプライマリノードで実行されるように更新系のリクエストをルーティングする必要があります。
以下の例ではnginxの設定でHTTPメソッドでノードを切り替えています。
また、書き込み→読み込みを連続して行う場合は、書き込みが完了→レプリケーションするまで読み込みを待つ必要がありますよね。
Fly.ioにデプロイして内蔵HTTPプロキシを有効にするとこのルーティングをFly.ioのインフラとcookieを使って適切に処理してくれます。
この問題はRemix作者の@kentcdoddsのブログI Migrated from a Postgres Cluster to Distributed SQLite with LiteFSからはじまり最終的に標準機能になりました。
Cloudflare D1との比較
フロントエンドコミュニティではCloudflare Workers上で開発されたアプリケーション向けのデータベースとしてCloudflare D1が人気です。
Cloudflare D1はLiteFS Cloudと同じく地理的分散型+SQLite互換の特性を持ちますが、Cloudflare D1はCloudflare Workersの環境で動作するため、LiteFSと比較していくつかの違いがあります。
DBドライバーに専用アダプターが不要
D1はCloudflare Workers上で動作するため、DBドライバーに専用のAPIを使う必要があります。
またORMを使っている場合は、ORMのD1アダプターが必要です。
LiteFSはアプリケーションから見るとローカルファイルシステムなので、DBドライバーに専用のアダプターが不要です。このため、従来のアプリケーションのコードのデータベースをSQLiteに変更するだけで、LiteFSを利用できます。
逆にD1はOSやコンテナのレイヤーが露呈していないため、フロントエンドエンジニアの馴染みのツールチェインで完結するのが利点とも言えそうですね。
トランザクションモデルの違い
D1は専用のbatch() APIを使うため、単一ノードでのファイルシステムAPIを利用したLiteFSのトランザクションモデルと異なります。
アプリケーションから見るとD1が動作環境の内部で実行されていて、LiteFSが管理ノード上で実行されるという抽象度の違いもあります。
Discussion