tl;dr
YAMAP でも Elasticsearch を利用していますが, 最近になって以下のような貴重な体験をしたのでメモっておきます.
- シャードがノードに割り当てられずクラスターステータス Red が解消しない (Amazon Elasticsearch Service にて)
- CircleCI 上で Elasticsearch コンテナを起動しようとして心が折れそうになった
これらのエピソードは全て Elasticsearch 6.x バージョンでタイケンした内容となりますので, 最新の Elasticsearch 7.x では異なる結果となる場合がありますのでご了承のほど宜しくお願い致します.
そして, この記事は, YAMAP エンジニア Advent Calendar 2019 の 13 日目の記事になる予定です.
タ・イ・ケ・ン
シャードがノードに割り当てられない問題
ある日突然, Amazon Elasticsearch Service のクラスタステータスが Red に... なぜだ.
原因は特定に至ってはいませんが, 以下の Elasticsearch の仕様が関連している可能性があります.
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
の値を上書きすることで対処出来そうなのですが...
ドキュメントにも明記されています.
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 を動かそうとしています)
この掲示板を参考にして 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 を無理やり起動させるような形になります.
今回, CircleCI 上の Elasticsearch でやりたかったことは, mapping templete を登録して正しく登録出来るかを確認したいという限定的な目的だったので, とりあえず上記の対処でやりたいことは実現することは出来ました.
以上
最近, 自分が経験した Elasticsearch にまつわるお話でございました. 感じたのは, ほとんど Elasticsearch の公式ドキュメントを読めば納得的なお話でした. それだけ, Elasticsearch のドキュメントが充実しているってことなんだと思います. 感謝.