📊

Redashでクエリの結果の出力がされない、Refresh Schemaができない時

2023/08/03に公開

背景

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についてまた一つ勉強になりました!
ここまでお読みいただき、ありがとうございます!

参考:https://tech.timee.co.jp/entry/2020/04/20/175821

D2C m-tech

Discussion