[未解決] BonsaiのReindexで "this cluster currently has [3000]/[3000] maximum shards open" とエラーがでる


解決したと思ったら再発するの繰り返しです。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で設定した方がいいのかもしれない。

User.rb
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