Kuchitama Tech Note

はてな記法がいつまでたっても覚えられないので、はてなダイアリーからマークダウンが使えるこっちに引っ越してきました。

Docker上のRedashのバックアップとリストア手順

昨日の書いたエントリがホッテントリ入りしてて、喜ばしい限りです。

kuchitama.hateblo.jp

悲しい思いをしましたが、いく分か取り戻せた気がします。

今日は、昨日の反省を活かして、トラブルがあっても大丈夫なように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を用意しました。(実際には、更に外部ストレージにコピーしています)

redash_backup

リストア手順

何かあった時に Youtubeで中継することの無いよう、リストアの手順まできっちり用意します。 基本的に、昨日のエントリにあるとおり、Volume名をしていている前提で進めます。 Volume名を指定せずに運用している場合は、 docker-compose down して、 up して、データの流しこみを行えば問題ないと思います。

手順は下記の通り

  1. RedashのDockerコンテナを停止する
  2. PostgresのVolumeにつながったコンテナを起動
  3. テーブル削除&テーブル再作成
  4. バックアップデータの流し込み
  5. 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

f:id:kuchitama:20170405142923j:plain

補足

バックアップ用のスクリプトは、基本的に、JenkinsのJobとして、定期実行する前提で書いたので、 Docker Compose は使っていません。 Redashのディレクトリから手動で実行するのであれば、 docker ps より docker-compose ps を使ったほうがいいかも知れません。

PostgresのVolumeに名前をつけていない場合で、マウント中のVolumeを知りたいときは、 docker inspect が使えます。 情報量が多いので、jq を使って、絞り込みました。

docker inspect | jq -r .[].Mounts[].Name

読む予定の本

Docker入門

Docker入門

Docker

Docker