🦁

LiteFS及びFly.io最新情報

2023/08/06に公開

LiteFS+SQLiteでフルスタックNext.jsアプリケーションを作るから1年弱経過して、現在も1.0未満ですがいくつかの重要なアップデートがあったので共有します。

https://fly.io/docs/litefs/

LiteFS Cloudの提供

2022年時点ではデプロイのタイミングなどでデータベースが吹き飛ばないようVolumeをアタッチして開発者が管理する必要がありましたが、Fly.ioによってLiteFS Cloudが提供されるようになり、バックアップ/リストアが自動化されました。

https://fly.io/docs/litefs/cloud-backups/

環境変数にLITEFS_CLOUD_TOKENをセットするだけで、LiteFSはFly.ioの外でセルフホストしつつバックアップにLiteFS Cloudを使うということも可能なようです。

内蔵HTTPプロキシ

LiteFSは単一のプライマリノードのファイルシステムですべての更新操作を行うので、通常は複数ノードで動作する分散構成の場合はロードバランサやアプリケーションのレイヤーでプライマリノードで実行されるように更新系のリクエストをルーティングする必要があります。

以下の例ではnginxの設定でHTTPメソッドでノードを切り替えています。

https://github.com/superfly/litefs-example/blob/cb7d80c09b62a578662c9254b4cf9129533c6c8b/docker-config/nginx/nginx.conf

また、書き込み→読み込みを連続して行う場合は、書き込みが完了→レプリケーションするまで読み込みを待つ必要がありますよね。

Fly.ioにデプロイして内蔵HTTPプロキシを有効にするとこのルーティングをFly.ioのインフラとcookieを使って適切に処理してくれます。

https://fly.io/docs/litefs/proxy/

この問題はRemix作者の@kentcdoddsのブログI Migrated from a Postgres Cluster to Distributed SQLite with LiteFSからはじまり最終的に標準機能になりました。

https://github.com/superfly/litefs/pull/271

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アダプターが必要です。

https://developers.cloudflare.com/d1/platform/community-projects/

LiteFSはアプリケーションから見るとローカルファイルシステムなので、DBドライバーに専用のアダプターが不要です。このため、従来のアプリケーションのコードのデータベースをSQLiteに変更するだけで、LiteFSを利用できます。

逆にD1はOSやコンテナのレイヤーが露呈していないため、フロントエンドエンジニアの馴染みのツールチェインで完結するのが利点とも言えそうですね。

トランザクションモデルの違い

D1は専用のbatch() APIを使うため、単一ノードでのファイルシステムAPIを利用したLiteFSのトランザクションモデルと異なります。

https://developers.cloudflare.com/d1/platform/client-api/#batch-statements

https://fly.io/docs/litefs/how-it-works/#capturing-sqlite-transactions

アプリケーションから見るとD1が動作環境の内部で実行されていて、LiteFSが管理ノード上で実行されるという抽象度の違いもあります。

Discussion