kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Redash を Backup & Restore する

サービスメトリクスを可視化するために Redash を導入しようと考えていて,可視化の部分だけじゃなく,運用面の調査もしていた.

まず Redash をどうやってバックアップするんだろう?と思って調べてみたら,公式ドキュメントに手順がまとまっていた.一言で言うと,Redash の内部で使っている PostgreSQL のバックアップを取得しておけば良いとのことだった.ただし,公式ドキュメントの手順だとバックアップを保管する部分の記載がなかったため,今回は S3 で保管できるように追加で対応をした.

Re:dash → Redash

余談で,正式名称は Re:dash → Redash に変更されているんだけど,案外知らない人が多いように思う.覚えておきましょ!

github.com

構成

シンプルに以下の構成にした.AWS の場合は AMI 経由でインスタンスを立ててしまうのが最も簡単だと思う.

f:id:kakku22:20170327230844j:plain

1. Redash Backup

まず,redash データベースのサイズを確認する.PostgreSQL の pg_database テーブルから取得できる.以下は Redash を起動して少し設定をした状態で確認した.

postgres=# select t1.datname AS db_name, pg_size_pretty(pg_database_size(t1.datname)) as db_size
postgres-# from pg_database t1
postgres-# where t1.datname = 'redash';
 db_name | db_size
---------+---------
 redash  | 7794 kB
(1 row)

次に pg_dump でバックアップを取得する.

$ sudo -u redash pg_dump redash | gzip > redash_backup.gz

簡単!

2. S3 Upload

日次バックアップを取得して S3 に保管するために,少し追加で準備をする.

まず Redash インスタンスに AWS CLI をインストールする.Amazon Linux ではなく Ubuntu だからインストールする必要がある.

$ sudo pip install --upgrade awscli

次に S3 バケットを作成して,IAM Role を EC2 にアタッチする.Action はもっと絞っても良いと思う.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1234567890123",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::xxx",
                "arn:aws:s3:::xxx/*"
            ]
        }
    ]
}

先月の新機能リリースで,既存の EC2 に IAM Role をアタッチできるようになったのは最高に便利だと思う.既に何度も助けられてる!

次に以下のようなスクリプトを用意して,crontab でスケジュール実行をすれば S3 に定期的に保管できる.ハウスキーピングなどは別途考える必要があると思う.

#!/bin/sh

sudo pip install --upgrade awscli

sudo -u redash pg_dump redash | gzip > redash_backup_$(date +%Y%m%d_%H%M%S).gz

backup="$(ls -1t | grep redash_backup | head -n 1)"

S3_BUCKET_NAME='xxx'

aws s3 cp ${backup} s3://${S3_BUCKET_NAME}/

3. Redash Restore

公式ドキュメントの手順通りにコマンドを実行したら正常にリストアすることができた.バックアップファイル名とパスワードは適宜変更してもらえればと!

$ sudo -u postgres -i

$ dropdb redash
$ createdb -T template0 redash
$ gunzip -c redash_backup_xxx_yyy.gz | psql redash

$ psql -c "ALTER ROLE redash_reader WITH PASSWORD 'xxx';"

$ psql -c "grant select(id,name,type) ON data_sources to redash_reader;" redash
$ psql -c "grant select(id,name) ON users to redash_reader;" redash
$ psql -c "grant select on events, queries, dashboards, widgets, visualizations, query_results to redash_reader;" redash

まとめ

  • 正式名称は Re:dash ではなく Redash に変更されている
  • Redash を運用するときは定期的にバックアップを取得しよう
  • リストアも一度は確認しておこう