全力で怠けたい

怠けるために全力を尽くしたいブログ。

Redash のバックアップとリストアのメモ。

サービスの運営で Redash を使っていて運営メンバーは結構カジュアルにクエリとかいじってもらっているので、バックアップとリストアといった運用上必須なところをどうしているかをメモしておく。

はじめに

Redash は 公式の AMI を使って AWS 上に構築しているのでそれ前提で書く。 とはいっても 公式ドキュメント のバックアップ手順は sudo -u redash pg_dump redash | gzip > backup_filename.gz と書いてあるので、ようは Redash が内部で使っている PostgreSQL のバックアップを取得しておけばよい。 同じように、Redash をリストアするときは PostgresSQL のバックアップを Redash が内部で使っている PostgresSQL に流し込めばよい。

バックアップ

バックアップは以下のようなスクリプトを Docker ホスト (= Redash の AMI の EC2 インスタンス) の cron で動かしていて、gzip 圧縮した PostgreSQL のバックアップファイルは S3 へ保管している。

#!/bin/sh

# PostgreSQL のコンテナ ID を取得
CID=$(sudo docker container ls | grep redash_postgres | awk '{print $1}')

# PostgreSQL をバックアップ
sudo docker container exec ${CID} /bin/bash -c 'pg_dump -U postgres postgres | gzip > /usr/local/redash-backup.gz'

# PostgreSQL のバックアップファイルを PostgreSQL コンテナからホスト (EC2) へ持ってくる
sudo docker container cp ${CID}:/usr/local/redash-backup.gz redash-backup.gz

# S3 へ保管
aws s3 cp redash-backup.gz s3://<バケット名>

リストア

リストアは以下のようなスクリプトredash-restore.sh redash-backup.gz のように実行して、スクリプトがエラーなく終わればブラウザから Redash に接続して動作を確認する。

リストアの手順自体は難しいところはないけどそれなりにコマンドを打つし自分は絶対間違えるのでスクリプト化している。

#!/bin/sh

set -x

if [ $# -lt 1 ]; then
    echo 'usage: redash-restore.sh <backup>'
    exit 1
fi
BACKUP_PATH=$(readlink --canonicalize $1)
if [ ! -f ${BACKUP_PATH} ]; then
    echo "${BACKUP_PATH} not exists."
    exit 1
fi

# Redash 公式 AMI は設定ファイルやボリュームは /opt/redash/ にある
DOCKER_COMPOSE_YML=/opt/redash/docker-compose.yml

# Redash 絡みのコンテナを一旦止める
sudo docker-compose --file ${DOCKER_COMPOSE_YML} down --remove-orphans

# PostgreSQL のバックアップを流し込む先の PostgreSQL コンテナを動かす
sudo docker container run -d -v /opt/redash/postgres-data:/var/lib/postgresql/data -p 5432:5432 postgres:9.5.6-alpine

# PostgreSQL のバックアップファイルをホスト (EC2) から PostgreSQL コンテナへ持っていく
CID=$(sudo docker container ls | grep postgres | awk '{print $1}')
sudo docker container cp ${BACKUP_PATH} ${CID}:/usr/local/redash-backup.gz

# Redash のデータベースを削除 & 再作成
sudo docker container exec ${CID} /bin/bash -c 'psql -c "drop database if exists postgres" -U postgres template1'
sudo docker container exec ${CID} /bin/bash -c 'psql -c "create database postgres" -U postgres template1'

# バックアップを PostgreSQL へ流し込む
sudo docker container exec ${CID} /bin/bash -c 'zcat /usr/local/redash-backup.gz | psql -U postgres -d postgres'

# バックアップの流し込みに使った PostgreSQL のコンテナはもう使わないので止める
sudo docker container stop ${CID}
sudo docker container rm ${CID}

# Redash 絡みのコンテナを動かす
sudo docker-compose --file ${DOCKER_COMPOSE_YML} up --detach

参考ページ

まとめ

いまのところは Redash のクエリやダッシュボードのバックアップは PostgreSQL のバックアップで十分に事足りているが、バックアップとは別に Redash 特にクエリの変更履歴は管理したいなーと思っているので、そっちも調べて運用に取り込んでいきたい。