🧩
LitestreamでSQLiteをS3にバックアップしてみた
Litestream はSQLite向けのストリーミング・レプリケーション・ツールです。
インクリメンタルにファイルシステムやS3のようなオブジェクトストレージにレプリケートします。
Hello Worldとして、Ubuntu上のSQLiteをAmazon S3にレプリケートし、リストアするところまでを動作確認します。
環境
- Litestream v0.3.8
- OS : Ubuntu 22.04 x86_64(Amazon EC2のAMIを利用)
- ストレージ : Amazon S3
SQLiteをインストール
$ sudo apt install sqlite3
初期データを投入します。
$ sqlite3 ~/fruits.db
sqlite> CREATE TABLE fruits (name TEXT, color TEXT);
sqlite> INSERT INTO fruits (name, color) VALUES ('apple', 'red');
sqlite> INSERT INTO fruits (name, color) VALUES ('banana', 'yellow');
sqlite> select * from fruits;
apple|red
banana|yellow
sqlite>
AWS の設定
S3リソース
レプリケート先のS3バケットを作成します。
IAMリソース
SQLiteのWALをAmazon S3にレプリケートするために、S3の更新権限のある IAM ユーザーを作成し、アクセスキーを発行します。
IAMポリシーとして、ざっくり検証したいときは、AWSマネージドの AmazonS3FullAccess
ポリシーを、最小の権限を付与したいときは、以下の様なポリシーを作成して与えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::<BUCKET>"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<BUCKET>/*",
"arn:aws:s3:::<BUCKET>"
]
}
]
}
Litestreamをインストール
LitestreamをDebianパッケージからインストールします。
$ wget https://github.com/benbjohnson/litestream/releases/download/v0.3.8/litestream-v0.3.8-linux-amd64.deb
$ sudo dpkg -i litestream-v0.3.8-linux-amd64.deb
/etc/litestream.yml
にサービス起動時に利用する設定ファイルがあります。
# AWS credentials
# access-key-id: AKIAxxxxxxxxxxxxxxxx
# secret-access-key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxx
# dbs:
# - path: /path/to/primary/db # Database to replicate from
# replicas:
# - path: /path/to/replica # File-based replication
# - url: s3://my.bucket.com/db # S3-based replication
$
この設定ファイルをコメントアウトし、環境に合わせて書き換えます。
# AWS credentials
access-key-id: AKIAxxxxxxxxxxxxxxxx
secret-access-key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxx
dbs:
- path: /home/ubuntu/fruits.db # Database to replicate from
replicas:
- url: s3://YOUR-BUCKET-NAME/litestream # S3-based replication
sync-interval: 1s
Systemd サービスをスタートします。
$ sudo systemctl enable litestream
$ sudo systemctl start litestream
Litestreamのストリーミング・レプリケーションは WAL ジャーナルモードでのみ動作します。
journal_mode PRAGMA
がデフォルトの DELETE
から WAL
に変わっていることを確認します。
$ sqlite3 fruits.db 'PRAGMA journal_mode'
wal
$ ls -1 fruits.db*
fruits.db # database file
fruits.db-shm # WAL index
fruits.db-wal # WAL file
しばらく放置し、S3 にWALファイルがレプリケートされていることを確認します。
$ aws s3 ls s3://YOUR-BUCKET-NAME/litestream/ --recursive
2022-05-10 09:28:45 418 litestream/generations/c51ab0cdadbcbd29/snapshots/00000000.snapshot.lz4
2022-05-10 09:28:46 483 litestream/generations/c51ab0cdadbcbd29/wal/00000000_00000000.wal.lz4
2022-05-10 09:29:46 119 litestream/generations/c51ab0cdadbcbd29/wal/00000001_00000000.wal.lz4
2022-05-10 09:33:11 118 litestream/generations/c51ab0cdadbcbd29/wal/00000001_00001038.wal.lz4
2022-05-10 09:33:12 119 litestream/generations/c51ab0cdadbcbd29/wal/00000002_00000000.wal.lz4
2022-05-10 09:33:19 126 litestream/generations/c51ab0cdadbcbd29/wal/00000002_00001038.wal.lz4
2022-05-10 09:34:12 119 litestream/generations/c51ab0cdadbcbd29/wal/00000003_00000000.wal.lz4
リストア
最後に、S3 オブジェクトからデータベースをリストアします。
$ litestream restore -o restored.db s3://YOUR-BUCKET-NAME/litestream
$ sqlite3 restored.db 'select * from fruits'
apple|red
banana|yellow
めでたしめでたし。
Discussion