今日はRedash Advent Calendar 16日目ですが、この記事はAdvent Calendarの記事ではありません。
12/16の記事はvankobeさんによる、Redashの結果をGoogleスプレッドシートで扱う事例の記事です。
Redashの便利さと、その裏にあるつらみ
Redashを活用しはじめて1年半ほど経ちますが、今ではRedashなしで業務が回らなくなるほどに使い倒しています。
しかし、Redashの活用が進んだことによって「Redashが落ちたら全てが止まる」といった状況になりつつあることも事実で、たまにRedashの収容サーバーからアラートが飛んでくると、背筋が凍る思いをしています。
それだけでなく、Redashの利点でもある「誰でもクエリを実行・編集できる」というのが、運用上問題になることも何度か経験してきました。
この記事ではRedashのクエリのバックアップについて、自作のツール redashman
の宣伝もしつつ紹介していきます。
Redashのバックアップ
ざっくりですが、すぐ思いつくバックアップ方法は以下の2つと考えています。
- Redashインスタンスのディスクイメージのスナップショットを取得する
- Redashの管理DB(PostgreSQL)のDBバックアップを取得する
構成にもよりますが、ディスクイメージのバックアップはIaaSを使っていれば、もっとも簡単かつ安心できる方法かと思います。
管理DBのバックアップは、バックアップスクリプトや保存先を用意する必要がありますが、PostgreSQLについて少し知識があれば簡単に実現できる方法と言えます。
上記のように、ディスクやデータベースの単位でバックアップをとっておくことは運用上重要なことですが、「クエリ」のバックアップについても考えてみます。
Redashは誰でも気軽にクエリを実行・編集することができる一方で、悪意の有無に関わらず、誤ってクエリを編集してしまい、クエリが実行できなくなってしまうことが考えられます。
しかし、先に紹介したディスクやデータベースによるバックアップは「クエリ」のバックアップという点で考えるとリストアの手間もあり、少し大げさに感じる部分があります。
redashman
について
現在、私は redashman
という自作のツールを用いて、Redashのクエリを定期的にバックアップしています。
Redashを管理するので redashman
という名前にしましたが、なぜか青いロボットが針に当たってティウンティウンする光景が目に浮かんだかたは個別にご連絡ください。私はX4が好きです。
このツールはクエリの一覧、取得、作成などをCLIから実行するためのツールとして作成しましたが、その中にクエリの定義を取得するものがあるので、それを使ってクエリをバックアップしています。
インストール
redashman
はGoで書いたので、go get
で簡単にインストールできます。
$ go get -u github.com/ariarijp/redashman
redashman
を使用したクエリのお手軽バックアップ
redashman
自体の使い方についてはREADMEを参照していただくとして、付属のPythonスクリプトを使用してバックアップをしてみます。
$ mkdir redash_backup $ cd redash_backup $ cp $GOPATH/src/github.com/ariarijp/redashman/scripts/backup_queries.py ./ $ export REDASH_URL=http://localhost $ export REDASH_API_KEY="Redashのadmin権限があるユーザーのAPIキー" $ python ./backup_queries.py $ ls -la backup total 48 drwxr-xr-x 8 ariarijp wheel 272 12 16 14:34 . drwxr-xr-x 4 ariarijp wheel 136 12 16 14:34 .. -rw-r--r-- 1 ariarijp wheel 23 12 16 14:34 0001.sql -rw-r--r-- 1 ariarijp wheel 51 12 16 14:34 0002.sql -rw-r--r-- 1 ariarijp wheel 89 12 16 14:34 0003.sql -rw-r--r-- 1 ariarijp wheel 83 12 16 14:34 0004.sql -rw-r--r-- 1 ariarijp wheel 89 12 16 14:34 0005.sql $ cat backup/0001.sql SELECT * FROM country;
これでクエリのバックアップを取得することができるようになりました。
定期的にバックアップし、変更履歴も残す
定期的にバックアップをするには、もう一手間かける必要があります。
そのために、以下のスクリプトを backup.sh
として保存し、実行権限を与えておきます。
#!/bin/bash export REDASH_URL=http://localhost export REDASH_API_KEY="Redashのadmin権限があるユーザーのAPIキー" cd `dirname $0` if [ ! -d '.git' ]; then git init fi python backup_queries.py git add . && git ci -a -m `date '+%Y%m%d%H%M%S'`
これを実行すると、先ほどのPythonスクリプトでクエリのバックアップを取得し、そのファイルがGitリポジトリにコミットされます。
$ ./backup.sh Initialized empty Git repository in /private/tmp/redash_backup/.git/ [master (root-commit) 820ae32] 20171216144840 8 files changed, 49 insertions(+) create mode 100755 backup.sh create mode 100644 backup/0001.sql create mode 100644 backup/0002.sql create mode 100644 backup/0003.sql create mode 100644 backup/0004.sql create mode 100644 backup/0005.sql create mode 100644 backup_queries.py
このスクリプトを cron
などを使って適当な間隔で定期実行すれば、クエリのバックアップを定期的に、かつ、Gitを使用することで履歴とタイムスタンプ付きで保存することができるようになります。
まとめ
Redashの気軽さを維持しつつ、redashman
でクエリを定期的にバックアップすることで、クエリを誤って編集してしまったなどのトラブルに対処できるようになり、副産物としてクエリの編集履歴もGitという多くの開発者の手に馴染んだツールで管理できるようになります。
Redashの利用をこれから検討している方にも、ぜひ redashman
の導入を検討してみてほしいです。
宣伝
id:kakku22 と私の主催で、ハンズオン形式のRedash Meetup #0 を12/19(火)に開催しますが。ありがたいことにキャンセル待ちが出ています。
ハンズオンイベントについては来年1月に再演を計画していますので、今回予定が合わなかったり、キャンセル待ちから繰り上がらなかった方も、改めて参加を検討していただけるとうれしいです。
また、今後はハンズオンイベントではなく、各社の導入事例を成功も失敗も含めて共有できるような企画も検討しておりますので、Redashに興味があるかたは、よろしければConnpassのRedash Meetupグループに参加してみてください。
このグループに参加していると、次回のハンズオンも含め、今後のイベント日程もチェックしやすくなると思います。