Redash の複数台構成化その3(worker を別インスタンスにする)

以下の記事の続きです。

ariarijp.hatenablog.com

前置き

前の記事の手順を実行し、Redash と PostgreSQL、Redis をそれぞれ別インスタンスで動作させる環境ができていることを前提とします。

worker を別インスタンスにする

worker のインスタンスをセットアップする

worker インスタンスは server インスタンスと同様、Redash の Ubuntu 用 bootstrap スクリプトで Redash を導入した状態になっているものとし、PostgreSQL、Redis インスタンスにそれぞれ接続できるようになっていることを前提とします

  • プライベート IP 192.168.33.11

Redash のバージョンについて

worker を別インスタンス化するには、server と同じバージョンの Redash をインストールする必要があります。

初期構築時に server と worker を分ける場合はそれほど問題にならないと思いますが、ある程度一台構成で Redash を稼働させた状態から複数台にする場合は、最新バージョンとの差異が問題になることもあります。

その場合、既存環境を最新にアップグレードしてから複数台構成にするなどの対応が必要となりますが、この記事ではアップグレード手順などについては割愛します。

不要なサービスを停止する

nginx, PosgreSQL, Redis は使用しないので、以下のコマンドで停止し、自動起動も無効にします。

$ sudo systemctl stop postgresql && sudo systemctl disable postgresql
$ sudo systemctl stop redis && sudo systemctl disable redis
$ sudo systemctl stop nginx && sudo systemctl disable nginx

Redash の設定を変更する

server インスタンスと同様に、worker インスタンス/opt/redash/.envREDASH_REDIS_URLREDASH_DATABASE_URL を以下のように変更します。

export REDASH_REDIS_URL=redis://192.168.33.101:6379/0
export REDASH_DATABASE_URL="postgresql://redash:redash@192.168.33.100/redash"

supervisor の設定を変更する

最後に、supervisor の設定を変更します。

worker インスタンスでは、server を起動する必要がないので、 /etc/supervisor/conf.d/redash.confredash_server の設定の中の autostartautorestart をそれぞれ false にします。

[program:redash_server]
command=/opt/redash/current/bin/run gunicorn -b 127.0.0.1:5000 --name redash -w 4 --max-requests 1000 redash.wsgi:app
directory=/opt/redash/current
process_name=redash_server
user=redash
numprocs=1
autostart=false
autorestart=false

/etc/supervisor/conf.d/redash.conf を変更したら、Redash と supervisor の設定を適用するため、supervisord を再起動します。

$ sudo systemctl restart supervisor

再起動を完了したら、 ps コマンドなどで Redash 関連のプロセスが Celery のみ起動されていることを確認しましょう。

これで worker の設定は完了です。

server のインスタンスの設定を変更する

worker インスタンスCelery が動作するようになったので、server インスタンスでは Celery を動作させないようにします。

/etc/supervisor/conf.d/redash.confredash_celeryredash_celery_scheduled の設定の中の autostartautorestart をそれぞれ false にします。 、

[program:redash_celery]
command=/opt/redash/current/bin/run celery worker --app=redash.worker --beat -c2 -Qqueries,celery --maxtasksperchild=10 -Ofair
directory=/opt/redash/current
process_name=redash_celery
user=redash
numprocs=1
autostart=false
autorestart=false

[program:redash_celery_scheduled]
command=/opt/redash/current/bin/run celery worker --app=redash.worker -c2 -Qscheduled_queries --maxtasksperchild=10 -Ofair
directory=/opt/redash/current
process_name=redash_celery_scheduled
user=redash
numprocs=1
autostart=false
autorestart=false

/etc/supervisor/conf.d/redash.conf を変更したら、設定を適用するため、supervisord を再起動します。

再起動を完了したら、 ps コマンドなどで Celery のプロセスが起動されていないことを確認しましょう。

動作確認

ここまでの設定が完了したら、 Redash の画面上でクエリを実行してみます。

クエリが実行できれば、worker の別インスタンス化は完了です。

まとめ

Redash の worker プロセスを別インスタンスで実行する方法を紹介しました。

Redash のミドルウェア構成を把握することができればそれほど難しくない対応ですが、大規模なデータを扱いたい場合や、クエリのキューがつまりがちな環境では、今回紹介したような方法で worker を別インスタンス化することで問題を解消できることがあると思います。

しかし、サーバ管理の手間は増えるため、ひとつのインスタンスに全部のせ担っている標準的な構成でスケールアップやミドルウェアや Redash のチューニングに限界を感じた場合の選択肢の一つ。として考えるぐらいが個人的には良いと思います。

次回は、この記事から少し派生した設定として、 redash_celery_scheduled のプロセスをさらに別インスタンスで起動し、詰まりがちなスケジュール実行をスケールアウトする方法を試してみる予定です。