Docker上のRedashのバックアップとリストア手順
昨日の書いたエントリがホッテントリ入りしてて、喜ばしい限りです。
悲しい思いをしましたが、いく分か取り戻せた気がします。
今日は、昨日の反省を活かして、トラブルがあっても大丈夫なようにRedashのPostgresデータのバックアップとリストアの手順をまとめます。
ちゃんとリストアの手順までまとめておかないとね!!
でないと、実況Youtubeをするはめになる… (実際昨日は @kiy0taka さんと、 @irof さんに実況しないのって煽られてました)
例によってDocker上で運用している前提です。 AWSとかGCP上で運用しているなら、こちらのドキュメントに従えば多分大丈夫だと思います。
バックアップ手順
ホストOSのシェルで、下記のコマンドを実行すれば、バックアップファイルが手に入ります。
$ cid=`docker ps | grep redash_postgres | awk '{print $1}'`
$ docker exec ${cid} /bin/bash -c 'pg_dump -U postgres postgres | gzip > /usr/local/redash_backup.gz'
$ docker cp ${cid}:/usr/local/redash_backup.gz redash_backup.gz
たまたま、ホストマシンとして使ってる Mac mini にJenkinsがインストール済みだったので、Jenkinsで定期的に実行できるように、↓の Pipeline Scriptを用意しました。(実際には、更に外部ストレージにコピーしています)
リストア手順
何かあった時に Youtubeで中継することの無いよう、リストアの手順まできっちり用意します。
基本的に、昨日のエントリにあるとおり、Volume名をしていている前提で進めます。
Volume名を指定せずに運用している場合は、 docker-compose down して、 up して、データの流しこみを行えば問題ないと思います。
手順は下記の通り
- RedashのDockerコンテナを停止する
- PostgresのVolumeにつながったコンテナを起動
- テーブル削除&テーブル再作成
- バックアップデータの流し込み
- Redashを起動して動作確認
1. RedashのDockerコンテナを停止する
コンテナが稼働中であれば、一旦止めてしまいます
$ docker-compose -f docker-compose.production.yml donw --remove-orphans
2. PostgresのVolumeにつながったコンテナを起動
$ docker run -d -v redash_postgres_data:/var/lib/postgresql/data -p 5432:5432 postgres:9.3
# Docker のcontainer id を確認
$ cid=`docker ps | grep postgres | awk '{print $1}'`
$ echo ${cid}
ecd9564a3315
3. テーブル削除&テーブル再作成
# コンテナの IPアドレスを取得
$ dbip=`docker inspect {コンテナID} | jq .[].NetworkSettings.IPAddress`
$ echo ${dbip}
172.17.0.2
$ psql -h ${dbip} -U postgres template1
psql (9.5.6)
Type "help" for help.
template1=# DROP DATABASE IF EXISTS postgres;
DROP DATABASE
template1=# CREATE DATABASE postgres;
CREATE DATABASE
template1=# \q
4. バックアップデータの流し込み
docker cp でホストマシン上にあるバックアップファイルを、コンテナにコピーして、流し込みます。
$ docker cp redash_backup.gz {コンテナID}:/usr/local/redash_backup.gz
$ docker exec -t {コンテナID} /bin/bash -c 'zcat /usr/local/redash_backup.gz | psql -U postgres -d postgres'
5. Redashを起動して動作確認
$ docker-compose -f docker-compose.production.yml up -d

補足
バックアップ用のスクリプトは、基本的に、JenkinsのJobとして、定期実行する前提で書いたので、 Docker Compose は使っていません。
Redashのディレクトリから手動で実行するのであれば、 docker ps より docker-compose ps を使ったほうがいいかも知れません。
PostgresのVolumeに名前をつけていない場合で、マウント中のVolumeを知りたいときは、 docker inspect が使えます。
情報量が多いので、jq を使って、絞り込みました。
docker inspect | jq -r .[].Mounts[].Name
読む予定の本

- 作者: 末安泰三
- 出版社/メーカー: ソーテック社
- 発売日: 2016/12/20
- メディア: Kindle版
- この商品を含むブログを見る

- 作者: Adrian Mouat,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/08/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る