Open3

litestreamメモ

miyatakamiyataka

はじめに

これは個人用メモ.ほぼ公式チュートリアルから個人的に必要な部分を拾っているのみなので,ちゃんと公式読んだほうがよい
とはいえ参考になったらLIKEお願いします!

公式

miyatakamiyataka

litestreamチュートリアル

install

brew install benbjohnson/litestream/litestream

minIOのセットアップ(ローカルで動くs3互換サーバー)

docker run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"

起動したらlocalhost:9001にアクセスし,ログイン

Username: minioadmin
Password: minioadmin

Bucketを作成 mybkt

sqliteデータベースとレコードを作成

sqlite3 fruits.db
CREATE TABLE fruits (name TEXT, color TEXT);
INSERT INTO fruits (name, color) VALUES ('apple', 'red');
INSERT INTO fruits (name, color) VALUES ('banana', 'yellow');

データを確認するには下記のコマンド

sqlite3 fruits.db 'SELECT * FROM fruits'

litestreamを使って,データベースをminIOへreplicate

export LITESTREAM_ACCESS_KEY_ID=minioadmin
export LITESTREAM_SECRET_ACCESS_KEY=minioadmin

litestream replicate fruits.db s3://mybkt.localhost:9000/fruits.db

litestreamのプロセスはそのまま残したままにしておく
minIOコンソールでbucketを確認してdbが保存されていることを確認

別のターミナルを開き,minIOからrestoreできることを確認

export LITESTREAM_ACCESS_KEY_ID=minioadmin
export LITESTREAM_SECRET_ACCESS_KEY=minioadmin

litestream restore -o fruits2.db s3://mybkt.localhost:9000/fruits.db

sqlite3 fruits2.db 'SELECT * FROM fruits'

さらに別のターミナルを開き,継続的にreplicatesされていることを確認

まずはINSERTを実行

sqlite3 fruits.db

# sql
INSERT INTO fruits (name, color) VALUES ('grape', 'purple');

export LITESTREAM_ACCESS_KEY_ID=minioadmin
export LITESTREAM_SECRET_ACCESS_KEY=minioadmin

litestream restore -o fruits3.db s3://mybkt.localhost:9000/fruits.db

sqlite3 fruits3.db 'SELECT * FROM fruits'

fruits3にもgrapeが書き込まれている,つまり,継続的にsqliteがreplicateされていることを確認

miyatakamiyataka

litestreamをDockerで使うには

2パターンある

  • 別コンテナで実行するパターン(sidecarパターン)
  • 同一コンテナで実行するパターン

2つに共通する設定について

litestreamプロセスに渡す必要があるもの

  • credentials
    • LITESTREAM_ACCESS_KEY_ID
    • LITESTREAM_SECRET_ACCESS_KEY
  • dbファイルの場所(path)
  • s3の場所(URL)
    これらはlitestream.ymlとしてlitestreamに読み込ませることもできる

yamlとしては以下のような感じ.正確なものは公式referenceを見ること

# litestream.yml
access-key-id:     YOUR_ACCESS_KEY_ID
secret-access-key: YOUR_SECRET_ACCESS_KEY

dbs:
  - path: /data/db
    replicas:
      - url: s3://BUCKET/db

別コンテナで実行するパターン (sidecar)

docker run \
  -v /local/path/to/data:/data \
  -v /local/path/to/litestream.yml:/etc/litestream.yml \
  litestream/litestream replicate

同一コンテナで実行するパターン

litestream replicate -exec "myapp -myflag myarg"

# 上記をDockerfileのCMDとして設定してやればよさそう?

もしくは設定ファイルに以下のようにexec:を記載する

exec: myapp -myflag myarg
dbs:
  - path: /path/to/db