2019年5月14日火曜日

docker + redis でデータのバックアップを考える

概要

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 件のコメント:

コメントを投稿