Redashでクエリの結果の出力がされない、Refresh Schemaができない時
背景
D2Cのデータサイエンティスト(MLエンジニア)の須田です。
D2Cでは社内用の機械学習を伴う分析・開発のプラットフォームにおいて、 Redashというツールを
Amazon EKS(以下、EKS)上で運用していました。(※現在は諸事情によりAmazon ECSで動かしています)
EKSでの運用当時、Redashでクエリの結果の出力がされない、Refresh Schemaができないという現象があり、トラブルシュートを行いました。この経験を誰かに役立ててもらえるように、今回はその原因と解決方法について共有いたします。
Redashの仕組み(社内の分析プラットフォーム上※トラブルシュート当時)
- Redash Server:クエリリクエストの受け取り、クエリ結果の表示、クエリキューの送信
- Redash Redis:クエリキューの管理
- Redash Sucheduled Worker:スケジューリングされているクエリのキューの監視、処理(athenaにさばく)
- Redash Adhoc Worker:アドホックにリクエストされたクエリのキューの監視、処理(athenaにさばく)
原因
クエリのリクエストをキューを処理するRedisとキュー監視しているScheduler/Workerが正常に連携できていなかった
先日EKSクラスターアップデートでNodegroupの更新をしたことで全てのPodが再起動となった
→redisのPodは新しくPodが作成された場合の固定passwordが設定されておらず、その場合だとrandomで新しいpasswordが設定されるようになっていた
解決方法
Schedule/Worker, Redash-ServerのPodの再起動をすることで新しいpasswordを使ってRedisと連携できるようにした
- 前提として、パスワードはSecrets Managerに格納して、環境変数経由で受け取って設定している。そのためRedisのパスワードが新しくなった場合はWorker/ServerのPodを再起動し新しいパスワードでの認証ができるようにする必要があった
対策
externalRedisSecretでRedisのパスワードを明示的に設定する
社内分析プラットフォーム上のRedashはHelmというEKSで使用できる便利なパッケージを使用しています。
その使用しているHelmのChartsのValuesを確認するとexternalRedisSecretでRedisのパスワードが明示的に指定できることがわかります。
トラブル発生時はパスワード設定がデフォルトになっており、Redisが新しくなった場合はrandomでpassword生成されるようになっていました(enabledの下に書いてあります)
# externalRedisSecret -- Read external Redis configuration from a secret. This should point at a secret file with a single key which specifies the connection string.
externalRedisSecret:
{}
# name: redash-redis
# key: connectionString
## Configuration values for the redis dependency. This Redis instance is used by default for caching and temporary storage [ref](https://github.com/kubernetes/charts/blob/master/stable/redis/README.md)
redis:
# redis.enabled -- Whether to deploy a Redis server to satisfy the applications database requirements. To use an external Redis set this to false and configure the externalRedis parameter.
enabled: true
# redis.password -- If the password is not specified, a random password will be generated (when redis chart enabled)
# password:
# redis.databaseNumber -- Redis database number to use (when redis chart enabled)
databaseNumber: 0
master:
# redis.master.port -- Redis master port to use (when redis chart enabled)
port: 6379
cluster:
# redis.databaseNumber -- Enable Redis clustering (when redis chart enabled)
enabled: false
明示的にパスワードを指定していれば、RedisのPodが更新されてもpasswordは変わらず今回のようなトラブルは起こらないはずです。
さいごに
今回のトラブルシュートを通してRedash/Redisについてまた一つ勉強になりました!
ここまでお読みいただき、ありがとうございます!
株式会社D2C d2c.co.jp のテックブログです。 D2Cは、NTTドコモと電通などの共同出資により設立されたデジタルマーケティング企業です。 ドコモの膨大なデータを活用した最適化を行える広告配信システムの開発をしています。
Discussion