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
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る