最近、Re:dashをちょくちょく使っています。
キャッシュ関連で気になったことがあったのでメモ。
Re:dashはクエリを毎回発行しなくてもいいように、結果をローカルのPostgreSQLにキャッシュして利用している。
長期運用してたり、リアルタイムにクエリを発行するようなSQLを書いてるとキャッシュが溜まっていってしまい、ディスクを圧迫していったので、この辺の問題を解決したいなと思って調べたら環境変数で設定できるようでした。
普段はdockerで立ち上げてるので、docker-composeに環境変数を書いていきます
docker-compose.ymlは公式のものからREDASH_QUERY_RESULT_CLEANUPの3つを追記しただけです。
ここで気をつけないといけないのは、実際にキャッシュを削除しているのはworkerなので、workerのところに書いてあげないといけません。serverのところに書いちゃうと動きません。
worker:
build: .
command: scheduler
environment:
PYTHONUNBUFFERED: 0
REDASH_LOG_LEVEL: "INFO"
REDASH_REDIS_URL: "redis://redis:6379/0"
REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
QUEUES: "queries,scheduled_queries,celery"
WORKERS_COUNT: 2
REDASH_QUERY_RESULTS_CLEANUP_ENABLED: "true"
REDASH_QUERY_RESULTS_CLEANUP_COUNT: 150
REDASH_QUERY_RESULTS_CLEANUP_MAX_AGE: 1
- REDASH_QUERY_RESULTS_CLEANUP_ENABLED
- キャッシュの削除を有効にするかどうか設定(defaultはfalse)
- REDASH_QUERY_RESULTS_CLEANUP_COUNT
- 古いキャッシュを何件ずつ削除するかを設定
- REDASH_QUERY_RESULTS_CLEANUP_MAX_AGE
- 過去何日経ったキャッシュを削除するかを設定
今回、僕がdocker-composeに書いた設定だと
1日前のキャッシュを150件ずつ削除するようになっています。
実際にどこで消しているのか?
worker.py - GetRedash/redash でworkerが5分置きにredash.tasks.cleanup_query_results
を叩くようになっている。
つまり、1日前のキャッシュを5分おきに150件消すようになっていて
10分で300件消すことになる。
で、実際のタスクはここ cleanup_query_results() - GetRedash/redash
cleanup_query_resultの中身まではまだ読めてないけど、
5分おきにworkerがキャッシュを消してるのが分かったので良かった。