Redash の複数台構成化その3(worker を別インスタンスにする)
以下の記事の続きです。
前置き
前の記事の手順を実行し、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/.env
の REDASH_REDIS_URL
と REDASH_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.conf
の redash_server
の設定の中の autostart
と autorestart
をそれぞれ 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.conf
の redash_celery
と redash_celery_scheduled
の設定の中の autostart
と autorestart
をそれぞれ 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
のプロセスをさらに別インスタンスで起動し、詰まりがちなスケジュール実行をスケールアウトする方法を試してみる予定です。