---
title: [SQLite] litestreamの仕組み
tags:  #lifull #db #sqlite  
author: [株式会社LIFULL](https://www.docswell.com/user/LIFULL)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/KJ494QG571.jpg?width=480
description: SQLiteをレプリケーションするlitestreamの仕組み
published: April 12, 24
canonical: https://www.docswell.com/s/LIFULL/51JLEE-2024-04-12-164910
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/KJ494QG571.jpg)

[SQLite] litestreamの仕組み
プラットフォームG 宮崎泰輔


# Page. 2

![Page Image](https://bcdn.docswell.com/page/LE1K4PD2JG.jpg)

1. litestreamの概要
2. SQLiteのWALの仕組み
3. litestreamの仕組み
目次
4. まとめ


# Page. 3

![Page Image](https://bcdn.docswell.com/page/GEWDX2Y2J2.jpg)

litestreamの概要
SQLiteの変更を, S3や Google Cloud Storage, NFSにレプリケーション
してくれるソフトウェア
- 障害が発生しても、Point In Time Recoveryで復旧できる
アプリケーションとは独立したプロセスで動く
- コードを変更する必要がない
オブジェクトストレージ分だけのコスト
- DBを使うが、ストレージの料金のみ


# Page. 4

![Page Image](https://bcdn.docswell.com/page/47ZG6DX4E3.jpg)

litestreamの概要
注意点
- あくまで、バックアップや障害時の復旧用途
- リードレプリカを作成するために使用するものではない
-
リードレプリカとして使用したい場合
liteFS という別のものを使った方が良い
これは、consulで合意しつつ、fuseでマウントするもの
fuse: Filesystem in Userspace


# Page. 5

![Page Image](https://bcdn.docswell.com/page/YJ6Y214G7V.jpg)

SQLiteのWALの仕組み
SQLiteには、ジャーナルモードがある
- デフォルトでは、 “delete” モードになっている
- litestreamでは “wal” モードを使用
- litestreamを動かした段階で、自動的に “wal”モードに設定される
PRAGMA journal_mode = wal;
こうすると、 *-shm, *-wal というファイルが作成される。


# Page. 6

![Page Image](https://bcdn.docswell.com/page/GJ5G24QXJ4.jpg)

SQLiteのWALの仕組み
shmファイルは、共有メモリのファイルなので今回は割愛
データ書き込み時の流れ
1. トランザクション開始
2. INSERT,UPDATE,DELETEでデータ変更
3. commit
4. walファイルにデータを書き込む


# Page. 7

![Page Image](https://bcdn.docswell.com/page/LE3RKGV475.jpg)

SQLiteのWALの仕組み
つまり、書き込んだ時点では、db本体と walファイルが両方残っている
SQLiteへのプロセスが終了するとき、自分自身が最後の接続だったら
walファイルを db本体に適用する (checkpointという）
※ ただし、walのサイズが大きくなったら、 checkpointするようになってる


# Page. 8

![Page Image](https://bcdn.docswell.com/page/8EDY3185EG.jpg)

SQLiteのWALの仕組み
実演


# Page. 9

![Page Image](https://bcdn.docswell.com/page/V7P64Q8DJ8.jpg)

litestreamの仕組み
shadow WAL
効率的にレプリケーションするため変更をすべて監視したい
1. litestreamのプロセスがreadトランザクションを貼り続けて、checkpointが
行われないようにする。
2. WALファイルを前回からの差分だけ shadowWALにコピーする
3. litestreamの任意のタイミングで checkpoint 処理を実施する


# Page. 10

![Page Image](https://bcdn.docswell.com/page/2JV3X5NGEQ.jpg)

litestreamの仕組み
ubuntu@primary:~/db$ ﬁnd .
.
./.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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/5EG3V65D7L.jpg)

litestreamの仕組み
snapshotとgeneration
データベースをリストアするためには、特定のタイミングのDBの
snapshotと、それに連続するwalファイルが必要 =&gt; generation
litestreamがすべてのWALを追跡できなくなったら(litestreamが停止中
WALが書き込まれたとか）、新しいgeneration が作られる


# Page. 12

![Page Image](https://bcdn.docswell.com/page/4JQ564ZX7P.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/K7494Q32E1.jpg)

まとめ
- litestreamは、SQLiteのDBを効率的にバックアップしてくれる
- SQLiteのWALファイルの変更を litestreamはshadowWALとして
コピーしている
- snapshotとWALのリストをgenerationとして管理している
- 何か問題が合ったときは、generationを新しくする
- デフォルトでは1日に WALをフラッシュするために snapshotを
取得している


