解決したと思ったら再発するの繰り返しです。Qiitaには非公開に戻す機能が内容で、備忘録も兼ねて未解決のまま公開しておきます。詳しい人いたらコメントで教えてくれると嬉しいです。
Heroku、Rails、Elasticsearch、Bonsai、Searchkickという環境で
$ bundle exec rake searchkick:reindex CLASS=Use
# もしくは
$ bundle exec rake searchkick:reindex:all
としてReindexをしようとすると以下のようなエラーがでる。
this action would add [2] total shards, but this cluster currently has [3000]/[3000] maximum shards open
Shard(シャード:直訳で破片)というのはインデックスを分割したものらしく、通常はなにかのバックアップとして、メインで使うプライマリーシャードに対してレプリカシャードを作ったりするらしい。
しかしShardは3000どころか2しか使ってないとbonsaiに表示されてるんだが‥。
解決策①(別アプリで再発)
stagingとしている方で、bonsaiのConsoleでインデックスを削除してReindexしたら上手いった。
GET /_cat/indices
# もしくは
GET /_aliased/
# でインデックス名を確認し
DELETE /posts_production_xxxxxxxx
# で一度インデックスを削除してからReindexし直す
けどpuroductionで同様にしたらダメ‥。bonsaiを削除して入れ直してもダメ、heroku restart
してもダメだった‥。
解決策②(ただし別アプリで再発)
Bonsai が提供する Elasticsearch のバージョンが 7.2.0 で、Searchkickの最新版が依存するGemelasticsearch
のバージョンが 7.8.0 になっているからではと考えた(Gemfile.lockの中を elasticsearch で検索してバージョンが 7.8.0 になってたので気づいた)。
The latest version works with Elasticsearch 6 and 7
https://github.com/ankane/searchkick#getting-started
Searchkick - bonsai
https://docs.bonsai.io/article/99-searchkick
SearchkickのRead.meにも、bonsaiのドキュメントにもこのことは触れられていないが関係があるのでは?
elasticsearch のバージョンを 7.2.0 と明示的に指定して
# Gemfile
gem 'elasticsearch', '7.2.0' # ←追加
gem 'searchkick'
The bundle currently has elasticsearch locked at 7.8.0
と怒られたのでbundle update
した。
$ bundle update
Fetching elasticsearch-api 7.2.0 (was 7.8.0)
Installing elasticsearch-api 7.2.0 (was 7.8.0)
Fetching elasticsearch-transport 7.2.0 (was 7.8.0)
Installing elasticsearch-transport 7.2.0 (was 7.8.0)
Fetching elasticsearch 7.2.0 (was 7.8.0)
Installing elasticsearch 7.2.0 (was 7.8.0)
他のGemのバージョンも上げてしまったので、特定のGemだけをアップデートさせるbundle update elasticsearch
とした方が良かったかもしれない。
これをHerokuにプッシュしてReindexしたら上手くった。
$ git push heroku master
$ heroku run bundle exec rake searchkick:reindex:all
シャード数について
bonsaiをHerokuの管理画面から入れただけなので、今回レプリカシャードの指定をしていない。シャードが最大上限3000に達したというのは誤判定だろうが、bonsaiのドキュメントにあるようにnumber_of_replicas
をModelで設定した方がいいのかもしれない。
class User < ApplicationRecord
searchkick settings: { number_of_replicas: 0 }
end
その他
もしかするとProcfile経由でリリース時にReindexを自動実行しようとしたせいでこうなったのかもしれない。force push とかもしちゃっていたので‥。またstagingとproductionで解決した方法が違ったので、この2つのアプリに何か違いがあるのかも‥。
参考
shardの状態の確認コマンドはこちらが参考になった👇
https://swfz.hatenablog.com/entry/2015/07/22/040354