ようへいの日々精進XP

よかろうもん

俺と月刊 Elasticsearch 2019 年 12 月 〜 シャードがノードに割り当てられない問題 & CircleCI で Elasticsearch を動かそうとして苦労した 〜

tl;dr

YAMAP でも Elasticsearch を利用していますが, 最近になって以下のような貴重な体験をしたのでメモっておきます.

  • シャードがノードに割り当てられずクラスターステータス Red が解消しない (Amazon Elasticsearch Service にて)
  • CircleCI 上で Elasticsearch コンテナを起動しようとして心が折れそうになった

これらのエピソードは全て Elasticsearch 6.x バージョンでタイケンした内容となりますので, 最新の Elasticsearch 7.x では異なる結果となる場合がありますのでご了承のほど宜しくお願い致します.

そして, この記事は, YAMAP エンジニア Advent Calendar 2019 の 13 日目の記事になる予定です.

qiita.com

タ・イ・ケ・ン

シャードがノードに割り当てられない問題

ある日突然, Amazon Elasticsearch Service のクラスタステータスが Red に... なぜだ.

f:id:inokara:20191213001439p:plain

原因は特定に至ってはいませんが, 以下の Elasticsearch の仕様が関連している可能性があります.

www.elastic.co

Elasticsearch の仕様として, データノードはディスクの全ての容量は使い切ることをせず, デフォルトで 85% の使用量を超えるとシャードの割当を行わなくなるとのことです. おそらく, これが原因でシャードの割当が行われず, インデックスのステータスが Red となり, 結果としてクラスタのステータスも Red となってしまったと睨んでいます.

対処としては, ディスク容量を増やしてあげることで解決するのではと期待していますが, AWS サポートにも調査を依頼しており, 返答を待って対処を行いたいと考えています.

CircleCI 上で Elasticsearch コンテナを起動しようとして苦労した

以下のようなエラーとなって Elasticsearch コンテナが正常に起動せず苦労していました.

circleci@23a8111d6345:~$ docker logs project_elasticsearch_1
[2019-12-12T15:25:40,515][INFO ][o.e.n.Node               ] [] initializing ...

... 略 ...

ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2019-12-12T15:25:46,004][INFO ][o.e.n.Node               ] [SSnzaHT] stopping ...
[2019-12-12T15:25:46,036][INFO ][o.e.n.Node               ] [SSnzaHT] stopped
[2019-12-12T15:25:46,036][INFO ][o.e.n.Node               ] [SSnzaHT] closing ...
[2019-12-12T15:25:46,054][INFO ][o.e.n.Node               ] [SSnzaHT] closed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

このメッセージだけに着目すると, Elasticsearch コンテナを起動するホスト以下のように sysctl コマンドでカーネルパラメータの vm.max_map_count の値を上書きすることで対処出来そうなのですが...

www.elastic.co

ドキュメントにも明記されています.

sysctl -w vm.max_map_count=262144

CircleCI にてジョブを実行する環境で実行すると, 以下のような結果となりカーネルパラメータの上書きをすることが出来ませんでした.

circleci@18c3fee5ea2b:~$ sudo sysctl -w vm.max_map_count=262144
sysctl: setting key "vm.max_map_count": Read-only file system

CircleCI のサポート掲示板でも, 類似の議論が行われていました. (このスレッドでは Elasticsearch 5.x を動かそうとしています)

discuss.circleci.com

この掲示板を参考にして docker-compose.yml は以下のような内容になりました.

version: "3"

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4
    environment:
      - cluster.name=docker-cluster
      - "ES_JAVA_OPTS=-Xms128m -Xmx128m"
      - bootstrap.system_call_filter=false
      - transport.host=localhost
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200

根本的な解決ではなく, Elasticsearch が起動する際の Bootstrap Checks を無効にすることで, 先の vm.max_map_count が足りていない問題を握りつぶして Elasticsearch を無理やり起動させるような形になります.

www.elastic.co

今回, CircleCI 上の Elasticsearch でやりたかったことは, mapping templete を登録して正しく登録出来るかを確認したいという限定的な目的だったので, とりあえず上記の対処でやりたいことは実現することは出来ました.

以上

最近, 自分が経験した Elasticsearch にまつわるお話でございました. 感じたのは, ほとんど Elasticsearch の公式ドキュメントを読めば納得的なお話でした. それだけ, Elasticsearch のドキュメントが充実しているってことなんだと思います. 感謝.