2.3K Views
April 12, 24
スライド概要
SQLiteをレプリケーションするlitestreamの仕組み
LIFULL HOME'Sを運営する株式会社LIFULLのアカウントです。 LIFULLが主催するエンジニア向けイベント「Ltech」等で公開されたスライド等をこちらで共有しております。
[SQLite] litestreamの仕組み プラットフォームG 宮崎泰輔
1. litestreamの概要 2. SQLiteのWALの仕組み 3. litestreamの仕組み 目次 4. まとめ
litestreamの概要 SQLiteの変更を, S3や Google Cloud Storage, NFSにレプリケーション してくれるソフトウェア - 障害が発生しても、Point In Time Recoveryで復旧できる アプリケーションとは独立したプロセスで動く - コードを変更する必要がない オブジェクトストレージ分だけのコスト - DBを使うが、ストレージの料金のみ
litestreamの概要 注意点 - あくまで、バックアップや障害時の復旧用途 - リードレプリカを作成するために使用するものではない - リードレプリカとして使用したい場合 liteFS という別のものを使った方が良い これは、consulで合意しつつ、fuseでマウントするもの fuse: Filesystem in Userspace
SQLiteのWALの仕組み SQLiteには、ジャーナルモードがある - デフォルトでは、 “delete” モードになっている - litestreamでは “wal” モードを使用 - litestreamを動かした段階で、自動的に “wal”モードに設定される PRAGMA journal_mode = wal; こうすると、 *-shm, *-wal というファイルが作成される。
SQLiteのWALの仕組み shmファイルは、共有メモリのファイルなので今回は割愛 データ書き込み時の流れ 1. トランザクション開始 2. INSERT,UPDATE,DELETEでデータ変更 3. commit 4. walファイルにデータを書き込む
SQLiteのWALの仕組み つまり、書き込んだ時点では、db本体と walファイルが両方残っている SQLiteへのプロセスが終了するとき、自分自身が最後の接続だったら walファイルを db本体に適用する (checkpointという) ※ ただし、walのサイズが大きくなったら、 checkpointするようになってる
SQLiteのWALの仕組み 実演
litestreamの仕組み shadow WAL 効率的にレプリケーションするため変更をすべて監視したい 1. litestreamのプロセスがreadトランザクションを貼り続けて、checkpointが 行われないようにする。 2. WALファイルを前回からの差分だけ shadowWALにコピーする 3. litestreamの任意のタイミングで checkpoint 処理を実施する
litestreamの仕組み ubuntu@primary:~/db$ find . . ./.db.sqlite3-litestream ./.db.sqlite3-litestream/generations ./.db.sqlite3-litestream/generations/35590037a56a98af ./.db.sqlite3-litestream/generations/35590037a56a98af/wal ./.db.sqlite3-litestream/generations/35590037a56a98af/wal/00000000.wal ./.db.sqlite3-litestream/generation ./db.sqlite3 ./db.sqlite3-wal ./db.sqlite3-shm
litestreamの仕組み snapshotとgeneration データベースをリストアするためには、特定のタイミングのDBの snapshotと、それに連続するwalファイルが必要 => generation litestreamがすべてのWALを追跡できなくなったら(litestreamが停止中 WALが書き込まれたとか)、新しいgeneration が作られる
litestreamの仕組み . ./generations ./generations/35590037a56a98af ./generations/35590037a56a98af/wal ./generations/35590037a56a98af/wal/00000000_00000000.wal.lz4 ./generations/35590037a56a98af/wal/00000001_00000000.wal.lz4 ./generations/35590037a56a98af/snapshots ./generations/35590037a56a98af/snapshots/00000000.snapshot.lz4
まとめ - litestreamは、SQLiteのDBを効率的にバックアップしてくれる - SQLiteのWALファイルの変更を litestreamはshadowWALとして コピーしている - snapshotとWALのリストをgenerationとして管理している - 何か問題が合ったときは、generationを新しくする - デフォルトでは1日に WALをフラッシュするために snapshotを 取得している