世界を動かす技術を、日本語で。

リトストリーム:リニューアル

概要

  • Litestream はSQLiteを使ったアプリケーションの信頼性向上を実現するオープンソースツール。
  • 新設計により 高速なポイントインタイムリストア や多数データベースの複製が可能に進化。
  • LiteFS のアイデアを取り入れ、世代管理やリードレプリカ機能を強化。
  • オブジェクトストレージの 条件付き書き込み を活用し、可用性と整合性を向上。
  • SQLiteの新たな活用方法を提案し、今後の機能拡張にも期待。

Litestreamの進化と新機能

  • Litestream は、SQLiteアプリケーションのデータを S3互換オブジェクトストレージ へ継続的にバックアップし、障害時に迅速なリストアを可能とすることを目的とするツールであることを確認。
  • 従来の n層データベース設計 では、アプリごとに重いデータベースサーバーの運用が必要であった課題を解決することを目指す提案。
  • SQLiteは 組み込み型 であり、サーバー運用が不要な一方で、単一サーバー障害時のデータ消失リスクがあったため、Litestreamによる外部バックアップで信頼性を向上することを実現。
  • Litestreamはアプリケーションの変更不要で WALチェックポイント処理 を乗っ取り、更新をS3にストリーミングする仕組みを採用することを確認。

LiteFSからの知見と新しいアーキテクチャ

  • LiteFS は、Litestreamのアイデアを発展させて、 リードレプリカプライマリフェイルオーバー を可能にする設計を採用。
  • LiteFSでは LTXフォーマット を用い、トランザクション単位でページを記録し、複数のLTXファイルを コンパクション (統合)することで、最新ページのみを効率的にリストアできるようにすることを実現。
  • このアプローチは LSMツリー に類似し、頻繁な書き込みにも高速なリストアを可能とすることを確認。

世代管理とCASAASの導入

  • Litestreamは 世代(generation)管理 によって、プロセス停止や新サーバーでのレプリケーション開始時のデータ不整合を解決することを確認。
  • オブジェクトストレージの 条件付き書き込み (例:S3, Tigris)を利用し、Consulのような外部依存なしで 単一リーダー保証 を実現することを提案。
  • これにより、 エフェメラルノード や重複実行時でも、データの混乱を防止し、シンプルな運用を可能とすることを強調。

軽量リードレプリカとVFSの活用

  • LiteFSは FUSEファイルシステム を通じてトランザクション認識を実現するが、導入が難しい環境向けに LiteVFS(SQLite Virtual Filesystem) を提供することを確認。
  • Litestreamにも同様の VFSベースリードレプリカ層 を導入予定であり、S3互換ストレージから直接ページを取得・キャッシュする機能を開発中であることを提案。
  • このアプローチはローカルSQLiteほど効率的ではないが、 キャッシュとプリフェッチ の工夫で十分なパフォーマンスを目指すことを確認。

大量データベースの複製対応

  • 従来のLitestream設計では WAL変更ポーリング や遅いリストアのため、多数データベースの複製が困難であったことを指摘。
  • LTX形式 への移行により、/data/*.dbのような多数データベースの同時複製が現実的となったことを強調。

SQLiteへの期待と今後の展望

  • SQLite は堅牢なデータベースとして進化を続けており、新たなユースケースへの対応力が高いことを評価。
  • AIエージェント (例:Phoenix.new)によるライブデータ操作やロールバック機能の基盤として、Litestreamの新設計が役立つと期待。
  • 新しいLitestream設計により、PITR(ポイントインタイムリカバリ)やフォーク、ロールバック機能の提供が可能となることを提案。
  • Litestreamは 完全オープンソース であり、Fly.ioへの依存なく、誰でも利用可能であることを確認。

参考リンク

Hackerたちの意見

コードはここにあるみたいだね: https://github.com/benbjohnson/litestream/tree/v0.5 これを見るのはすごく嬉しい!2年前にlitestreamとlitefsを使おうとしてちょっとイライラしてた時にこのコメントを書いたんだ: https://news.ycombinator.com/item?id=37614193 これでほとんどの問題が解決するのかな?今はDBでlitestreamを自由に動かせるし、複数のライターの問題を心配しなくていいんだよね?ハンドオフがどう処理されるのか気になるな。リードレプリカのFUSEレイヤーは本当にいい感じだね。編集: ああ、こういう風に動くみたいだ: https://github.com/benbjohnson/litestream/pull/617 > 別のLitestreamプロセスが起動して既存のリースを見つけると、成功するまで毎秒リース取得を再試行し続けるんだ。この低い再試行間隔のおかげで、ローリング再起動がすぐにオンラインになるんだね。実用的そう!

なんて偶然、今日ちょうどLitestreamについて調べてたところだよ!VPSでSqliteを使ってて、これを追加しようと思ってたんだ。litestreamプロセスが動いている間の任意の時点にデータベースを復元できるって理解してるけど、合ってる?自動チェックポイントが動いてない間にWALを消費する可能性があるから?極端な例を挙げると、2:00から3:00の間にプロセスが1時間クラッシュした場合、1:55や3:05には復元できるけど、2:00から3:00の間に復元するための情報は失われるってこと?

LitestreamはWALセグメントを指定した時間の粒度で保存するんだ。デフォルトでは、毎秒WALの変更を送信するから、保持期間内の任意の秒に復元できるはずだよ。

この投稿はまるで私の考えを読んで、私が新しいLitestreamに求めていたことを全部実装してくれたみたい。すごくワクワクする!

これ、めっちゃいいね!数年前にDynamoDBをバックストアに使うためのsqlite vfsを作ったんだ[0]、DonutDBっていう名前で。最近S3にCASが追加されたから、S3をバックにした新しいDonutDBを作ろうと思ってたんだ。lightstreamがこれをサポートしてくれて本当に嬉しい!早く試してみたいな。[0]: https://github.com/psanford/donutdb

最近S3にCASが追加されたけど、これについての参考文献ある?CASってコンテンツアドレスストレージのことだよね?ググったけど、AWSのドキュメントは見つからなかったよ。

FlyがSQLiteの上に開発者体験をもっと磨いてくれたらいいな。もう少しで完成しそうだけど、足りない点があるんだ: 1. ボリュームからSQLiteを管理するための組み込みUIとCLIが必要。Fly Machineに初期データベースを載せるのがもっと簡単であるべきだよ。2. fly consoleはSQLiteと連携しないから、SQLiteデータがある同じボリュームに接続されていない別のマシンを立ち上げることになる。だから、fly ssh console —ptyを実行する必要があるんだ。これでデータベースのあるマシンにSSH接続することになる。一般的にSQLiteのウェブアプリの問題は、小さなアプリが多いから、ホスティングするのにそこそこお金を稼ぐにはたくさん必要になるんだよね。

ブラッド、SQLiteを使ったRails 8についてどう思う?最近はPostgresよりこっちに惹かれてる?

litestreamを使って多くのデータベースをレプリケートしたい場合(理想的にはユーザーごとに1つ以上)、ここで説明されているユースケースの1つなんだけど、litestreamに新しいデータベースを動的に追加するように指示するにはどうすればいいの?設定ファイルは静的だし、ランタイムで新しいDBを追跡するためのAPIを見つけられなかったんだ。

この問題は解決されると思ってるよ。新しいSQLiteを検出するのは難しいけど、不可能ではないからね。その間、ライブラリとして使うのはかなり簡単だよ。

ben、litestreamをありがとう!私たちは内部の書き込みが多いユースケース(約12GB圧縮)で、もう1年以上本番環境で使ってるよ;月に数百セントのコストで(azure)。新しい変更が適用されるのが楽しみだ!

つまり、Fossil(SQLiteの上に構築されてるやつ)+ これ = SCMってこと?

すごい!これでSQLiteの*.dbファイルを1つのLitestreamプロセスから全ディレクトリ複製できるっていう、俺の1番の機能リクエストが解決されたよ。やっとここに来たね。マルチテナントのユーザーごとのSQLiteデータベースの複製がもっと魅力的になるはず。

新しいLitestreamは、条件付き書き込みを提供していないオブジェクトストアでも動くの?