🧩

LitestreamでSQLiteをS3にバックアップしてみた

2022/05/11に公開

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