概要
redis のダンプデータを docker 上で永続化する方法を検討します
環境
- macOS 10.14.4
- docker 18.09.2
- redis 5.0.3
特に何もしない状態では
とりあえずコンテナを起動してみます
docker run -d -p 6379:6379 redis
これでデータをセットして
redis-cli set a a
redis-cli get a
コンテナを再起動してみると
docker restart d33509295abd
実はデータが残っています
redis-cli get a
=> a
これはなぜかというとデフォルトで以下のパスに dump.rdb
がダンプされているからです
コンテナ停止時にちゃんとデータを吐き出してくれているようです
docker exec d33509295abd ls -ltr /data
ダンプの設定を確認する
redis-cli config get save
1) "save"
2) "3600 1 300 100 60 10000"
save の条件は 3 つほどあるようです
おそらくこれはデフォルトの Redis と同じはずです
redis-cli config get appendonly
1) "appendonly"
2) "no"
appendonly
はデフォルトでは無効のようです
redis-cli config set appendonly yes
と実行して書き換えることはできますが再起動すると no に戻ってしまいます
再起動しても yes にするには設定ファイルを直接書き換えるしかありません
redis.conf を使う方法
Dockerfile を作成するのが公式なやり方のようです
例えば以下のような感じでできます
vim /usr/local/etc/redis.conf
appendonly yes
dir /data
vim Dockerfile
FROM redis
RUN mkdir -p /usr/local/etc/redis/
RUN chown -R redis:root /usr/local/etc/redis/
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
docker build -t my_redis .
docker run -d -p 6379:6379 -v $(pwd):/data my_redis
redis-cli config get appendonly
1) "appendonly"
2) "yes"
上記は appendonly
を設定する方法ですが、こんな感じで独自の redis.conf
を使うことができます
当然コンテナを再起動しても appendonly
の設定は変わっていないことが確認できると思います
またマウントしたパスに appendonly.aof
があることも確認できると思います
単純に /data をホストでマウントする
もしコンテナが削除されてしまった場合は dump.rdb
もなくなってしまいます
それを回避する一番簡単な方法をコンテナホストで /data
をマウントすれば OK です
docker run -d -p 6379:6379 -v $(pwd):/data redis
redis-cli set a a
コンテナを作成して set コマンドを実行してみるとわかりますがコマンドを実行した直後にダンプファイルが作成されるわけではありません
コンテナが再起動や停止をするとダンプファイルが作成されます
docker restart 910f6ffcb975
ls -ltr
=> dump.rdb
この状態でコンテナを停止 -> 削除し再度コンテナを作成してもデータが存在することが確認できます
docker stop 910f6ffcb975
docker rm 910f6ffcb975
docker run -d -p 6379:6379 -v $(pwd):/data redis
redis-cli get a
=> a
マウントしたパスをクラウドストレージのファイルシステムでマウントする
では万が一コンテナホストがなくなってしまった場合はどうすればいいでしょうか
なくならないにしてもコンテナホストが起動できない状態になると大変です
そんな場合にはコンテナホストでマウントしたパスを更にクラウドストレージと連携しておくと安心です
gcsfuse を使った方法は過去に紹介しているので参考にしてください
https://hawksnowlog.blogspot.com/2019/05/gcsfuse-on-macos.html
最後に
docker + redis でデータを永続化する方法を考えてみました
データが飛んでもいいような単純なキャッシュであればここまで考える必要はないかなと思います
あと考慮しなければいけないのは Sentinel 環境かなと思います
Sentinel を使った場合も別記事で紹介できればなと思っています
0 件のコメント:
コメントを投稿